how to find muliplication of large numbers modulo 100000007

后端 未结 3 1801
我寻月下人不归
我寻月下人不归 2020-12-17 08:05

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 m

相关标签:
3条回答
  • 2020-12-17 08:44

    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

    0 讨论(0)
  • 2020-12-17 08:45

    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?

    0 讨论(0)
  • 2020-12-17 08:49

    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 (I.e. when A > C and/or B > C).

    0 讨论(0)
提交回复
热议问题