首页 > 其他分享 >多项式求逆

多项式求逆

时间:2024-02-07 10:56:57浏览次数:21  
标签:求逆 frac pmod 多项式 int n2 equiv

类似于逆原,多项式也可以求逆,具体地,定义多项式 \(f(x)\) 的乘法逆为能使得 \(f(x) * g(x) \equiv 1 \pmod{x^n}\) 的多项式 \(g(x)\),也可记作 \(f(x)^{-1}\)。

假设我们现在已经求出了 \(f(x)\) 在模 \(x^{\lceil\frac n2\rceil}\) 意义下的逆原 \(f_0(x)^{-1}\)。有:

\[\left.\begin{aligned} f(x)f_0(x)^{-1} \equiv 1 \pmod{x^{\lceil\frac n2\rceil}} \\ f(x)f(x)^{-1} \equiv 1 \pmod{x^{\lceil\frac n2\rceil}} \end{aligned}\right\} \Rightarrow f(x)^{-1} - f_0(x)^{-1} \equiv 0 \pmod{x^{\lceil\frac n2\rceil}} \]

两边平方,得:

\[f(x)^{-2} - 2f^{-1}(x)f_0(x)^{-1} + f_0(x)^{-2} \equiv 0 \pmod{x^n} \]

两边同乘 \(f(x)\),得:

\[f(x)^{-1} \equiv f_0(x)^{-1}[2 - f(x)f_0(x)^{-1}] \pmod{x^n} \]

递归下去就好了,时间复杂度 \(T(n) = T(\dfrac n2) + \mathcal O(n \log n) = \mathcal O(n \log n)\)。

特别地,\(f(x)^{-1} \equiv f(0)^{-1} \pmod x\)。

P4238 【模板】多项式乘法逆

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

constexpr int N = 1 << 18, MOD = 998244353;

int n, f[N], g[N], fg[N];
int len, bits, rev[N];

ll qp(ll base, int e) {
    ll res = 1;
    while (e) {
        if (e & 1) res = res * base % MOD;
        base = base * base % MOD;
        e >>= 1;
    }
    return res;
}

void NTT(int *A, bool I = 0) {
    for (int i = 0; i < len; i++) if (i < rev[i]) swap(A[i], A[rev[i]]);
    for (int i = 1; i < len; i <<= 1) {
        ll wn = qp(I ? 332748118 : 3, (MOD - 1) / (i << 1));
        for (int j = 0; j < len; j += (i << 1)) {
            ll w = 1;
            for (int k = j; k < j + i; k++) {
                int t = w * A[k + i] % MOD;
                A[k + i] = (A[k] - t + MOD) % MOD, A[k] = (A[k] + t) % MOD;
                w = w * wn % MOD;
            }
        }
    }
    if (I) {
        ll invlen = qp(len, MOD - 2);
        for (int i = 0; i < len; i++) A[i] = A[i] * invlen % MOD;
    }
}

void solve(int e) {
    if (e == 1) return;
    solve((e + 1) >> 1);
    bits = -1, len = 1; while (len < (e << 1) - 1) len <<= 1, bits++;
    for (int i = 0; i < len; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << bits);
    memcpy(fg, f, e << 2), fill(fg + e, fg + len, 0); NTT(fg), NTT(g);
    for (int i = 0; i < len; i++) fg[i] = (ll)fg[i] * g[i] % MOD;
    for (int i = 0; i < len; i++) g[i] = (ll)g[i] * (2 - fg[i] + MOD) % MOD;
    NTT(g, 1); fill(g + e, g + len, 0);
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(nullptr), cout.tie(nullptr);
    cin >> n; for (int i = 0; i < n; i++) cin >> f[i];
    g[0] = qp(f[0], MOD - 2); solve(n);
    for (int i = 0; i < n; i++) cout << g[i] << ' ';
    return 0;
}

标签:求逆,frac,pmod,多项式,int,n2,equiv
From: https://www.cnblogs.com/chy12321/p/18010730

相关文章

  • 多项式多点求值
    重点写了我认为的疑难点,若其他部分由疑问或含糊不清,欢迎提出,积极改正题面:给一n次多项式\(F(x)\),求m个数代入的值构造关于\(x_0\)的函数,使得代入\(x_0\)后,值为\(0\),则有\(G(x)=x-x_0\)。做多项式取模\(F(x)=Q(x)G(x)+R(x)\),\(F(x_0)=Q(x_0)G(x_0)+R(x_0)\),\(R(x_0)\)只有常数项,即......
  • 多项式学习笔记
    多项式学习笔记泰勒展开有\(F(x)=F(x_{0})+\frac{F'(x_{0})}{1!}(x-x_{0})+\frac{F'(x_{0})}{2!}(x-x_{0})^{2}\cdots+\frac{F^{(n)}(x_{0})}{n!}(x-x_{0})^{n}\)给定\(G(x)\)求解\(G(F(x))\equiv0\bmodx^{n}\)的\(F(x)\)。考虑分治:设\(f_{0}(x)\)是$G(F(......
  • 萌新的多项式学习笔记(板子)
    萌新的多项式学习笔记(板子)详细讲解FFT直接放板子structcp{ doublex,y; cp(doublexx=0,doubleyy=0){x=xx,y=yy;}};intr[maxn];cpoperator+(constcp&a,constcp&b){returncp(a.x+b.x,a.y+b.y);}cpoperator-(constcp&a,constcp&b){returncp(a.x-b.x,a......
  • R语言非线性方程数值分析生物降解、植物生长数据:多项式、渐近回归、负指数方程、幂函
    全文链接:https://tecdat.cn/?p=33742原文出处:拓端数据部落公众号简介在选择最佳拟合实验数据的方程时,可能需要一些经验。当我们没有文献信息时该怎么办?我们建立模型的方法通常是经验主义的。也就是说,我们观察过程,绘制数据并注意到它们遵循一定的模式。例如,我们的客户可能观察......
  • 多项式
    很多证明需要用到积分知识,所以只有结论和代码一、多项式求导$F'(x)=\sum_{i=0}a_{i+1}\times(i+1)x$点击查看代码inlinevoiddao(int*g,int*f){for(inti=0;i<n;++i)g[i]=f[i+1]*(i+1)%mod;}二、多项式求积分求导逆运算$F'(x)=\sum_{i=1}a_{i-1}\times\fr......
  • 【模板】多项式半家桶 version 2
    #include<bits/stdc++.h>usingnamespacestd;#ifdefLOCAL#definedebug(...)fprintf(stderr,##__VA_ARGS__)#else#defineendl"\n"#definedebug(...)void(0)#endiftypedeflonglongLL;template<unsignedumod>structmodint{......
  • 我的多项式全家桶
    第一个自己实现的多项式全家桶。打比赛时终于有板子了!代码是从之前学转置原理的那篇博客里升级来的。但是功能很残?效率很逊?接口很怪?评价是能用就行。目前封装了:乘、逆、除(取模)、开方(无二次剩余,不会qwq)、对数、指数、多点求值、快速插值、常系数齐次线性递推、Berlekamp-Massey......
  • 无涯教程-MATLAB - 多项式(Polynomials)
    MATLAB将多项式表示为行向量,其中包含按降序排序的系数。例如,方程P(x)=x4+7x3-5x+9可以表示为-p=[170-59];判断多项式polyval函数用于以指定值判断多项式。例如,要判断我们先前的多项式p,在x=4处,键入-p=[170-59];polyval(p,4)MATLAB执行上述语句并返......
  • 洛谷题单指南-模拟和高精度-P1067 [NOIP2009 普及组] 多项式输出
    原题链接:https://www.luogu.com.cn/problem/P1067题意解读:模拟法依次输出多项式内容即可,但是需要考虑的周全,主要有以下关键点:1、系数为0时不输出多项式2、第一个符号,只有负号才输出3、次数不为0时,不输出为1的系数;次数为0时,输出所有系数4、次数为1时,不输出次数;次数为0时不输......
  • 一些多项式常用操作的公式推导
    怕我以后忘记了看不懂自己的板子(((牛顿迭代用于求解函数零点的近似值。设函数\(f(x)\)的零点近似值为\(x_0\),过点\((x_0,f(x_0))\)作\(f(x)\)的切线,切线与\(x\)轴交点的横坐标即为新的近似值。切线解析式为\(y=f'(x_0)(x-x_0)+f(x_0)\),当\(y=0\)时\(x=x_0-\dfrac{f......