简体   繁体   中英

how to find muliplication of large numbers modulo 100000007

As we know 1000000007 is a large prime number. How can I find multiplication of two large numbers modulo 1000000007

For example if I want to find 78627765*67527574 mod 1000000007, how can I do it.

At least if anyone tell me the procedure I shall try

Note: pls let me know the solution with primitive datatypes like int,long or long long Thanks in advance

Modulo chaining works with reasonable numbers that are pushing the limits of your numerical comp-space:

(A * B) % C == ((A % C) * (B % C)) % C.

The proof for this is pretty straight forward and there are literally thousands of examples on cryptography websites all over the world. A simple sample:

(7 * 8) % 5 = 56 % 5 = 1

and

((7 % 5) * (8 % 5)) % 5 = (2 * 3) % 5 = 6 % 5 = 1

I hope this helps. Obviously when A and B are already pushed to your top-end platform limits and are still smaller than C, it gets pointless, but it can be very handy when this is not the case (Ie when A > C and/or B > C).

Since this looks like a homework or context problem, I will only give hints.

If you know x%m and y%m, how can you find (x+y)%m? If you know x%m, how can you find (2x)%m?

Since you want to find (a*b)%m, is there a way you can decompose b so that you can use the above two hints?

Why don't you want to use 64-bit arithmetic for that ? Of course this only works if the operands being multplied do not exceed 32 bits each (but this can also be fixed). Consider:

typedef unsigned long long uint64;
uint64 m = 1000000007UL;
uint64 r = (uint64)a * (uint64)b;
r = r % m; // get the residue

One can also optimize it to avoid '%' which might be expensive:

double inv = 1.0 / 1000000007UL; // precompute inverse
uint64 r = (uint64)a * (uint64)b;
uint64 rf = (uint64)floor((double)a * (double)b * inv); // floor(a * b / m) 
r = r - rf * m; //  residue

Note that the second method may require some playing around with accuracy. You can also use 'long double' instead

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM