分类: C/C++
2014-08-02 16:20:34
欧几里德算法又称,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
证明:假设m是a,b的一个公约数,则有m|a,m|b,即存在唯一的整数x,y有a=xm,b=ym,由整数的除法知必存在唯一的一组数k,r,使a=kb+r;
=> xm=kym+r => r=(x-ky)m => m是r的一个约数 => m是b,r的公约数 => a,b和b,r具有相同的公约数 => a,b和b,r具有相同的最大公约数,即gcd(a,b) = gcd(b,a mod b)。
C代码:
函数:
int gcd(int a,int b)
{
int c;
c=a%b;
if(c==0)
return b;
return gcd(b,c);
}
程序块:
while(b!=0)
{
temp=b;
b=a%b;
a=temp;
}
模P乘法逆元
对于整数a、p,如果存在整数b,满足ab mod p =1,则说,b是a的模p乘法逆元。
定理:a存在模p的乘法逆元的充要条件是gcd(a,p) = 1
欧几里德算法的Stein版
Stein算法由J. Stein 1961年提出,这个方法也是计算两个数的最大公约数。和欧几里德算法 算法不同的是,Stein算法只有整数的移位和加减法。
c++/java stein 算法
int gcd(int a,int b){
if(ab
int temp = a;
a = b;
b=temp;
}
if(0==b)//the base case
return a;
if(a%2==0 && b%2 ==0)//a and b are even
return 2*gcd(a/2,b/2);
if ( a%2 == 0)// only a is even
return gcd(a/2,b);
if ( b%2==0 )// only b is even
return gcd(a,b/2);
return gcd((a+b)/2,(a-b)/2);// a and b are odd
}