溢出:a*a mod n

Wha*_*ame 8 c++ biginteger modulo

我需要计算a*amod n但是a相当大,当我对它进行平方时会导致溢出.这样做((a % n)*(a % n)) % n行不通,因为(N-1)2可以溢出.这是用C++编写的,我使用的是int 64.

编辑:示例值= 821037907258和n = 800000000000,如果您将其平方,则会溢出.

我正在使用DevCPP,我已经尝试过让大整数库工作无效.

编辑2:不,这些数字没有模式.

Oli*_*rth 15

如果您不能使用大整数库,并且您没有本机uint128_t(或类似),则需要手动执行此操作.

一种选择是表示a两个32位量的总和,即a = 2 32 b + c,其中b包含32个msbs,c包含32个lbs.然后,平方是一组四次交叉乘法; 每个结果都保证适合64位类型.然后在重新组合各个术语时进行模运算(仔细考虑重新调整所有内容所需的转换).

  • @WhatsInAName基本上,Oli告诉你实施长乘法和长除法,就像你上小学一样. (3认同)
  • @Mysticial 我很确定他们不会在小学教位移位和模块化算术。请尽量减少讽刺。这显然不是我要问的。 (2认同)

Alb*_*rto -3

您可以自己实现乘法,每次运行添加n,并立即对结果进行修改。

  • 你知道他说的是超过 40 亿的数字,对吧?这就是 64 位整数溢出所需要的...... (3认同)