0

I have to calculate following two mathematical formula in C programming language.

  1. result = 48^108 // 108 should be 103
  2. result%143 =9

To calculate this two equation I need some data type whose range is large enough.

I know the end result of equation 2 is 9. However, I did not get this answer after using several datatypes.

Here are some of my implementations.

1. #include <stdio.h>
#include<math.h>
int main()
{
     unsigned int a1=48,a2=103,a3, a4;
    a3= pow(48,103);
    printf("a3=%u",a3);
    a4= a3 % 143;
    printf("\n a4=%u",a4);
    return 0;
}

 Answer That I got:
 warning: overflow in conversion from ‘double’ to ‘unsigned int’ changes value from ‘1.4717954286441339e+173’ to ‘4294967295’ [-Woverflow]
   15 |     a3= pow(48,103);
      |         ^~~
a3=4294967295
 a4=47

2. int main()
{
    unsigned long a1=48,a2=103,a3, a4;
    a3= pow(48,103);
    printf("a3=%lu",a3);
    a4= a3 % 143;
    printf("\n a4=%lu",a4);
    return 0;
}


warning: overflow in conversion from ‘double’ to ‘long unsigned int’ changes value from ‘1.4717954286441339e+173’ to ‘18446744073709551615’ [-Woverflow]

15 | a3= pow(48,103); | ^~~ a3=18446744073709551615 a4=16

3. #include <stdio.h>
#include<math.h>

int main()
{
    long double a1=48,a2=103,a3, a4;
    a3= pow(48,103);
    printf("a3=%LF",a3);
    a4= fmod(a3,143);
    printf("\n a4=%LF",a4);
    return 0;
}

a3=147179542864413390695231668723836254417826202083285489645297997883519171141486480221363409432872885235091123842885421688012169987663834748443552551569845821059256315786821632.000000

a4=46.000000

Which data type should I use to handle the situation?

I apologies for my wrong equation on equation 1. It is 103 not 108. and if I use 103 the answer is 9.

Thank you for all your comments and process.

Encipher
  • 1,370
  • 1
  • 14
  • 31
  • 3
    You're going about this the wrong way. Use Euler's method for modular exponentiation. Look it up. I am assuming here that you don't actually want the full number, and you are only interested in the value of `48^108 mod 143` – paddy Apr 01 '22 at 05:52
  • Yes I am interested in the end result. – Encipher Apr 01 '22 at 06:07
  • When 48 raised to the power of 108 is divided by 143, the remainder is 53, not 9. Why do you think it is 9? – Eric Postpischil Apr 01 '22 at 11:30
  • [Modular Exponentiation](https://en.wikipedia.org/wiki/Modular_exponentiation) fascinating maths. – जलजनक Apr 01 '22 at 12:49
  • @EricPostpischil Actually, this code block is a small portion of RSA algorithm. Where plain text = 9. After calculation encryption over plain text the result is 48. 48 is the encrypted message. So to decrypt the 48, the formula is, encrypted_msg^103 mod 143. As per RSA algorithm encrypted_msg^103 mod 143 should return me back 9. – Encipher Apr 01 '22 at 17:01
  • You had 108, not 103, for the exponent. I edited to fix that. – Eric Postpischil Apr 01 '22 at 17:13
  • Yeah I realized that after run the program by myself. I am sorry. – Encipher Apr 01 '22 at 17:16

2 Answers2

2

The remainder of 48103 modulo 143 is easily calculated by decomposing the exponent into powers of two and keeping all the intermediate values reduced modulo 143, as illustrated in the following code. (This is not necessarily the method that uses the fewest arithmetic operations.)

#include <stdio.h>


int main(void)
{
    //  Set x, y, and m for which we will compute x**y modulo m.
    unsigned x = 48, y = 103, m = 143;

    /*  r starts at the remainder of x**0 modulo m and is updated to be
        remainders of x raised to various powers as we compute them.
    */
    unsigned r = 1;

    /*  p will be the remainder of x modulo m, then of x**2 modulo m, then of
        x**4, x**8, x**16, and so on.  e will track this exponent, first, 1,
        then 2, then 4, 8, 16, and so on.

        For each bit that is set in y, say the bit representing 16, we will
        multiply r by the corresponding power (modulo m).  Thus, if y is 49 = 1
        + 16 + 32, we will multiply r by x**1, x**16, and x**32, all modulo m.
        This forms x**1 * x**16 * x**32 = x**(1+16+32) = x**49.  In general,
        the result will be x**y modulo m.

        e and p start at 1 and x, as described above.

        The loop continues as long as e is within the bits set in y, hence e <=
        y.

        In each iteration, we double e to move it to the next bit value
        position and we square p.  The squaring is done modulo m.

        Whenever e corresponds to a bit that is set in y ("y & e" is true), we
        multiply the current power in p by r and reduce the product modulo m.
     */
    for (unsigned e = 1, p = x; e <= y; e <<= 1, p = p*p % m)
        if (y & e)
            r = r*p % m;

    printf("%u\n", r);
}
Eric Postpischil
  • 195,579
  • 13
  • 168
  • 312
0

There is no such datatype in C language to store such a large number. You can use a formula that can directly give the answer to your equation.

rio
  • 11
  • 3
  • This is true, but so bare of details that you cannot expect it to be considered helpful. – Yunnosch Apr 01 '22 at 06:55
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Apr 01 '22 at 07:02