BZOJ2179: FFT快速傅立叶 FFT实现高精度乘法
时间: 2024-02-27 12:33:52 浏览: 149
平面图与其对偶图的关系-周东《浅析最大最小定理在信息学竞赛中的应用》
这道题目是要求用 FFT 实现高精度乘法。我们可以先将两个高精度数转换为多项式,然后对这两个多项式进行相乘,最后将结果转换为高精度数输出即可。
具体来说,将两个高精度数 $a$ 和 $b$ 分别转换为多项式 $A(x)$ 和 $B(x)$:
$$
A(x) = a_0 + a_1x + a_2x^2 + \cdots + a_{n-1}x^{n-1} \\
B(x) = b_0 + b_1x + b_2x^2 + \cdots + b_{n-1}x^{n-1}
$$
其中 $n$ 是 $a$ 和 $b$ 的位数,为了方便计算,我们要将 $n$ 扩展到 $2^k$,并在低位补 0。即:
$$
A(x) = a_0 + a_1x + a_2x^2 + \cdots + a_{n-1}x^{n-1} + 0x^n + \cdots + 0x^{2^k-1} \\
B(x) = b_0 + b_1x + b_2x^2 + \cdots + b_{n-1}x^{n-1} + 0x^n + \cdots + 0x^{2^k-1}
$$
接下来我们需要用 FFT 对 $A(x)$ 和 $B(x)$ 进行多项式乘法,得到多项式 $C(x) = A(x) \times B(x)$。然后将 $C(x)$ 转换为高精度数输出即可。
注意,由于 FFT 实现的是循环卷积,而我们要求的是线性卷积,因此在进行 FFT 前需要对 $A(x)$ 和 $B(x)$ 进行点值扩展,即令 $A'(x) = A(x) \times x^k$,$B'(x) = B(x) \times x^k$,其中 $k = 2^k - n$。这样得到的 $C'(x) = A'(x) \times B'(x)$ 在进行 FFT 后,其前 $n$ 项即为 $C(x)$ 的系数项,可以直接转换为高精度数输出。
代码实现如下:
阅读全文