您的位置:首页 > 其它

欧几里得扩展

2017-08-06 21:50 183 查看
源网址

欧几里得扩展证明(自我感觉最好懂得一种写法)

① ,当b = 0 时,gcd(a, b) = a , 此时 x = 1, y = 0;

② ,当a∗b≠0a∗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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  扩展欧几里得