欧几里得扩展
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)
由朴素的欧几里德公式; gcd(a, b) = gcd (b, a % b);
得(1),(2) a * x + b * y = b * x0 + (a % b) * y0
由此可以得出扩展欧几里德的递归程序:
还可以这样写
还可以这样
欧几里得扩展证明(自我感觉最好懂得一种写法)
① ,当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; }
相关文章推荐
- POJ 2115 C Looooops(扩展欧几里得应用)
- Codeforces Round #451 (Div. 2) - B. Proper Nutrition (扩展欧几里得)
- POJ 1061-青蛙的约会(扩展欧几里得)
- POJ 1061 扩展欧几里得
- C. Line(扩展欧几里得求不定方程的解)
- 扩展欧几里得
- Codeforces 724C Ray Tracing 扩展欧几里得
- Codeforces 724C Ray Tracing 扩展欧几里得
- CodeForece 724C Ray Tracing 扩展欧几里得
- 欧几里得扩展方程
- BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】
- 关于扩展欧几里得的一些想法
- 扩展欧几里得、中国剩余定理 入门指南
- UVa 10413 Crazy Savages(扩展欧几里得)
- POJ 1061 青蛙的约会 扩展欧几里得
- 关于扩展欧几里得的一点研究
- 扩展欧几里得
- 扩展欧几里得定理
- hdu 1576 扩展欧几里得
- 扩展欧几里得的一些思考