线性模方程求解

2019-04-13 17:29发布

对于一些数论专题总是有些晕,还是要多做题(O_O)
所谓线性模方程,就是形如axb(modn) (a,x,b,nZ)的方程。。 已知a,b,需要求解最小的x值。 方法如下: 原方程等价于axny=b,令d=gcd(a,n)。 如果bmodd0,则方程无解,因为左边是d的倍数,而右边不是。 如果bmodd=0,则先使用扩展欧几里得算法求出方程ax+ny=d的一组解,然后原方程的解x=(x×(b÷d))modn,这里略去证明。 代码如下: long long exgcd(long long a, long long b, long long &x, long long &y){ if(!b) { x = 1; y = 0; return a; } long long g = exgcd(b, a%b, y, x); y -= (a/b)*x; return g; } bool liner_mode_equition(long long a, long long &x, long long b, long long n) { long long x_, y_, d = exgcd(a, n, x_, y_); if(b % d != 0) return false; x = (x_ * (b / d)) % n; return true; } 就是这么简单(^__^)!