现在考虑一个类似的问题:两个n位的数相乘。例2-4是这个乘法的一个实现,采用小学使用的很简单的算法。
例2-4:Java的乘法实现mult
同样地,我们也会给出一个变形算法:alt,这个算法消除了取模运算的高开销,并且避开了当n1[m]等于0时不必要的内层计算(注意,alt算法没有在这里描述,但是能够在提供的代码库中找到)。alt算法包含了203行Java代码来避免使用两个取模操作。那么这个变形算法在有额外的开销时,能够节省总体的开销吗?
表2-4给出了这些乘法算法的性能,所处理的数据是在描述加法算法时使用的随机生成数据。图2-6描绘了性能的图形,抛物曲线是二次方算法的典型标志。
图 2-6 比较mult和alt虽然alt变种的速度能够快大概40%,但是alt和mult展现了相同的渐进性能。mult2n/multn的比率大约是4,证明了乘法的性能是二次方的。让我们定义一个t(n),表示乘法算法在输入规模为n的时候的实际运行时间。根据这个定义,肯定存在一些常数c(c>0),使得t(n)≤c*n2,对于所有的n>n0来说。我们不需要c和n0的实际值是多少,只需要知道它们肯定存在即可。在我们平台上运行的这个mult算法实现,我们设c为1.2,n0为64。
再次说明,改变算法的实现来提高效率是不可能超越算法本身固有的二次方性能的。但是,存在其他的算法(Zuras,1994)使得n位数相乘的速度能够快于二次方。在数据加密这样的需要大量频繁的大数乘法应用中,这种算法是非常重要的。