exgcd 与线性求逆元

 
  

1.关于同余方程:ax≡1(mod p) 意思是(a*x)%p=1
逆元的性质:x*x^(-1)≡1(mod p) :x乘x的-1次方
x的逆元相当于x的倒数
所以求某一个数的逆元可以利用之后的exgcd,同余方程这道题里求得的x就是x的逆元
求逆元:乘法逆元:可以避免分式除法不满足取模的运算,因此转化为逆元,用逆元时是使用乘法,可以满足取模运算
!!!目的:找到i与模数的关系

如何线性求逆元:学习连接(ε=ε=ε=┏(゜ロ゜;)┛没有打公式的软件。。。)https://www.cnblogs.com/qdscwyy/p/7795368.html
解释:
为什么求逆元见上述解释。所以我们求逆元就是要找到i与模数的关系
所以等式两边乘 r^(-1)*i(-1),其实乘i^(-1)也可以,照样可以推出递推式。求谁找谁所以乘i^(-1)
最后为了保证逆元是正数,优化一下:加上mod(将学习连接的公式修改,以便于使用)
实用公式:inv[i]=(mod-mod/i)*inv[mod%i]%mod
注意:现在自己常用:线性的组合数取模时,利用逆元:Cni=Cn(i-1)*(n-i+1)%mod*inv[i]%mod
2.exgcd:
存在 x , y 使得 gcd(a,b)=ax+by
  当 b=0 时,gcd(a,b)=a,此时 x=1 , y=0
  当 b!=0 时,
   设 ax1+by1=gcd(a,b)=gcd(b,a%b)=bx2+(a%b)y2
  又因 a%b=a-a/b*b
  则 ax1+by1=bx2+(a-a/b*b)y2
    ax1+by1=bx2+ay2-a/b*by2
    ax1+by1=ay2+bx2-b*a/b*y2
    ax1+by1=ay2+b(x2-a/b*y2)
     /*解得 x1=y2 , y1=x2-a/b*y2*/
具体实现:

 
  

void exgcd(int a,int b){
if(b!=0){
exgcd(b,a%b);
int k=x;//递归回来后,k记录了上一层的x
x=y;//按照结论将x赋值,此时赋值成为本层的x
y=k-a/b*y;//将y赋值后成为本层y
}
else{x=1; y=0;}
}

 
  

int exgcd(int a,int b){
if(b!=0){
return exgcd(b,a%b);
int k=x;
x=y;
y=k-a/b*y;
}
else{x=1; y=0; return a;}
} //或者这样顺便求出gcd

 
  

int gcd(int a,int b){
if(b!=0) return gcd(b,a%b);
return a;
}//gcd

 
  

3.exgcd的应用:
最纯粹的经过上述介绍:
ax+by=1 其中的x,y可以通过exgcd求解
因为:存在 x , y 使得 gcd(a,b)=ax+by
所以我们使用exgcd通常的将问题先转化为不定方程,!!!如果原来非不定方程
可以引入新的变量,组成不定方程:

 
  

举例:求解同余方程
eg:ax≡1(mod p)---------->(a*x)%p=1
注意:取模运算不能运算除法,加减乘都满足基本的运算规律
所以有:a*x=1%p------->a*x=1
因为要有两个变量的不定方程才可以用exgcd所以:a*x=1------->a*x+p*y=1
(等式两边同时×上%p得 (a*x)%p+0=1------->a*x≡1(mod p)

 
 

 

转载于:https://www.cnblogs.com/79707536wc/p/9930456.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值