• 多项式杂学笔记


    说是要省选后来学多项式的,结果一直咕咕咕到现在,长文警告。

    多项式定义:

    (f(x) = sumlimits_{k = 0}^na_kx^k)
    ((a_n != 0))

    卷积:

    对于数组(a,b),令:
    (c_k = sumlimits_{i + j = k}a_ib_j = sumlimits_{i = 0}^{k} a_i b_{k = i} = sum_{j = 0}^ka_{k - j}b_j)
    (c)(a)(b)的卷积。

    多项式乘法:

    (f(x) = sumlimits_{k = 0}^na_kx^k)
    (g(x) = sumlimits_{k = 0}^nb_kx^k)
    (f(x)g(x) = sumlimits_{k = 0}^nc_kx^k)
    (c)(a)(b)的卷积。
    显然:直接计算的时间复杂度为(O(nm))

    多项式点值表示:

    (LaTex)学艺不精

    挂个图。

    对一个(n)次多项式和(m)次多项式乘法来说(O(n + m))

    单位根。

    多项式(x^n - 1)的根被称作(n)次单位根。

    (w_n = e^{frac{2pi i}{n}} = cos(x) + isin(x))
    容易验证(w_n^n = 1)

    对于质数(p = kn + 1,设w_n = g^{frac{p - 1}{n}},g为膜p的原根,显然w_n^n = 1)

    在上述两种情况下,(1,w_n,w_n^2......w_n^{n - 1})(n)个不同的(n)次单位根

    DFT的定义:

    (f(x) = sumlimits_{k = 0}^{n - 1}a_kx^k)
    (DFT(a) = {f(1),f(w_n),f(w_n^1)......f(w_n^{n - 1})})
    称为(a)的离散傅里叶变换。
    从而得到了(f(x))的一个点值表示。

    IDFT的定义:

    (DFT)的逆变换称为(IDFT)(DFT^{-1})(IDFT)是把点值表示变换成系数表示。

    容易证明:只要将(DFT)中的(w_n)换为(w_n^{-1})并将结果除(n),形象的说(g(x) = sumlimits_{k = 0}^{n - 1}f(w_n^k)x^k),则有(a = DFT^-1(DFT(a)) = frac{1}{n}(g(1),g(w_n^{-1}).......g(w_n^{-(n- 1)})))

    循环卷积:

    对大小为(n)的数组(a,b),令:
    (c_k = sumlimits_{(i + j) mod n = k}a_ib_j = sumlimits_{i + j = k}a_ib_j + sumlimits_{i + j = n + k}a_ib_j)

    此时(c)(a)(b)的循环卷积,用(a⊗b)表示

    卷积定理:

    (f(x) = sumlimits_{k = 0}^{n - 1}a_kx^k)
    (g(x) = sumlimits_{k = 0}^{n - 1}b_kx^k)
    (h(x) = sumlimits_{k = 0}^{n - 1}c_kx^k)
    由于有((w_n^s)^n = 1)
    所以:
    (f(w_n^s)g(w_n^s) = sumlimits_{k = 0}^{n - 1}(sumlimits_{i + j = k}a_ib_j + sumlimits_{i + j = n + k}a_ib_j)(w_n^s)^k = h(w_n^s))
    借助(DFT和IDFT)
    (IDFT(DFT(a) ◦ DFT(b)) = a⊗b)
    (◦)是逐元素相乘。

    FFT综述

    快速傅里叶变换,或FFT,是快速计算(DFT)的方法,其时间复杂度仅为(O(nlogn))
    (OI)中,通常要求实现(n = 2^k)的FFT,如果要计算(a)(b)的卷积(c),可以取(n)为不小于(c)的大小的最小的(2^k),将(a)(b)的大小扩充到(n)再计算。

    对于膜质数(p),若(p = k * 2^l + 1),若(n = 2 ^ k and k <= l)(n次单位根)(Fp),从而可以计算(DFT)

    一个常见的(p)

    (998244353 = 7 * 17 * 2^{23} + 1)
    相应原根可取(3),注意(2^{23} < 10^7)

    (n为2^k)
    (f(x) = sumlimits_{k = 0}^{n - 1}a_kx^k)
    (f_0(x) = sumlimits_{k = 0}^{(n / 2) - 1}a_{2k}x^k)
    (f_1(x) = sumlimits_{k = 0}^{(n / 2) - 1}a_{2k + 1}x^k)
    (f(x) = f_0(x^2) + xf_1(x^2))

    对于 (n = 2^k),可以将所有下标视为 k 位二进制数。将下标根据
    是否小于 (frac{n}{2})划分成两部分是根据最高位进行划分,而根据奇偶
    性划分成两部分是根据最低位进行划分。对于前者,可以自然地将递归树展开。而对于后者,只要将所有下标的二进制位翻转,就可以转化为前者的情况

    先去写点(FFT)的应用。

  • 相关阅读:
    AJAX注册
    文件上传加水印
    邮箱
    AJAX完整操作
    跨窗体操作
    容器布局
    EF异常类
    SQL查出字段横向拼接,如:1,2,3,4
    asp.net三层结构中,SQL助手类DbHelperSQL
    正则抓取页面信息
  • 原文地址:https://www.cnblogs.com/dixiao/p/14843115.html
Copyright © 2020-2023  润新知