zoukankan      html  css  js  c++  java
  • 【总结】扩展欧几里得算法

    扩展欧几里得定理

    (开头日常唠叨)扩展欧几里得定理它好像只是被板子就行,但你要是自己推一遍的话肯定印象更深刻啊qwq

    我们已知(ax + by = gcd(a, b)) 求x, y的值

    考虑当b =0的时候(gcd(a,b))= a,此时y = 0,x = 1;

    我们在朴素的欧几里得定理中

    int gcd(int a,int b){
    	return b==0?a:gcd(b,a%b);
    }
    

    最终的状态中b同样也等于0,我们猜想可以借助欧几里得定理求解上述的二元一次方程

    假设(bx′ +(a mod b)y′ = gcd(a, b))有解,求原方程的解

    我们可以对式子进行化解

    [a mod b=a-lfloor frac {a}{b} floor \ bx′+(a-lfloor frac {a}{b} floor)y′ = gcd(a,b) \ ay'+b(x'-lfloor frac{a}{b} floor*y')=gcd(a,b) ]

    又因为原方程

    [ax+by=gcd(a,b) ]

    所以$x=y' (并且)y=x'-lfloor frac{a}{b} floor*y'$

    所以我们可以在每次递归过程求解gcd中求解出满足方程的x,y

    算是一些小推论?

    1.在a和b互质的情况下

    ax+by=1一定存在一组解,并且x是a的逆元

    2.对于c是gcd(a,b)的倍数,ax+by=c也一定有解

    Code

    特别提醒一点啊qwq

    如果x和y并不是全局变量需要写成gcd(ll a,ll b,&x,&y);

    因为每一次x和y的值都要记录返回到上一状态里

    void gcd(ll a,ll b){
    	if(b==0){x=1;y=0;return;}
    	gcd(b,a%b);
    	ll temp=x;
    	x=y;y=temp-a/b*y;
    } 
    

    嗯,没了没了没了别看了qwq

  • 相关阅读:
    从面向对象到SOA
    我对国内软件开发类书籍出版与写作的体会与努力
    MSDN for 2010的那些麻烦事
    金旭亮新作《.NET 4.0面向对象编程漫谈》之序“穿越梦想、起锚远航”
    Silverlight应用程序的本地通讯
    C#中Dictionary的用法
    泛型
    动态规划算法
    C# Timer
    面向对象程序设计寒假作业1
  • 原文地址:https://www.cnblogs.com/huixinxinw/p/12207417.html
Copyright © 2011-2022 走看看