如何以最高效的方式计算乘积?
a1 b2 c3 d4 e5 ...
假设平方运算的成本约为乘法成本的一半,操作数少于100个。
如果乘法时间与操作数长度的平方成正比(例如java.math.BigInteger
),是否也有简单的算法呢?
第一个(也是唯一的)答案在操作次数方面非常完美。
有趣的是,当应用于相当大的BigInteger
时,这一部分根本无关紧要。甚至没有任何优化的计算abbcccddddeeeee大约需要相同的时间。
大部分时间都花费在最后的乘法上(BigInteger
没有实现类似Karatsuba、Toom-Cook或FFT这样的更智能的算法,因此时间复杂度为二次)。重要的是确保中间乘积的大小大致相同,即给定大约相同大小的数字p、q、r、s,计算(pq)(rs)通常比计算((pq)r)s更快。对于数十个操作数,速度比大约为1:2。
更新
在Java 8中,BigInteger
中有Karatsuba和Toom-Cook乘法。