线性模方程求解

版权声明:希望有人转(^_^) https://blog.csdn.net/Sunshine_cfbsl/article/details/52573543

对于一些数论专题总是有些晕,还是要多做题(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;
}

就是这么简单(^__^)!

猜你喜欢

转载自blog.csdn.net/Sunshine_cfbsl/article/details/52573543