扩展欧几里得算法
扩展欧几里得:
问题描述:对于三个自然数 a,b,c,求解 ax+by=c 的关于x,y的整数解。
算法解决:
首先需要判断不定方程是否有解,
根据裴蜀定理:
对于整数a,b,一定存在一组关于x,y的整数解,使得ax+by=gcd(a,b)。
于是方程存在解的充要条件是 gcd(a,b) | c (c是gcd(a,b)的倍数)。
对于求解gcd(a,b),使用欧几里得算法。
描述:
int gcd(int a, int b) { return b ? gcd(b, a%b) : a; }
现在考虑方程ax+by=gcd(a,b),d=gcd(a,b),方程的所有解为
其中,x0,y0是一组特解,t是整数
考虑方程ax+by=c, gcd(a,b)|c,的所有解为
其中,x0,y0是方程ax+by=gcd(a,b),d=gcd(a,b)的一组特解
证明:
https://blog.sengxian.com/algorithms/gcd-extgcd
代码:
ll ex_gcd(ll a,ll b,ll& x,ll& y){ ll d = a; if (!b) x = 1,y = 0; else d = ex_gcd(b,a%b,y,x), y -= a/b*x; return d; }