一尘不染

特定的模块化乘法算法

algorithm

我有3个64位大数字:A,B和C。我要计算:

(A x B) mod C

考虑到我的寄存器是64位的,即a * b实际写入的结果为(A x B)mod2⁶⁴。

最好的方法是什么?我使用C语言进行编码,但在这种情况下,认为该语言无关。


在对指向该解决方案的评论进行投票之后:

(a * b) % c == ((a % c) * (b % c)) % c

让我具体一点:这不是解决方案,因为((a%c)*(b%c))可能仍然大于2⁶⁴,寄存器仍然溢出并给我错误的答案。我会:

((((A mod C)x(B mod C))mod2⁶⁴)mod C


阅读 195

收藏
2020-07-28

共1个答案

一尘不染

正如我在评论中指出的那样,唐津算法可以提供帮助。但是仍然存在一个问题,需要一个单独的解决方案。

承担

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,这仍然是一个问题,但是我认为即使在这种情况下也可以解决。

2020-07-28