【FFT&NTT入门】大整数乘法

问题:给定两个大整数 A A A B B B A A A B B B 的长度为 n n n m m m,求 A A A B B B 的乘积

1. 朴素做法

思考小学数学中两个数的乘法列竖式的方式,对于 B B B 的每一位,分别乘上 A A A 的每一位,得到的结果相加。

23 × 456 23\times 456 23×456 为例:

23 × 456 = 6 × 3 + 6 × 20 + 50 × 3 + 50 × 20 + 400 × 3 + 400 × 20 = 18 + 120 + 150 + 1000 + 1200 + 8000 = 10488 \begin{aligned} 23\times 456 &= 6\times 3 + 6\times 20+50\times 3+50\times 20+400\times 3+400\times 20\\ &= 18+120+150+1000+1200+8000 \\ &= 10488 \end{aligned} 23×456=6×3+6×20+50×3+50×20+400×3+400×20=18+120+150+1000+1200+8000=10488

如此需要进行 2 × 3 2\times 3 2×3 次乘法以及 2 × 3 − 1 2\times 3 - 1 2×31 次加法。

对于到长度为 n n n 的数 A A A 和长度为 m m m 的数 B B B ,则需要进行 n × m n\times m n×m 次乘法和 n × m − 1 n\times m-1 n×m1 次加法

如此时间复杂度为: O ( n m ) O(nm) O(nm),不妨设 m ≤ n m\leq n mn,则时间复杂度为 O ( n 2 ) O(n^2) O(n2)

2. 快速傅里叶变换

上述的朴素做法时间复杂度过高,当两者长度都达到 1 0 5 10^5 105 级别时,就很难快速得到两个大整数的乘积了。

2.1 求解思想

2.1.1 大整数转换为多项式

考虑将两个大整数转换成多项式:

A ( x ) = a 0 + a 1 x + a 2 x 2 + ⋯ + a n − 1 x n − 1 A(x)=a_0+a_1x+a_2x^2+\cdots+a_{n-1}x^{n-1} A(x)=a0+a1x+a2x2++an1xn1 B ( x ) = b 0 + b 1 x + b 2 x 2 + ⋯ + b m − 1 x m − 1 B(x)=b_0+b_1x+b_2x^2+\cdots+b_{m-1}x^{m-1} B(x)=b0+b1x+b2x2++bm1xm1

以上多项式的表示称为多项式的系数表示法

23 × 456 23\times 456 23×456 为例:

a 0 = 3 , a 1 = 2 a_0=3,a_1=2 a0=3,a1=2 A ( x ) = 3 + 2 x A(x)=3+2x A(x)=3+2x

b 0 = 6 , b 1 = 5 , b 2 = 4 , B ( x ) = 6 + 5 x + 4 x 2 b_0=6,b_1=5,b_2=4, B(x)=6+5x+4x^2 b0=6,b1=5,b2=4,B(x)=6+5x+4x2

可以看出:

23 23 23 可以转换为 a 0 = 3 , a 1 = 2 a_0=3,a_1=2 a0=3,a1=2 的多项式, A ( 10 ) = 23 A(10)=23 A(10)=23

456 456 456 可以转换为 b 0 = 6 , b 1 = 5 , b 2 = 4 b_0=6,b_1=5,b_2=4 b0=6,b1=5,b2=4 的多项式,当 B ( 10 ) = 456 B(10)=456 B(10)=456

那么 A ( 10 ) × B ( 10 ) A(10)\times B(10) A(10)×B(10) 即为 23 × 456 23\times 456 23×456 的结果

问题转换成了求解两个多项式 A ( x ) A(x) A(x) B ( x ) B(x) B(x) 的乘积

C ( x ) = A ( x ) × B ( x ) = c 0 + c 1 x + c 2 x 2 + ⋯ + c n + m − 2 x n + m − 2 C(x)=A(x)\times B(x) = c_0+c_1x+c_2x^2+\cdots + c_{n+m-2}x^{n+m-2} C(x)=A(x)×B(x)=c0+c1x+c2x2++cn+m2xn+m2

c k = ∑ i + j = k a i × b j c_k=\sum\limits_{i+j=k} a_i\times b_{j} ck=i+j=kai×bj

c k c_k ck 的过程也称为卷积,整体的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

2.1.2 多项式的点值表示法

上述将大整数转换为多项式的系数表示法进行多项式的计算,时间复杂度仍未改进。

事实上,多项式还有另外一种表示法,即点值表示法。

我们思考一条直线 y = k x + b y=kx+b y=kx+b,如果转换为上述表达,即为: A ( x ) = a 0 + a 1 x A(x)=a_0+a_1x A(x)=a0+a1x,其中 a 0 = b , a 1 = k a_0=b,a_1=k a0=b,a1=k。而两点确定一条直线,则我们如果找出两个不同点,计算出斜率 k k k 和截距 b b b ,则唯一确定一条直线,即唯一确定一个一阶多项式。

推广到更高阶的多项式,对于 n n n 阶多项式 A ( x ) = ∑ i = 0 n a i x i A(x)=\sum\limits_{i=0}^n a_ix^i A(x)=i=0naixi,如果找到 n + 1 n+1 n+1 个不同点,则可以唯一确定一个 n n n 阶多项式。二维平面上 n + 1 n+1 n+1 个不同点可以唯一确定一个 n n n 阶多项式)。

对于多项式 A ( x ) A(x) A(x),其点值表示法为: { ( x 0 , A ( x 0 ) ) , ( x 1 , ( A ( x 1 ) ) , ⋯   , ( x n , A ( x n ) ) } \{(x_0,A(x_0)),(x_1,(A(x_1)),\cdots,(x_n,A(x_n))\} {(x0,A(x0)),(x1,(A(x1)),,(xn,A(xn))}

要证明 n n n 阶多项式可以由 n + 1 n+1 n+1 个点唯一确定,只需要证明这 n + 1 n+1 n+1 个系数是唯一的

对于 A ( x ) = a 0 + a 1 x + a 2 x 2 + ⋯ + a n x n A(x)=a_0+a_1x+a_2x^2+\cdots+a_nx^n A(x)=a0+a1x+a2x2++anxn

n + 1 n+1 n+1 个点带入多项式,得到 n + 1 n+1 n+1 个方程

A ( x 0 ) = a 0 + a 1 x 0 + a 2 x 0 2 + ⋯ + a n x 0 n A(x_0)=a_0+a_1x_0+a_2x_0^2+\cdots+a_nx_0^n A(x0)=a0+a1x0+a2x02++anx0n

A ( x 1 ) = a 0 + a 1 x 1 + a 2 x 1 2 + ⋯ + a n x 1 n A(x_1)=a_0+a_1x_1+a_2x_1^2+\cdots+a_nx_1^n A(x1)=a0+a1x1+a2x12++anx1n

⋯ \cdots

A ( x n ) = a 0 + a 1 x n + a 2 x n 2 + ⋯ + a n x n n A(x_n)=a_0+a_1x_n+a_2x_n^2+\cdots+a_nx_n^n A(xn)=a0+a1xn+a2xn2++anxnn

写成矩阵形式:

[ A ( x 0 ) A ( x 1 ) ⋮ A ( x d ) ] = [ 1 x 0 x 0 2 ⋯ x 0 n 1 x 1 x 1 2 ⋯ x 1 n ⋮ ⋮ ⋮ ⋱ ⋮ 1 x n x n 2 ⋯ x n n ] [ a 0 a 1 ⋮ a n ] \left[\begin{array}{c} A\left(x_{0}\right) \\ A\left(x_{1}\right) \\ \vdots \\ A\left(x_{d}\right) \end{array}\right]=\left[\begin{array}{ccccc} 1 & x_{0} & x_{0}^{2} & \cdots & x_{0}^{n} \\ 1 & x_{1} & x_{1}^{2} & \cdots & x_{1}^{n} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_{n} & x_{n}^{2} & \cdots & x_{n}^{n} \end{array}\right]\left[\begin{array}{c} a_{0} \\ a_{1} \\ \vdots \\ a_{n} \end{array}\right] A(x0)A(x1)A(xd) = 111x0x1xnx02x12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值