您的位置:首页 > 其它

大数相乘的算法(instructed by Western University Prof.Schost)

2013-09-13 06:03 633 查看
一、Karatsuba算法主要应用于两个大数的相乘,原理是将大数分成两段后变成较小的数位,然后做3次乘法,并附带少量的加法操作和移位操作。

现有两个大数,x,y。

首先将x,y分别拆开成为两部分,可得x1,x0,y1,y0。他们的关系如下:

x = x1 * 10m + x0;

y = y1 * 10m + y0。其中m为正整数,m < n,且x0,y0 小于 10m。

那么 xy = (x1 * 10m + x0)(y1 * 10m + y0)

=z2 * 102m + z1 * 10m + z0,其中:

z2 = x1 * y1;

z1 = x1 * y0 + x0 * y1;

z0 = x0 * y0。

此步骤共需4次乘法,但是由Karatsuba改进以后仅需要3次乘法。因为:

z1 = x1 * y0+ x0 * y1

z1 = (x1 + x0) * (y1 + y0) - x1 * y1 - x0 * y0,

故x0 * y0 便可以由加减法得到。

例子:

设x = 12356,y=6789,令m=3。那么有:

12345 = 12 * 1000 + 345;

6789 = 6 * 1000 + 789。

下面计算:

z2 = 12 * 6 = 72;

z0 = 345 * 789 = 272205;

z1 = (12 + 345) * (6 + 789) - z2 - z0 = 11538。

然后我们按照移位公式(xy = z2 * 10 + z1 * 10 + z0)可得:

xy = 72 * 10002 + 11538 * 1000 + 272205 = 83810205。

算法的复杂度不超过3nlog3 ≈
3n1.585。

伪代码:

二、 Toom's algorithm

对于以上的F, G

F,G中x的最高次数是k-1,H=FG, H中x的最高次数就是2k-2;(k是F,G中因子的项数)

Evaluation.

f0 = f(0) g0 = g(0)

f0 + f1 = f(1) g0 + g1 = g(1)

f1 = f(1) g1 = g(1)

Multiplication. After the products, we know

h(0) = f(0)g(0)

h(1) = f(1)g(1)

h(00) = f(00)g(00)

Interpolation.

h = h(0) + (h(1)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 numbers