c – 计算没有溢出的* a mod n

我需要计算一个* a mod n,但是a相当大,当我对它进行平方时会导致溢出.执行((a%n)*(a%n))%n不起作用,因为(n-1)2可能溢出.这是在C中,我使用的是int64_t

编辑:

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

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

编辑2:

不,这些数字没有模式.

解决方法:

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

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

上一篇:java – 将任意大小的byte []转换为BigInteger [],然后安全地转换回完全相同的byte [],任何线索?


下一篇:java – 如何将String转换为BigInteger?