新浪博客

欧几里德算法及贝祖公式

2013-08-28 18:53阅读:
一、欧几里德算法
欧几里德算法是一个用来求两个整数的最大公约数的算法,他也叫辗转相除法。定理如下:
gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0) gcd(greatest common divisor)
证明如下:
a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有a能被d整除,b能被d整除,所以r=a-kb也能被d整除,因此d也是(b,a mod b)的公约数;
反推,假设d是a,a mod b 的公约数,则有b能被d整除,r能被d整除,所以a = kb+r 也能被d整除,因此d是(a,b)的公约数。
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
通过该定理,要如何求最小公约数呢?就是不断的运用原理“两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。”,将两个数缩小,直到一个数为0,另一个数就是最小公约数。
例如:求9和12的公约数,gcd(9,12)= gcd(9,12-9)=gcd(9,3) = gcd(9-3,3)=gcd(6,3) =gcd(6-3,3)=gcd(3,3) =gcd(3-3,3) = gcd(0,3) = 3。这个过程可以在计算机中迭代完成。
二、扩展欧几里德算法
仅仅求最大公约数,貌似没什么牛逼的,但由欧几里德算法也可以推出,两数的最大公约数可以用两数的整数倍相加来表示,如3= 1 ×
; 9+ (−1) × 12。这个重要的等式叫做贝祖等式。定理如下:
给予二整数 a 与 b, 必存在有整数 x 与 y 使得ax + by = gcd(a,b)
且:gcd(a,b)是a,b的最小正线性组合。例如:9x+12y无论如何都得不到2或1。
(证明参考ttp://wenku.baidu.com/view/a75fdfd376a20029bd642de5.html
关键是,如何求x,y???
当b=0时,gcd(a,b)=1*a+0*b。即x=1 y=0。
当b≠0时: 假设gcd(a,b)=d,则gcd(b,a mod b)=d。若我们已经求出了gcd(b,a mod b)的线性组合表示
gcd(b,a mod b)=bx'+(a mod b)y',
gcd(a,b)=d=bx'+(a mod b)y'
=bx'+(a-[a/b]b)y'
=ay'+b(x'-[a/b]y')
那么,x=y',y=x'-[a/b]y'。
那要怎么知道gcd(b,a mod b)的线性组合呢?通过辗转相除不是可以将gcd(a,b)化成gcd(d,0)吗?这样就可以求出初始的x0,y0;然后不断迭代,求出x,y。(迭代公式:x=y',y=x'-[a/b]y')如果x,y符合要求,那么
x+bk,y-ak也符合要求。
如果
x,y
符合要求,那么
x+bk,y-ak
也符合要求。
例如:求47*x+30*y=1 的x,y。
通过欧几里德算法求得a,b值如下表,对应由下之上递推求出x,y
a b
47 30
30 17
17 13
13 4
4 1
1 0
x=y' y=x'-[a/b]y'
1 0
0 1-[4/1]*0 =1
1 0-[13/4]*1 = -3
-3 1-[17/13]*-3 = 4
4 -3-[30/17]*4 = -7
-7 4-[47/30]*-7 = 11
从而得到最终的x=-7,y=11 即-7*47 + 30*11 = 1。 且-7+30*1=23 11-47*1=-36 也符合要求。 c++语言实现:
int x,y;
void extend_Eulid(int a,int b)
{
if(b == 0){x = 1;y = 0;}
else
{
extend_Eulid(b,a%b);
int temp = x;
x = y; y = temp - a/b*y;
}
}

三、不定方程ax+by=c
对于不定方程ax+by=c,设gcd(a,b)=d,如果ax+by=c有解,则c一定能被d整除。
当c不能被d整除时,那么 ax+by=c一定无解。
当c能被d整除时,先通过上述算法求出ax'+by'=d=gcd(a,b)的x'和y',则x=x'*c/d,y=y'*c/d。

我的更多文章

下载客户端阅读体验更佳

APP专享