欧几里德算法
概述
欧几里德算法
又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
gcd函数的基本性质:
gcd(a,b)=gcd(b,a)=gcd(-a,b)=gcd(|a|,|b|)
C++语言实现
|
int Gcd( int a, int b){
if (b == 0)
return a;
return Gcd(b, a % b);
} // 递归形式
简化形式:
int gcd( int a, int b){
return b?gcd(b, a%b):a;
}
/*不能写成int gcd(int a, int b){
return b?gcd( a%b,b):a;
}*/
当然你也可以写成迭代形式:
int Gcd( int a, int b){
while (b != 0){
int r = b;
b = a % b;
a = r;
}
return a;
} // 非递归形式
|
扩展算法
对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整
数对 x,y ,使得 gcd(a,b)=ax+by。
c++语言实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream>
#include <cstdio>
using namespace std;
int x,y,q;
void extend_Eulid( int a, int b){
if (b == 0){
x = 1;y = 0;q = a;
} else {
extend_Eulid(b,a%b);
int temp = x;x = y;y = temp - a/b*y;
}
}
int main(){
int a,b;
cin>>a>>b;
extend_Eulid(a,b);
printf ( "%d=(%d)*%d+(%d)*%d\n" ,q,x,a,y,b);
return 0;
}
|
设 a>b。
1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
2,ab<>0 时
设 ax1+by1=gcd(a,b);
bx2+(a mod b)y2=gcd(b,a mod b);