乘法逆元---费马小定理&&扩展欧几里得

例题

51nod1256题目链接

乘法逆元 :

X*b=1(mod p)   x乘以b在模p的意义下恒等于1  那么 b就是x在mod p的情况下的逆元

意义

乘法逆元的一大应用是模意义下的除法,除法在模意义下并不是封闭的

所以我们可以根据乘法逆元,将 ( a / b ) % c   转化为   ( a * x ) % c  (x是b的逆元) 将其转化为乘法。

求法一:费马小定理

费马小定理:假如p是质数,且gcd(a,p)=1,那么 a的(p-1)次方 ≡ 1(mod p)

由费马小定理我们可以转化为    

a的(p-2) 次方 * a 恒等于1(mod p)  那么a的p-2次方(mod p的情况下)就是 a的逆元

所以 我们求出a的(p-2)次方(mod p的情况)就行了   数字太大的话  可用快速幂

注意 使用费马小定理必须在p是质数的情况下

求法二:扩展欧几里得定理

扩展欧几里得定理:若gcd(a,b)=1  则必存在 x y  使得 a*x+b*y=1

然后扩展欧几里得定理模板可以求出x y的值

那么 求逆元的式子 X*B=1(mod p)  可以转化为  X*B=y*p+1   (  1%p  --->   (p*y+1)%p   )

移项后   也就是  X*B-y*p=1

显然 这个式子和扩展欧几里得的式子一样  那么我们知道了 X p  解一元二次方程  就可以求出 B y

X*B-y*p=1  &&  a*x+b*y=1       X就是a   b就是p    求得的x就是B

注意 求出来的逆元x可能是负的  需要   (x+p)%p  再输出

下面是例题51nod1256的代码

 

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int exgcd(int a,int b,int &x,int &y){
    if(b==0){
        x=1;y=0;return a;
    }
    int r=exgcd(b,a%b,x,y);
    int t=y;
    y=x-(a/b)*y;
    x=t;
    return r;
}
int main(){
    int m,n,x,y;
    scanf("%d%d",&m,&n);
    exgcd(m,n,x,y);
    cout<<(x+n)%n;
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1900_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值