####前置: 快速幂取模(这个假定大家都知道了)
快 速 计 算 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)原理: 取模运算的结合率x∗y(mod m) = x(mod m)∗y(mod m)快速算法: b为偶数时,可将ab拆分成a2b∗a2b分别取模,将复杂度降低为O(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=0∑naxi任取n+1个不同的值x0,x1⋯xn,代入A(x)中,点值对构成集合{ (x0,A(x0)), (x1,A(x1)),⋯ (xn,A(xn))}不难发现这样的点值对集合和该函数是唯一对应的。
从矩阵角度理解:
传 统 的 系 数 表 示 法 可 表 示 为 两 个 向 量 点 积 : ( 这 里 为 了 偷 懒 ( 不 转 置 ) 就 反 过 来 写 了 > ~ < ) 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 ) 就 好 啦 > _ < 什 么 ? 你 让 我 证 明 一 下 ? 同 学 , 不 要 在 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 有 所 了 解 , 你 应 该 知 道 : 矩 阵 非 奇 异 的 充 要 条 件 是 它 所 代 表 的 线 形 变 换 是 自 同 构 的 ( 或 者 说 可 逆 的 ) 。 传统的系数表示法可表示为两个向量点积:\\ (这里为了偷懒(不转置)就反过来写了>~<)\\ A(x)= \left[\begin{matrix} x^0&x^1&\cdots&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&{x_0}^1&\cdots&{x_0}^{n-1}\\ {x_1}^0&{x_1}^1&\cdots&{x_1}^{n-1}\\ \cdots\\ {x_{n-1}}^0&{x_{n-1}}^1&\cdots&{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)就好啦>\_<\\ 什么?你让我证明一下?同学,不要在trivial的事上浪费时间。\\ 把A看作一个线性变换,既然x_i和A(x_i)一一对应\\ \{x_i\}\leftrightarrow \{A(x_i)\}\\ 毫无疑问存在一个从\{A(x)\}到\{x\}的映射,抵消了A的效果\\ 即存在A^{-1}。\\ 如果你对LA有所了解,你应该知道:\\矩阵非奇异的充要条件是它所代表的线形变换是自同构的(或者说可逆的)。 传统的系数表示法可表示为两个向量点积:(这里为了偷懒(不转置)就反过来写了>~<)A(x)=[x0x1⋯xn−1]⎣⎢⎢⎡a0a1⋯an−1⎦⎥⎥⎤而点值表示法:⎣⎢⎢⎡A(x0)A(x1)⋯A(xn−1)⎦⎥⎥⎤=⎣⎢⎢⎡x00x10⋯xn−10x01x11xn−11⋯⋯⋯x0n−1x1n−1xn−1n−1⎦⎥⎥⎤⎣⎢⎢⎡a0a1⋯an−1⎦⎥⎥⎤也即b=Ax的形式如果A−1存在,即A为非奇异矩阵,就可以通过逆矩阵A−1,得到系数向量x=A−1b。两种状态间可以自由转换。 问题就转化为找到这样一个非奇异矩阵。其实不难啦,只要保证对任意xi̸=xj,A(xi)̸=A(xj)就好啦>_<什么?你让我证明一下?同学,不要在trivial的事上浪费时间。把A看作一个线性变换,既然xi和A(xi)一一对应{
xi}↔{
A(xi)}毫无疑问存在一个从{
A(x)}到{
x}的映射,抵消了A的效果即存在A−1