模板总结——扩展欧几里得
2018-03-28 16:23
218 查看
背景
求不定方程ax + by = gcd(a,b)的解集。
推导过程
由欧几里得定理,可知gcd(a,b) = gcd(b,a mod b).
所以ax + by = bx’ + (a mod b)y’.又因为a mod b=a - a/b * b.(/表示整除)。
所以ax + by = bx’ + (a - a/b * b)y’.整理得:
ax + by = ay’ + b(x’-a/b*y’).
对于恒等式,必有x=y’,y=x’-a/b * y’.
实现
只要随着gcd(a,b)=gcd(b,a mod b)不断递归,x=y’,y=x’-a/b*y’也不断递归即可。
递归的终止条件为b等于0,这时gcd(a,b)=a,即ax + by = a.所以x=1,y=0.
代码
求不定方程ax + by = gcd(a,b)的解集。
推导过程
由欧几里得定理,可知gcd(a,b) = gcd(b,a mod b).
所以ax + by = bx’ + (a mod b)y’.又因为a mod b=a - a/b * b.(/表示整除)。
所以ax + by = bx’ + (a - a/b * b)y’.整理得:
ax + by = ay’ + b(x’-a/b*y’).
对于恒等式,必有x=y’,y=x’-a/b * y’.
实现
只要随着gcd(a,b)=gcd(b,a mod b)不断递归,x=y’,y=x’-a/b*y’也不断递归即可。
递归的终止条件为b等于0,这时gcd(a,b)=a,即ax + by = a.所以x=1,y=0.
代码
#include <bits/stdc++.h> using namespace std; int ex_gcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return a; } int ret=ex_gcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return ret; } int main() { int a,b,x,y; while(cin>>a>>b) { int d=ex_gcd(a,b,x,y); cout<<d<<" "<<x<<" "<<y<<endl; } return 0; }
相关文章推荐
- 扩展欧几里得模板&逆元求法
- 扩展欧几里得模板
- 求乘法逆元模板(扩展欧几里得)
- gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)
- 扩展欧几里得定理总结
- 扩展欧几里得、逆元、线性同余方程组、中国剩余定理总结
- 扩展欧几里得模板
- 扩展欧几里得原理与模板
- 扩展欧几里得、求乘法逆元及其应用、中国剩余定理(互质版和非互质版)、欧拉函数、快速判素数模板
- poj 1061 青蛙的约会 (扩展欧几里得模板)
- 欧几里得+扩展欧几里得(转载、模板)
- poj 1061 青蛙的约会 (扩展欧几里得模板)
- 模板:欧几里得 扩展欧几里得 乘法逆元
- 扩展欧几里得模板 poj-C Looooops
- 扩展欧几里得模板
- hdu 2669 Romantic 扩展欧几里得求线性方程模板题
- 欧几里得模板以及扩展欧几里得
- 扩展欧几里得总结
- 扩展欧几里得模板(洛谷1082 同余方程NOIP 2012 提高组 第二天 第一题)
- 【扩展欧几里得】总结//poi 2002 Counting-Out Rhyme