将式子变形为
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 }
代码君
解同余式ax ≡ c(mod m)
时间: 2024-11-07 05:22:23