线性同余方程

线性同余方程

定义:形如 \(ax \equiv b \ (mod \ p)\) 的方程,其中 \(a,b,n\) 我给定的整数,\(x\) 为未知数,从区间 \([0,n-1]\) 求解 \(x\),当解不唯一时求出所有解。

用逆元求解

如果 \(gcd(a,p)=1\),则 \(x \equiv ba^{-1} \ (mod \ p)\)

否则不一定有解,即当 \(gcd(a,p) \ | \ b\),有解,否则无解。

原式子为:\(ax \equiv b \ (mod \ p)\), 令 \(gcd(a,p)=d\),则两边同时除以 \(d\),得到 \(a'x \equiv b' \ (mod \ p')\),此时 \(a'\)\(p'\) 已经互素了,那么 \(x'\) 就可以作为 \(x\) 的解,很明显 \(x'\) 也是原方程的解,但这个不是唯一的解,可以看出原始方程的解有 \(g\) 个:

形如:\(x_i \equiv (x'+i·p') \ (mod \ p) \quad for \ i = 0,1,...,g-1\)

总而言之,线性同余方程的解的数目等于 \(gcd(a,p)\) 或等于 \(0\)

用扩展欧几里得来求解

转化为扩展欧几里得为:\(a\frac{b}{gcd(a,p)}x_0+p\frac{b}{gcd(a,p)}k_0=b\)

如果 \(gcd(a,p)=1\),且 \(x_0、k_0\) 为方程 \(ax+pk=b\) 的一组解,则方程的任意解可以表示为:

\(\left\{\begin{array}{l} x=x_0+pt \\ k=k_0-at \end{array}\right.\)

template<typename T>
struct fc{
    inline T exgcd(T a, T p = 1e9 + 7, T &x, T &y) {
        if (!p) {
            x = 1;
            y = 0;
            return a;
        }
        
        T d = exgcd(p, a % p, y, x);
        y -= a / p * x;
        return d;
    }
    
    inline bool get(T a, T b, T p = 1e9 + 7, T &x, T &y) {
        T d = exgcd(a, p, x, y);
        if (b % d) return false;
        T k = b / d;
        x = x * k % p;
        y = y * k;
        x = (x + p) % p;// 求出最小的整数解
        return true;
    }
};
posted @ 2024-08-31 17:46  grape_king  阅读(96)  评论(0)    收藏  举报