扩展欧几里得

看了这篇博客才稍微理解http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html

感恩。

在此附上自己理解,加深记忆。

 

扩展欧几里得

基本算法:对于不完全为 0 的非负整数 a,b,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。(gcd即a,b的最大公约数)

证明:

1. b=0时,gcd(a,b)=a,此时x=1,y=0;

2.设   ax1+by1=gcd(a,b);

         bx2+(a%b)*y2=gcd(b,a%b);

(这里穿插欧几里得算法,上面博客有详细解释,这里只写一种。)

————————————————————————————————————————————————————————

基本算法:设a=kb+r,皆为整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。

证明:设w为a,b的一个公约数,则w|a(w可以被a整除),w|b;因为r=a-kr,则w|r。

所以,w也是b,r的公约数。

由此  gcd(a,b)=gcd(b,a%b)。

————————————————————————————————————————————————————————

(回归正题)

因为 gcd(a,b)=gcd(b,a%b)

所以 ax1+by1=bx2+(a%b)*y2——>ax1+by1=bx2+(a-b*(a/b))*y2——>ax1+by1=ay2+b*(x2-(a/b)*y2;

得 :x1=y2   y1=x2-(a/b)*y2;

则 x1,y1可由a,b,x2,y2得到。

接着不断递归2的情况,直到出现1时为止。

递归模板:

void gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
    if(!b)
    {
        d=a;
        x=1;
        y=0;
    }
    else
    {
        gcd(b,a%b,d,y,x);
        y=y-x*(a/b);
    }
}

扩展欧几里得求逆元。如求(a/b)%mod,则求b对mod的逆元,即bx+mody=1,求解出的x即为逆元,(逆元=(x+mod)%mod),则(a/b)% mod=(a* x)%mod。

求解膜线性方程:求解方程 ax≡b (mod n) 相当于求解方程 ax+ ny= b, (x, y为整数),

 ax≡b (mod n)的一个解为 x0= x* (b/ d ) mod n,且方程的 d 个解分别为 xi= (x0+ i* (n/ d ))mod n {i= 0... d-1}。

 设ans=x*(b/d),s=n/d;方程ax≡b (mod n)的最小整数解为:(ans%s+s)%s;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值