7

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

我有两个数字 A 和 B,unsigned long longs,数量级最多为 10^10 左右,但即使这样做((A%M)*(B%M))%M,我也会得到整数溢出。

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

4

1 回答 1

9

如果模数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它就会变得难看。

于 2012-11-20T00:41:40.883 回答