最大公约数与扩展欧几里得算法[数论]

——!x^n+y^n=z^n  

  最大公约数(gcd)及其算法(欧几里得算法)

对于正整数 a,b 若存在c使得c|a且c|b,则称c为a,b的公约数,若c还满足a=pc,b=qc,且p,q互质,则称c为a,b的最大公约数,记为(a,b)。

当然我们可以用枚举的方法求gcd,但还有一种算法可以高效解决这一问题,叫做欧几里得算法...这里主要给出一种证明...

欧几里得算法:(a,b)=(a,b%a)[不妨设a<=b]

``````

证明:

设(a,b)=c;

则a=pc,b=qc,且(p,q)=1;

由带余除法可知,b=am+r,0=<r<a;

∵a=pc,b=qc

∴r=c(q-mp)

这表明c是r的约数,故c|(a,b%a);

若c≠(a,b%a) 记c'=(a,b%a),c'>c;

即r=c(q-mp)=b-am=c'r'

   a=c'a'

=>b=c'r'+c'a'm 这表明c'|a,c'|b,然而c'>c 这与c是(a,b)矛盾

固原命题得证。

``````

身为lowbee的我乱写一通代码:

int gcd(int a,int b){

    if(b==0) return a;

    return gcd(b,a%b);

}

  裴蜀定理与扩展欧几里得:

裴蜀定理:ax+by=c   <=>   (a,b)|c  <=>   ax+by=(a,b)有解

特别地,ax+by=1   <=>   (a,b)=1 (其实证明这个就能得到一般的裴蜀定理)

``````

简单说明一下,记住就好把,别太纠结:

若(a,b)=1,则b不整除 a,2a,L,(b-1)a;(这个操作比较显然...)···①

下证上面的式子除以b两两不同:

若存在ka≡ ma(mod b),那么b|a(k-m)[不妨设k>m,且k,m∈[1,(b-1)]∩N]

这与①产生矛盾,故命题成立。

故一定存在0<k<b使得 ka≡1(mod b),即存在 ax+by=1。

``````

那么问题来了,怎么求解x,y?

若x=x0,y=y0是方程的一组解,且(a,b)=1,我们容易得到她的所有解:

a(x0+tb)+b(y0-ta)=1 (t∈Z)。

所以我们只要求得一组解就行了。当然这个问题不好想,如果a|b,那就十分显然了

a*1+b*0=a(gcd(a,b))[特殊情况的话a=1],这时候能想到什么?

欧几里得算法!

我们先假设  ax0+by0=1(a>b),我们考虑b,a%b的情况,由裴蜀定理我们易知:

存在 bx1+(a%b)y1=1=ax0+by0成立,如果我们在运用编程的特性,我们可以知道:

a%b=a-[a/b]*b,这意味着我们可以对上式进行变形(这种操作就自己画画把…)

得到:

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

这不就是很好的递归操作吗?其实这就是上面这个操作就是扩展欧几里得算法。

接下来是蒟蒻的渣代码:

int x,y;
void egcd(int a,int b){
    if(b==0){
        x=1;
        y=0;
        return ;
    }
    int p,q;
    egcd(b,a%b);
    p=y;
    q=x-(a/b)*y;
    x=p;
    y=q;
    return ;
}

可以去做同余方程加深理解(luogu的...):https://www.luogu.org/problem/show?pid=1082#sub

2017-07-21

原文地址:https://www.cnblogs.com/_inx/p/7217842.html