C++ 有没有一种方法可以使(a*B)mod M对无符号long 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

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

我有两个数字A和B,
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
函数轻松实现这一点。