C++ 有没有一种方法可以使(a*B)mod M对无符号long a和B没有溢出?
我不想在Windows上安装GMP的噩梦 我有两个数字A和B,C++ 有没有一种方法可以使(a*B)mod M对无符号long a和B没有溢出?,c++,numbers,overflow,C++,Numbers,Overflow,我不想在Windows上安装GMP的噩梦 我有两个数字A和B,unsigned long longs,数量级最多为10^10左右,但即使在执行((A%M)*(B%M))%M时,也会出现整数溢出 对于较大的数字,是否有用于计算(A*B)%M的自制函数?如果模数M比ULLONG_MAX小得多(如果是在10^10的区域内),可以通过将其中一个因子分成两部分,分三步进行计算。我假设A
unsigned long long
s,数量级最多为10^10左右,但即使在执行((A%M)*(B%M))%M
时,也会出现整数溢出
对于较大的数字,是否有用于计算
(A*B)%M
的自制函数?如果模数M
比ULLONG_MAX
小得多(如果是在10^10的区域内),可以通过将其中一个因子分成两部分,分三步进行计算。我假设A
和B
,和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;
//将A拆分为多个部分
无符号长a1=(A>>21),a2=A&(1 M的数量级是多少?基本上是M*M溢出?是的,差不多。样本数:9030460994 x 9030460994 mod 12*10^9=>溢出我可以想出一种方法(但不是很有效)通过递归使用同余。您也可以使用OpenSSL和各种BN_*\uWord
函数轻松实现这一点。