关于欧几里得算法,裴蜀定理,扩展欧几里得算法证明与解析

欧几里得算法

注:欧几里得算法是用来计算最大公约数的一个算法.主要的代码实现如下:

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

如果这个式子成立的话,不断重复利用这个式子来计算,直到a和b中有一个数变为 0的时候,就可以求出了他们的最大公约数。

 举个例子:我们要求gcd(15,30)

运行如下:gcd(15,30)=gcd(30,15)=gcd(15,0)此时的15便是gcd(15,30)

证明过程:

设g = gcd(a,b),

若使gcd(a,b) = gcd(b,a%b)成立的话,

我们要证明g|b,g|a%b

因为g|b

所以我们要证明a%b

∵a%b = a−b * n/m

∴g|a%b

裴蜀定理:

定义:对于不定方程:a*x + b*y = c,判断此不定方程有整数解的条件是gcd(a,b)|c

如何证明?

 

证明过程:

 

 对于gcd(a,b)∤c时,

显然gcd(a,b) | (a*x + b*y)如果存在整数解的话,gcd(a,b)|c

 gcd(a,b)dgcd(a,b)∤d 这个线性方程不存在整数解。

扩展欧几里得算法(简称扩欧):

扩欧就是用来求a*x+b*y=gcd(a,b)的一组整数解的算法

原理:

当b = 0时

x = 1,y = 0是方程a*x+b*y=gcd(a,b)的一组解.

当b ≠ 0时

a*x1+b*y1 = a*y2+b*(x2-a/b*y2)

证明过程:

a*x1 + b*y1 = gcd(a,b)

b*x2+(a%b)*y2 = gcd(b,a%b)

∵gcd(a,b) = gcd(b,a%b)

∴a*x1 + b*y1 = b*x2+(a%b)*y2 

       =b*x2+(a - [a/b]*b)*y2

       =b*x2+a*y2-[a/b]*b*y2

       =a*y2 + b(x2 - [a/b]*y2)

∴x1 = y2,y1 = x2 - [a/b]*y2 

代码如下:

int exgcd(int a,int b,int &x,int &y){
    if(b == 0){
        x = 1,y = 0;
        return a;
    }
    int g = exgcd(b,a%b,x,y);
    int t = x;
    x = y;
    y = t - a/b * y;
    return g;
}

最后的x,y就是二元一次不定方程的一组解

 

posted @ 2018-05-24 19:53  Rlif  阅读(435)  评论(0编辑  收藏  举报