Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 特殊模乘算法_C_Algorithm_Math_Modular Arithmetic - Fatal编程技术网

C 特殊模乘算法

C 特殊模乘算法,c,algorithm,math,modular-arithmetic,C,Algorithm,Math,Modular Arithmetic,我有3个大的64位数字:A、B和C。我想计算: (A x B) mod C 考虑到我的寄存器是64位的,即写入a*b实际上产生(a x b)mod 2⁶⁴. 最好的方法是什么?我用C语言编写代码,但不认为这种语言与本例相关 在获得指向此解决方案的评论的投票后: (a * b) % c == ((a % c) * (b % c)) % c 让我具体说明一下:这不是一个解决方案,因为((a%c)*(b%c))可能仍然大于2⁶⁴, 登记簿还是会溢出,给我错误的答案。我会: ((A型C)x(B型C

我有3个大的64位数字:A、B和C。我想计算:

(A x B) mod C
考虑到我的寄存器是64位的,即写入
a*b
实际上产生(a x b)mod 2⁶⁴.

最好的方法是什么?我用C语言编写代码,但不认为这种语言与本例相关


在获得指向此解决方案的评论的投票后:

(a * b) % c == ((a % c) * (b % c)) % c
让我具体说明一下:这不是一个解决方案,因为((a%c)*(b%c))可能仍然大于2⁶⁴, 登记簿还是会溢出,给我错误的答案。我会:

((A型C)x(B型C))2型⁶⁴) C型


正如我在评论中指出的,Karatsuba的算法可能会有所帮助,但仍然存在一个问题,需要单独的解决方案

假定


A=(A1
(A*B)%C
它工作……还是不工作?@GrijeshChauhan
A*B
在C中溢出(N位数字乘以N位数字,理想情况下应该是2N位数字,但在C中算术不是这样工作的),所以你不能只使用这个被截断的产品。添加了
C
标签,我相信
C
人们可以帮助你更好地看到第二个答案(由KennyTM提供)-这涉及到将长整数拆分为两个短整数,将64位操作数转换为一组32位操作数显示?A1*B1可以再次达到2^64,因此即使将其移位1,也会丢失数据。它们不能,它们都<2^32。那又怎样?它们<2^32,它们的乘积<2^64,如果移位,它很容易溢出。正确。但我们我们可以提前检查,如果我们溢出,我们知道它正好是1位。假设我们每次移动1位。1位溢出是已知值,我们甚至知道它是mod C的多少。@aragaer我可能遗漏了它,但是除法/模呢,一旦计算出A和B的乘积,你建议怎么做?