Skip to content

数值计算

Karatsuba 乘法

假定 位数,不妨假定 是偶数,那么 可以拆成两个部分。 那么 其中 那么可以再省去一次乘法。

Karatsuba 就是根据上述的性质来实现乘法的。整个算法是递归的。

如果 n == 1,那么直接计算 x * y 并返回。

否则按照之前的描述分别拆成 a, bc, d 两个部分。分别计算 ac = a * c bd = b * d,为了方便描述中间部分,引入一些变量,p = a + b, q = c + d,那么 adbc = p * q - ac - bd。那么最终结果是 pow(10, n) * ac + pow(10, n / 2) * adbc + bd

具体实现可以参考 BigInteger.cc

Strassen 矩阵乘法

假定 是两个 的矩阵,乘积 ,第 行第 列的值是 最朴素的算法就是对 遍历,三层 for 循环,时间复杂度是

下面考虑分治法,将 拆成四个 的小矩阵 那么 需要递归的调用八次矩阵乘法,算法的复杂度仍旧是

如果我们能够省去一次递归调用,那么性能的提升不仅仅是 12.5%。这就是 Strassen 矩阵乘法的巧妙之处。首先执行七次递归调用 那么 下面验证各个递归调用