博客搬家:最爱午后红茶
在谈论大数乘法前,先来看看多项式乘法,假设
A = 7x^3 + 5x^2 + 3x + 4
B = 4x^2 + 6
C = A * B
那传统的做法就是这样:
7x^3 + 5x^2 + 3x + 4
4x^2 + 6
---------------------------------------
+42x^3 + 30x^2 + 18x + 24
28x^5 + 20x^4 +12x^3 + 16x^2
-----------------------------------------------------------
28x^5 + 20x^4 + 54x^3 + 46x^2 + 18x + 24
若A 和 B 都有 n 个系数,很明显这样做的时间复杂度为O(n^2),当n很大时效果相当不理想
像 B = 4x^2 + 6 这样的式子叫系数表示法;如果我们把 B 一般化,即 B = b0 + b1x + b2x^2;则我们至少需要 3 对 (x, y) 值才能求出 b0, b1, b2。这里 b0 = 6, b1 = 0, b2 = 4;例如 B 在x0 = 1, x1 = 2, x2 = 3 的情况下的解分别为 y0 = 10, y1 = 22, y2 = 42。那我们也可以用 {(1, 10),(2, 22),(3, 42)},即 {(x0, y0),(x1, y1),(x2, y2)} 来表示唯一的多项式B,即假如我们在不知道b0, b1, b2的情况下可以用{(1, 10),(2, 22),(3, 42)} 来唯一表示多项式B,即唯一确定b0, b1, b2。当然 x0, x1, x2 也可以取其他值,但对于这个例子一定要取够3个,因为有3个未知数 b0, b1, b2;对应的 y0, y1, y2 也会不同,这就叫点值表示法。
为什么要这样做?还是上面那个例子,我们用点值表示法算一遍C = A * B,(A 和 B 的xi要对应相同)还是假设取x0 = 1, x1 = 2, x2 = 3,我们发现 A 有4个未知数,所以要多一个x3,假设x3 = 4;为了方便计算,我们把 B 的 (x3, y3) 也算出来。
A = {(1, 19),(2, 86),(3, 247),(4, 544)}
B = {(1, 10),(2, 22),(3, 42),(4, 70)}
xi 不变,yi对应相乘得到 Ci = (xi, yai * ybi)
C = {(1, 190),(2, 1892),(3, 10374),(4, 38080)}
到这里我们发现对于一般情况的等长度的两个多项式相乘,结果的长度会接近加倍,比如
A = a0 + a1x + a2x^2 + a3x^3
B = b0 + b1x + b2x^2 + b3x^3
C = A * B = c0 + c1x + c2x^2 + c3x^3 + c4x^4 + c5x^5 + c6x^6
因此有n个系数的两个多项式相乘(比如A * B)时仅用其n个点值相乘是不能正确表示结果的(比如C),所以我们要使用足够多的点值,比如这里 A 和 B 都应该至少使用7个点值。如下(数有点大,偷下懒。。。)
A = {(x0, y0),(x1, y1),(x2, y2),(x3, y3),(x4, y4),(x5, y5),(x6, y6)}
B = {(x0, y0'),(x1, y1'),(x2, y2'),(x3, y3'),(x4, y4'),(x5, y5'),(x6, y6')}
C = {(x0, y0*y0'),(x1, y1*y1'),(x2, y2*y2'),(x3, y3*y3'),(x4, y4*y4'),(x5, y5*y5'),(x6, y6*y6')}
这样C的点值才能表示唯一的6次多项式(7个未知系数有6次幂),最后,用某方法(重点下面讲)把C的点值表示法转换成系数表示法就达到了目的,这个过程叫插值
所以,先理下思路
1)分别计算A、B足够多的点值(也叫求值