美文网首页
【总结】逆元的求法

【总结】逆元的求法

作者: 姜博钧 | 来源:发表于2018-10-20 07:08 被阅读0次

所谓一个数 a 的逆元,就是一个 x 使

a*x\equiv1(mod\ p)\ (p\in质数)

a*x\ mod\ p=0\ (p\in质数)

法一:快速幂(费马小定理)求逆元 \theta(log\ n)

由费马小定理得:
a^{p-1}\equiv1(mod\ p)\ (p\in质数)
那么将就可以将a^{p-1}拆成a*a^{p-2},得:
a*a^{p-2}\equiv1(mod\ p)
根据逆元的定义a^{p-2}就是a的逆元
然而a^{p-2}就可以用快速幂来求
source:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod = 19;
long long quickpow(long long a, long long b) {
    if (b < 0) return 0;
    long long ret = 1;
    a %= mod;
    while(b) {
        if (b & 1) ret = (ret * a) % mod;
        b >>= 1;
        a=(a*a) % mod;
    }
    return ret;
}
long long inv(long long a) {
    return quickpow(a, mod - 2);
}
int main(){
    long long a;
    scanf("%lld",&a);
    printf("%lld\n",inv(a));
    return 0;
}

法二:扩展欧几里得算法算法求逆元\theta(ln\ n)

根据上面对逆元的解释:a*x\ mod\ p=0\ (p\in质数)
利用扩展欧几里得算法:a*x+b*y=gcd(a,b)
那么对于数a的逆元就是用扩欧找到一个x使a*x=1
source:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
void extend_gcd(ll a, ll b, ll &x, ll &y) {
    if (!b)
    {
        x = 1, y = 0;
        return;
    }
    else
    {
        extend_gcd(b, a % b, y, x);
        y -= x * (a / b);
        return;
    }
}
ll inv(ll a, ll n) {
    ll x, y;
    extend_gcd(a,n,x,y);
    x = (x % n + n) % n;
    return x;
}
int main(){
    ll a,p;
    scanf("%lld%lld",&a,&p);
    printf("%lld\n",inv(a,p));
    return 0;
}

法三:线性求1~p-1的逆元

以下公式都应该是在模p意义下的
因为
\lfloor\frac{p}{i}\rfloor*i=p-p\ mod\ i

\lfloor\frac{p}{i}\rfloor*i=-p\ mod\ i
挪一下再调个边
i^{-1}=(-p\ mod\ i)^{-1}*\lfloor\frac{p}{i}\rfloor
那么

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int inv[1000];
int main(){
    int p;
    cin>>p;
    inv[1]=1;
    for(int i=2;i<p;i++) inv[i]=inv[p%i]*(p-p/i)%p;
    for(int i=1;i<p;i++) printf("%d ",inv[i]);
    printf("\n");
}

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

相关文章

  • 【总结】逆元的求法

    所谓一个数 的逆元,就是一个 使 即 法一:快速幂(费马小定理)求逆元 由费马小定理得:那么将就可以将拆成,得...

  • 逆元

    什么是逆元 来自一个大佬的解释,反正我是看懂了。。 乘法逆元: 模p意义下,一个数a如果有逆元x,那么除以a相当于...

  • 20171208daliy

    1. 无符号数加法 溢出和-2^w 2.无符号数求反。 x=0 逆元=0 x>0 逆元=2^w-x

  • 乘法逆元

    若整数b,m互质,并且,则存在一个整数x,使得。称x为b的模m乘法逆元,记为。因为,所以。计算乘法逆元有两个方法费...

  • 求逆元

  • 学习知识

    O(n) 求[1,p-1]所有逆元

  • fzu 2282 - Wand 组合数学 乘法逆元的三种求法 错

    0.序 Wand 题目大概意思是给出 n 组对应关系, 将它们打乱, 求最后至少有 k 组对应关系正确的打乱方式思...

  • ComSec作业三--编程题(AES)

    GF(2^8)内的乘法 测试截图: 求乘法逆元

  • 组合数 模板

    Lucas定理 mod小于10^5 逆元求组合数

  • 利用扩展的欧几里得算法求逆元

    首先说一下逆元的定义。存在一个数a使得ax对y进行取余运算,得到的值是一,则成为a是x的逆元。在数学中记做a * ...

网友评论

      本文标题:【总结】逆元的求法

      本文链接:https://www.haomeiwen.com/subject/ojuuzftx.html