扩展欧几里德算法求逆元1

 1 int exgcd(int a,int b,int &x,int &y)
 2 {
 3     if(b==0)
 4     {
 5         x=1;
 6         y=0;
 7         return a;
 8     }
 9     int ret=exgcd(b,a%b,x,y);
10     int tmp=x;
11     x=y;
12     y=tmp-a/b*y;
13     return ret;
14 }
View Code

该算法目的在于计算gcd(a,b)=d=ax+by式x和y的值,最后求得x即为a的逆元

•定理:对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数d,必然存在整数对x,y,使得gcd(a,b)=d=ax+by
•对于gcd(a,b) = d,对(a, b)用欧几里德辗转相除会最终得到(d, 0)。此时对于把a =d, b = 0 代入a*x + b*y = d,显然x = 1,y可以为任意值。
•我们可以用a = d, b = 0的情况逆推出来任何gcd(a, b) = d 满足a*x + b*y = d的解。如果x0,y0是b*x + (a%b)*y = d 的解,那么对于a*x + b*y = d的解呢?

b*x + (a%b)*y = d →

b*x + (a - [a/b]*b)*y = d →

a*y + b*(x - [a/b]*y) = d

所以a*x + b*y = d的解

x1 = y0,y1= x0 - [a/b]*y0;

转载于:https://www.cnblogs.com/wsruning/p/4673244.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值