解同余式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 }
代码君

你可能感兴趣的:(c)