Karatsuba Multiplication
给定大数x和y,取两者二进制长度最大值n,将大数分成二进制长度为k = ceil(n/2)的两部分,这样一直减半下去,当大数二进制长度减少到32位以下时直接返回乘积,最后再对每部分的结果进行调整即可得最终乘积。
假设x1,y1表示大数前半部分,x0,y0表示大数后半部分则
x = x1*2^k + x0
y = y1*2^k + y0
xy = (x1*2^k + x0)(y1*2^k + y0) = z2*2^2k + z1*2^k + z0
其中
z2 = x1y1
z0 = x0y0
z1 = (x1 + x0)(y1 + y0) - z2 - z0
/// <summary>
/// <see cref="BigInteger"/> multiplication using Karatsuba algorithm
/// </summary>
public static BigInteger Karatsuba(BigInteger left, BigInteger right)
{
var xLen = left.GetByteCount() << 3;
var yLen = right.GetByteCount() << 3;
var len = Math.Max(xLen, yLen);
if (len <= 32) return left * right;
var half = (len + 1) >> 1;
var x1 &#