从FTT到NTT

本文介绍了快速傅里叶变换(FFT)的基本原理,包括快速幂取模、点值表示法、单位根的概念,并详细探讨了如何将FFT应用于数论变换(NTT)。通过对模数P的选择和原根的性质,证明了NTT与FFT的相似性和在模P乘法运算中的应用。文章提供了NTT的计算模板,并指出NTT在快速模运算中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

####前置: 快速幂取模(这个假定大家都知道了)

快 速 计 算   a b ( m o d   m ) 原 理 :   取 模 运 算 的 结 合 率 x ∗ y ( m o d   m )   =   x ( m o d   m ) ∗ y ( m o d   m ) 快 速 算 法 :   b 为 偶 数 时 , 可 将 a b 拆 分 成 a b 2 ∗ a b 2 分 别 取 模 , 将 复 杂 度 降 低 为 O ( log ⁡ 2 N ) 快速计算\ a^b (mod\ m)\\ \bold{原理:}\ 取模运算的结合率\\x*y(mod\ m)\ =\ x(mod\ m)*y(mod\ m)\\ \bold{快速算法:}\ b为偶数时,可将a^b拆分成a^\frac{b}2*a^\frac{b}2分别取模,将复杂度降低为O(\log_{2}N)  ab(mod m): xy(mod m) = x(mod m)y(mod m: baba2ba2bO(log2N)
代码(C++):

int quick_mod (int a, int b, int m) {
   
    int ans = 1;
    a %= m;
    while (b) {
   
        if (b & 1) {
   
            ans = ans * a % m;
            b--;
        }
        b >>= 1;
        a = a * a % m;
    }
    return ans;
}

###正题

我们都知道朴素卷积算法:
KaTeX parse error: No such environment: equation* at position 39: …_{n-i}\\ \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ C(x)= \sum_{j=…
应对超大数乘法时明显太慢。有没有什么办法提高计算速度呢?

####引入函数的点值法表示

对 于 任 意 函 数 A ( x ) = ∑ i = 0 n a x i 任 取 n + 1 个 不 同 的 值 x 0 , x 1 ⋯ x n , 代 入 A ( x ) 中 , 点 值 对 构 成 集 合 { ( x 0 , A ( x 0 ) ) ,   ( x 1 , A ( x 1 ) ) , ⋯   ( x n , A ( x n ) ) } 不 难 发 现 这 样 的 点 值 对 集 合 和 该 函 数 是 唯 一 对 应 的 。 对于任意函数A(x)=\sum_{i=0}^nax^i\\ 任取n+1个不同的值x_0,x_1\cdots x_n,代入A(x)中,\\点值对构成集合\{(x_0,A(x_0)),\ (x_1,A(x_1)), \cdots\ (x_n,A(x_n))\}\\ 不难发现这样的点值对集合和该函数是唯一对应的。\\ A(x)=i=0naxin+1x0,x1xn,A(x){ (x0,A(x0)), (x1,A(x1)), (xn,A(xn))}

从矩阵角度理解:
传 统 的 系 数 表 示 法 可 表 示 为 两 个 向 量 点 积 : ( 这 里 为 了 偷 懒 ( 不 转 置 ) 就 反 过 来 写 了 &gt; ~ &lt; ) A ( x ) = [ x 0 x 1 ⋯ x n − 1 ] [ a 0 a 1 ⋯ a n − 1 ] 而 点 值 表 示 法 : [ A ( x 0 ) A ( x 1 ) ⋯ A ( x n − 1 ) ] = [ x 0 0 x 0 1 ⋯ x 0 n − 1 x 1 0 x 1 1 ⋯ x 1 n − 1 ⋯ x n − 1 0 x n − 1 1 ⋯ x n − 1 n − 1 ] [ a 0 a 1 ⋯ a n − 1 ] 也 即 b = A x 的 形 式 如 果 A − 1 存 在 , 即 A 为 非 奇 异 矩 阵 , 就 可 以 通 过 逆 矩 阵 A − 1 , 得 到 系 数 向 量 x = A − 1 b 。 两 种 状 态 间 可 以 自 由 转 换 。   问 题 就 转 化 为 找 到 这 样 一 个 非 奇 异 矩 阵 。 其 实 不 难 啦 , 只 要 保 证 对 任 意 x i ≠ x j , A ( x i ) ≠ A ( x j ) 就 好 啦 &gt; _ &lt; 什 么 ? 你 让 我 证 明 一 下 ? 同 学 , 不 要 在 t r i v i a l 的 事 上 浪 费 时 间 。 把 A 看 作 一 个 线 性 变 换 , 既 然 x i 和 A ( x i ) 一 一 对 应 { x i } ↔ { A ( x i ) } 毫 无 疑 问 存 在 一 个 从 { A ( x ) } 到 { x } 的 映 射 , 抵 消 了 A 的 效 果 即 存 在 A − 1 。 如 果 你 对 L A 有 所 了 解 , 你 应 该 知 道 : 矩 阵 非 奇 异 的 充 要 条 件 是 它 所 代 表 的 线 形 变 换 是 自 同 构 的 ( 或 者 说 可 逆 的 ) 。 传统的系数表示法可表示为两个向量点积:\\ (这里为了偷懒(不转置)就反过来写了&gt;~&lt;)\\ A(x)= \left[\begin{matrix} x^0&amp;x^1&amp;\cdots&amp;x^{n-1} \end{matrix}\right] \left[\begin{matrix} a_0\\a_1\\\cdots\\a_{n-1} \end{matrix}\right]\\ 而点值表示法:\\ \left[\begin{matrix} A(x_0)\\A(x_1)\\\cdots\\A(x_{n-1}) \end{matrix}\right]= \left[\begin{matrix} {x_0}^0&amp;{x_0}^1&amp;\cdots&amp;{x_0}^{n-1}\\ {x_1}^0&amp;{x_1}^1&amp;\cdots&amp;{x_1}^{n-1}\\ \cdots\\ {x_{n-1}}^0&amp;{x_{n-1}}^1&amp;\cdots&amp;{x_{n-1}}^{n-1} \end{matrix}\right] \left[\begin{matrix} a_0\\a_1\\\cdots\\a_{n-1} \end{matrix}\right]\\ 也即b=Ax的形式\\ 如果A^{-1}存在,即A为非奇异矩阵,\\就可以通过逆矩阵A^{-1},得到系数向量x=A^{-1}b。\\ 两种状态间可以自由转换。\\ \ \\ 问题就转化为找到这样一个非奇异矩阵。\\ 其实不难啦,只要保证对任意x_i\ne x_j,A(x_i)\ne A(x_j)就好啦&gt;\_&lt;\\ 什么?你让我证明一下?同学,不要在trivial的事上浪费时间。\\ 把A看作一个线性变换,既然x_i和A(x_i)一一对应\\ \{x_i\}\leftrightarrow \{A(x_i)\}\\ 毫无疑问存在一个从\{A(x)\}到\{x\}的映射,抵消了A的效果\\ 即存在A^{-1}。\\ 如果你对LA有所了解,你应该知道:\\矩阵非奇异的充要条件是它所代表的线形变换是自同构的(或者说可逆的)。 (><)A(x)=[x0x1xn1]a0a1an1Ax0Ax1Axn1=x00x10xn10x01x11xn11x0n1x1n1xn1n1a0a1an1b=AxA1AA1,x=A1b xi̸=xj,A(xi)̸=A(xj)>_<trivialA线xiA(xi){ xi}{ A(xi)}{ A(x)}{ x}AA1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值