我有3个64位大数字:A,B和C。我要计算:
(A x B) mod C
考虑到我的寄存器是64位的,即a * b实际写入的结果为(A x B)mod2⁶⁴。
a * b
最好的方法是什么?我使用C语言进行编码,但在这种情况下,认为该语言无关。
在对指向该解决方案的评论进行投票之后:
(a * b) % c == ((a % c) * (b % c)) % c
让我具体一点:这不是解决方案,因为((a%c)*(b%c))可能仍然大于2⁶⁴,寄存器仍然溢出并给我错误的答案。我会:
((((A mod C)x(B mod C))mod2⁶⁴)mod C
正如我在评论中指出的那样,唐津算法可以提供帮助。但是仍然存在一个问题,需要一个单独的解决方案。
承担
A =(A1 << 32)+ A2
B =(B1 << 32)+ B2。
当我们乘以它们时,我们得到:
A * B =(((A1 * B1)<< 64)+((A1 * B2 + A2 * B1)<< 32)+ A2 * B2。
因此,我们有3个要累加的数字,其中一个肯定大于2 ^ 64,另一个可能更大。
但这可以解决!
无需一次移位64位,我们可以将其拆分为较小的移位,并在每次移位时进行模运算。结果将是相同的。
如果C本身大于2 ^ 63,这仍然是一个问题,但是我认为即使在这种情况下也可以解决。