一次合同式を解く


関数名
congruence  一次合同式 a x≡b (mod m) を満たす x を求める
形式
int congruence(int a, int b, int m);
引数
a  合同式にあるa
b  合同式にあるb
m  合同式にあるm
関数値
合同式の解xの値(0≦x<m)。解が存在しないときは-1。
注意事項

用例(congruence-test.c

プログラム(congruence.c
int congruence(int a, int b, int m)
{
    int c, d, e, f;
    int q, r;
    int tmp;
    
    c = a;
    e = b;
    d = m;
    f = 0;
    while ((r = c % d) != 0) {
        q = c / d;
        c = d;
        d = r;
        tmp = f;
        f = e - q * f;
        e = tmp;
    }
    if (b % d != 0) return -1;
    q = (f/d) % (m/d);
    if (q < 0) q += m/d;
    return q;
}
説明
合同式 a x≡b (mod m) を解くには、もう一つ自明な合同式 m x≡0 (mod m) を利用して、同値な変形を繰り返せばよい。すな わち、x の係数 a と m に対してユークリッド互除法を用いて、 x の係数を小さく変形していく。

関連関数
ユークリッド互除法