首页 > 代码库 > 解同余式ax ≡ c(mod m)

解同余式ax ≡ c(mod m)

 

将式子变形为

ax-c=my

可以看出原式有解当且仅当线性方程ax-my=c有解

设g = gcd(a, m)

则所有形如ax-my的数都是g的倍数

因此如果g不整除c则原方程无解。

 

下面假设g整除c:

利用扩展欧几里得算法解出 au + mv =g 一个特解(u0, v0)

所以可用整数c/g乘上上式

au0*(c/g) + mv0*(c/g) = c

得到原式的解x0 = u0*(c/g)

 

解的个数:

假设x1是ax ≡ c(mod m)的其他解

ax1 ≡ ax2(mod m),所以m整除ax1 - ax2

所以(m/g)整除(a/g)(x1-x2)

因为(m/g)与(a/g)互质,所以(m/g)整除(x1-x2)

原方程的通解为x = x0 + k*(m/g)    (k = 0, 1, 2, …… g-1)

共g个

 1 void solve(int a, int c, int m) 2 { 3     int u0, v0; 4     int g = ex_gcd(a, m, u0, v0); 5     if(c%g != 0) 6     { 7         printf("The equation has no solution!\n"); 8         return; 9     }10     int i, x;11     for(i=0; i<g; ++i)12     {13         x = c/g*u0 + m/g*i;14         x = x % m;15         if(x<0)16             x+=m;17         printf("%d\n", x);18     }19 }
代码君