一、欧几里德算法
又称辗转相除法,用于计算两个整数a,b的最大公约数。
基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)
整除:
若整数a除以非零整数b,商为整数,且余数为零,我们就说a能被b整除(或说b能整除a),a为被除数,b为除数,即b|a(“|”是整除符号),读作“b整除a”或“a能被b整除”。a叫做b的倍数,b叫做a的约数(或因数)。
证明(法一):
若a可以表示为a=kb+r,则r=a mod b;
假设d是a,b的一个公约数,则有d|a,d|b,而r=a-kb,因此d|r,因此d是(b,a mod b)的公约数;
假设d是(b,a mod b)的公约数,则d|b,d|r,但是a=kb+r,因此d|a,所以d也是(a,b)的公约数;
因此,(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,即gcd(a,b)=gcd(b,r)。
证明(法二):
假设c是a,b的最大公约数,即c=gcd(a,b),则有a=mc,b=nc,其中m,n为正整数,且m,n互为质数;
由r=a mod b可知,r=a-qb,其中q是正整数,则r=a-qb=mc-qnc=(m-qn)c;
b=nc,r=(m-qn)c,且n,m-qn互质
(假设n,m-qn不互质,则n=xd,m-qn=yd,其中x,y,d都是正整数,且d>1,则a=mc=(yd+qn)c=(yd+qxd)c=(qx+y)dc,b=xdc,这时a,b的最大公约数变成dc,与前提矛盾,所以n,m-qn一定互质)
则gcd(b,r)=c=gcd(a,b)
二、扩展欧几里德算法
基本算法:对于不完全为0的非负整数a,b,必存在整数对x,y,使得gcd(a,b)=ax+by。
证明:
设a>b
1、当b=0时,gcd(a,b)=a。此时x=1,y=0;
2、ab!=0时,设
a x1+b y1=gcd(a,b);b x2+(a mod b) y2=gcd(b,a mod b);
根据朴素的欧几里德原理有gcd(a,b)=gcd(b,a mod b);
则:a x1+b y1 =b x2+(a mod b)y2;
即:a x1+b y1 =b x2+(a-(a/b)*b)y2=a y2+b x2-(a/b)+b y2;
根据恒定定理得:x1=y2,y1=x2-(a/b)* y2;
这样我们就得到了求解x1,y1的方法:x1,y1的值基于x2,y2。
上面的思想是以递归定义的,因为gcd不断的递归求解一定会有个时候b=0,所以递归可以结束。