码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-05-24 20:37:54      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:定义   例子   The   1.5   line   XML   ack   ext   一个   

欧几里得算法

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

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就是二元一次不定方程的一组解

 

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

标签:定义   例子   The   1.5   line   XML   ack   ext   一个   

原文地址:https://www.cnblogs.com/tpgzy/p/9084816.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!