欧几里得扩展
源网址
欧几里得扩展证明(自我感觉最好懂得一种写法)
① ,当b = 0 时,gcd(a, b) = a , 此时 x = 1, y = 0;
② ,当 a * b <> 0 时,
设 a * x + b * y = gcd(a, b); (1)
b * x0 + (a % b) * y0 = gcd( b, a % b); (2)
由朴素的欧几里德公式; gcd(a, b) = gcd (b, a % b);
得(1),(2) a * x + b * y = b * x0 + (a % b) * y0
= b * x0 + (a – a / b * b) * y0
= a * y0 + ( x0 – a / b * y0 ) * b
所以 x = y0, y = x0 – a / b * y0;
由此可以得出扩展欧几里德的递归程序:
int extend_euild(int a, int b)//返回的是最大公约数
{
if(b == 0)
{
t = 1;
p = 0;
c = a;
}
else {
extend_euild(b, a%b);
int temp = t;
t = p;
p = temp - a/b*p;
}
}
还可以这样写
#include<cstdio>
typedef long long LL;
void extend_Eulid(LL a, LL b, LL &x, LL &y, LL &d){
if (!b) {d = a, x = 1, y = 0;}
else{
extend_Eulid(b, a % b, y, x, d);
y -= x * (a / b);
}
}
int main(){
LL a, b, d, x, y;
while(~scanf("%lld%lld", &a, &b)){
extend_Eulid(a, b, x, y, d);
printf("%lld*a + %lld*b = %lld\n", x, y, d);
}
}
还可以这样
long long ext_gcd(long long a,long long b,LL &x,LL &y)
{
if(b==0)
{
x = 1,y = 0;
return a;
}
LL m;
m = ext_gcd(b,a%b,y,x);
y -= a / b * x;
return m;
}
浙公网安备 33010602011771号