给定三个整数 ,a
和b
withc
我a,b <= c < INT_MAX
需要计算(a * b) % c
,但a * b
如果值太大会溢出,这会给出错误的结果。
有没有办法通过bithacks直接计算这个,即不使用不会溢出有问题的值的类型?
给定三个整数 ,a
和b
withc
我a,b <= c < INT_MAX
需要计算(a * b) % c
,但a * b
如果值太大会溢出,这会给出错误的结果。
有没有办法通过bithacks直接计算这个,即不使用不会溢出有问题的值的类型?
这里并不真正需要 Karatsuba 的算法。只需拆分一次操作数就足够了。
假设为简单起见,您的数字是 64 位无符号整数。设 k=2^32。然后
a=a1+k*a2
b=b1+k*b2
(a1+k*a2)*(b1+k*b2) % c =
a1*b1 % c + k*a1*b2 % c + k*a2*b1 % c + k*k*a2*b2 % c
现在a1*b1 % c
可以立即计算,其余的可以通过交替执行32x <<= 1
或x %= c
64 次来计算(因为 (u*v)%c=((u%c)*v)%c)。如果c >= 2^63
. 然而,好消息是这对操作不需要按字面意思执行。要么x < c/2
然后你只需要一个班次(并且没有溢出),或者x >= c/2
和
2*x % c = 2*x - c = x - (c-x).
(并且没有再次溢出)。
一些主要的编译器提供 128 位整数类型,您可以使用它进行此计算而不会溢出。