繁体   English   中英

对于无符号长A和B,有没有办法(A * B)mod M没有溢出?

[英]Is there a way to do (A*B) mod M without overflow for unsigned long long A and B?

我不想在Windows上安装GMP的噩梦。

我有两个数字A和B, unsigned long long s,大约10 ^ 10左右,但即使做((A%M)*(B%M))%M ,我得到整数溢出。

是否有自制函数用于计算较大数字的(A*B)%M

如果模数M远小于ULLONG_MAX (如果它在10 ^ 10的范围内就是这种情况),则可以通过将两个因子中的一个分成两部分来分三步完成。 我假设A < MB < M ,且M < 2^42

// split A into to parts
unsigned long long a1 = (A >> 21), a2 = A & ((1ull << 21) - 1);
unsigned long long temp = (a1 * B) % M;   // doesn't overflow under the assumptions
temp = (temp << 21) % M;                  // this neither
temp += (a2*B) % M;                       // nor this
return temp % M;

对于较大的值,您可以将因子分成三个部分,但如果模数真的接近ULLONG_MAX则变得难看。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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