【总结】逆元的求法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【总结】逆元的求法相关的知识,希望对你有一定的参考价值。

参考技术A

由费马小定理得:

那么将就可以将 拆成 ,得:

根据逆元的定义 就是 的逆元
然而 就可以用快速幂来求
source:

根据上面对逆元的解释:
利用扩展欧几里得算法:
那么对于数 的逆元就是用扩欧找到一个 使
source:

以下公式都应该是在模p意义下的
因为



挪一下再调个边

那么

,这数学公式用的好爽!
参考博客: boshi 基本是抄的

总结四种逆元的求法

前言

逆元是一直以来想补的坑了

求逆元 即求 x 满足 a/b % mod =a*x%mod =1%mod

费马小定理

限制:mod为质数

#include<bits/stdc++.h>
using namespace std;
int b,mod; 
inline int ksm(int a,int b)
{
    int ret=1;
    while(b)
    {
        if(b&1)ret=(ret*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return ret;
}
int main()
{
    cin>>b>>mod;
    cout<<ksm(b,mod-2);
    return 0;
}

exgcd

限制:b和mod互质

#include<bits/stdc++.h>
using namespace std;
int b,x,y,mod,gcd; 
inline int exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    int ret=exgcd(b,a%b,x,y);
    int t=x;x=y,y=t-(a/b)*y;
    return ret;
}
int main()
{
    cin>>b>>mod;
    gcd=exgcd(b,mod,x,y);
    if(gcd!=1)printf("not exist
");
    else printf("%d
",(x%mod+mod)%mod);
    return 0;
}

数学变形

限制:b能被a整除

x=(a%(b*mod))/b

公式递推

限制:mod是质数

逆元不存在的时候会输出0

#include<bits/stdc++.h>
using namespace std;
#define N 3000030
#define ll long long
ll b,mod; 
ll inv[N];
int main()
{
    scanf("%lld%lld",&b,&mod);
    inv[1]=1;
    for(ll i=2;i<=b;i++)
        inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    for(ll i=1;i<=b;i++)
        printf("%lld
",inv[i]);
    return 0;
}

 

以上是关于【总结】逆元的求法的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1576 -- A/B (总结乘法逆元的几种求法)

逆元的求法

乘法逆元简单说说乘法逆元的求法

逆元的求法

乘法逆元的求法(5种)

(数论)简单总结求逆元的几种方法