拡張ユークリッドアルゴリズムと実現
1050 ワード
整数a,bの最大公約数を求めるために,ユークリッドアルゴリズム,すなわち転がり相除算法を用いた.
ユークリッドアルゴリズムC++実装コード:(a,bサイズ関係を決定する必要はない)
拡張ユークリッドアルゴリズム:aとbがすべて0でないと、gcd(a,b)=xa+ybとなるように整数xとyが存在する
証明:a>bを仮定する
b=0の場合:gcd(a,b)=a、この場合x=1、y=0
ab!=0の場合:
x 1 a+y 1 b=gcd(a,b)
x2b + y2(a%b) = gcd(b,a%b)
gcd(a,b)==gcd(b,a%b)
したがってx 1 a+y 1 b=x 2 b+y 2(a%b)=x 2 b+y 2(a-a/b*b)=y 2 a+x 2 b-y 2(a/b)*b
従ってx 1=y 2,y 1=x 2−(a/b)y 2
これによりx 2,y 2に基づいてx 1,y 1の解を求めることができる.
拡張ユークリッドC++実装コード01:
拡張ユークリッドC++実装コード02:
ユークリッドアルゴリズムC++実装コード:(a,bサイズ関係を決定する必要はない)
long long gcd(long long a,long long b){
return b?gcd(b,a%b):a;
}
拡張ユークリッドアルゴリズム:aとbがすべて0でないと、gcd(a,b)=xa+ybとなるように整数xとyが存在する
証明:a>bを仮定する
b=0の場合:gcd(a,b)=a、この場合x=1、y=0
ab!=0の場合:
x 1 a+y 1 b=gcd(a,b)
x2b + y2(a%b) = gcd(b,a%b)
gcd(a,b)==gcd(b,a%b)
したがってx 1 a+y 1 b=x 2 b+y 2(a%b)=x 2 b+y 2(a-a/b*b)=y 2 a+x 2 b-y 2(a/b)*b
従ってx 1=y 2,y 1=x 2−(a/b)y 2
これによりx 2,y 2に基づいてx 1,y 1の解を求めることができる.
拡張ユークリッドC++実装コード01:
long long Exgcd(long long a,long long b,long long& x,long long& y){
if(b==0){
x=1;
y=0;
return a;
}
long long d=exgcd(b,a%b,x,y);
long long tmp=x;
x=y;
y=tmp-a/b*y;
return d;
}
拡張ユークリッドC++実装コード02:
#define ll long long
void Exgcd(ll a,ll b,ll& d,ll& x,ll& y){
if(!b){ d=a;x=1;y=0;return ;}
Exgcd(b,a%b,d,y,x);
y -= a/b*x ;
return ;
}