第十章第1、2、3、7
1、运用CRT求解: x ≡ 8(mod 11)
x ≡ 3(mod 19)
解:易知11和19互素,记 a=8,b=3,p=11,q=19,所以 n=pq=209
由和
得:
= 7,
= 7
所以 x = = 41
2、运用CRT求解: x ≡ 1(mod 5)
x ≡ 2(mod 7)
x ≡ 3(mod 9)
x ≡ 4(mod 11)
解:设=5,
=7,
=9,
=11,则 M = 5×7×9×11=3465 ,
记 = M /
=693,
= M /
=495,
= M /
=385,
= M /
=315
由得:
= 2,
= 3,
= 4,
= 8
因为 = 1,
= 1,
= 2,
= 3
根据中国剩余定理推广版,得 x = 1731
3、手动计算
,不允许使用电脑或者其他电子设备。[提示:这是一道看上去与中国剩余定理无关的计算题。]
解:因为 221 = 13 *17,13 和 17 互素 ;
,所以
,所以
,
由费马小定理得: ≡ 5 mod 17、
≡ 5 mod 13
所以 = 5
7、实现一个利用CRT求解同余方程的程序(Python或者C语言都可以)
#include<iostream>
using namespace std;
int ni(int x, int m) {
int r[100], s[100], t[100], q[100];
r[0] = x;
r[1] = m;
s[0] = 1;
t[0] = 0;
s[1] = 0;
t[1] = 1;
int i = 1;
while (r[i] != 0) {
q[i] = r[i - 1] / r[i];
s[i + 1] = s[i - 1] - q[i] * s[i];
t[i + 1] = t[i - 1] - q[i] * t[i];
r[i + 1] = r[i - 1] % r[i];
i++;
}
while (s[i - 1] < 0) {
s[i - 1] += m;
}
return s[i - 1];
}//求x模m的逆元
int main() {
cout << "请输入方程的个数" << endl;
int n;
cin >> n;
int* b = new int[n];
int* m = new int[n];
int* M = new int[n];
int* x = new int[n];//存放逆元
int i = 0;
int sum = 1;//这里sum代表了m的值
cout << "请依次输入各方程的参数" << endl;
cout << "格式参考:x≡b(mod m)" << endl;
for (i = 0; i < n; i++) {
cout << "请输入第" << i+1 << "个方程的参数(先输入b,后输入m)" << endl;
cin >> b[i] >> m[i];
sum *= m[i];
M[i] = 1;
}
for (i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i != j) {
M[i] *= m[j];
}
}
}
for (i = 0; i < n; i++) {
x[i] = ni(M[i], m[i]);
}
int ans = 0;
for (i = 0; i < n; i++) {
ans += x[i] * M[i] * b[i];
}
while (ans - sum >= 0) {
ans -= sum;
}
cout << "该方程组的解为x≡" << ans << "(mod " << sum << ")" << endl;
cin.get();
cin.get();
}