解同余式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!
");
 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
", x);
18     }
19 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3856481.html