1. 运用CRT求解:
\[x ≡ 8 ( mod 11 )
\]
\[x ≡ 3 ( mod 19 )
\]
解:
记 a = 8, b = 3, p = 11, q = 19
n=pq=209
egcd算法求解p-1和q-1
使pp-1≡1(mod q) , qq-1≡1(mod p)
得p-1= 7 , q-1= 7
令y≡aqq-1+bpp-1(mod n),y= 41
验证得y为正确解。
2. 运用CRT求解
\[x ≡ 1 ( mod 5 )
\]
\[x ≡ 2 ( mod 7 )
\]
\[x ≡ 3 ( mod 9 )
\]
\[x ≡ 4 ( mod 11 )
\]
解:
记 a1= 1, a2 = 2, a3=3 , a4= 4
m1 = 5, m2 = 7 , m3 = 9 , m4 = 11
n=m1·m2·m3·m4=3465
egcd算法求解m1~m4逆元
使mimi-1≡1(mod q)
得m1-1= 7 , m2-1= 7,m3= 7 , m4-1= 7
令y≡a1m1m1-1+a2m2m2-1+a3m3m3-1+a4m4m4-1(mod n)
得y=1731
验证得y为正确解。
3. 手动计算20002019(mod 221),不允许使用电脑或其他电子设备。【提示:这是一道看上去与中国剩余定理无关的计算题】
解:
221=13 * 17
20002019( mod 13)
≡ ( 200013 )15520004( mod 13 )
≡ 1155 * 5( mod 13 )
≡5 ( mod 13 )
20002019( mod 17)
≡ ( 200016 )12620003(mod 17)
≡ 1 126 5( mod 17 )
≡ 5( mod 17)
得:
\[x ≡ 5 ( mod 13 )
\]
\[x ≡ 5 ( mod 17 )
\]
记 a = 5, b = 5, p = 13, q = 17
n=pq=221
egcd算法求解p-1和q-1
使pp-1≡1(mod q) , qq-1≡1(mod p)
得p-1= 4 , q-1= 10
令y≡aqq-1+bpp-1(mod n)
y= 5
验证得y为正确解。
7. 实现一个利用CRT求解同余方程的程序(python或c语言都可以)
点击查看代码
#include <iostream>
#include <vector>
// 扩展的欧几里得算法,计算 a 模 m 的乘法逆元
int mod_inverse(int a, int m) {
int m0 = m;
int y = 0, x = 1;
if (m == 1)
return 0;
while (a > 1) {
int q = a / m;
int t = m;
m = a % m;
a = t;
t = y;
y = x - q * y;
x = t;
}
if (x < 0)
x += m0;
return x;
}
// 使用中国剩余定理求解同余方程组
int solve_congruences(const std::vector<std::pair<int, int>>& congruences) {
int result = 0;
int product = 1;
for (const auto& congruence : congruences) {
product *= congruence.second;
}
for (const auto& congruence : congruences) {
int ai = congruence.first;
int mi = congruence.second;
int bi = product / mi; // product 除以 mi
int bi_inverse = mod_inverse(bi, mi); // bi 的乘法逆元
result += ai * bi * bi_inverse;
}
return result % product;
}
int main() {
int num_equations;
// 输入同余方程的数量
std::cout << "输入同余方程的数量: ";
std::cin >> num_equations;
std::vector<std::pair<int, int>> congruences;
// 输入同余方程
for (int i = 0; i < num_equations; ++i) {
int ai, mi;
std::cout << "输入余数" << i + 1 << ": ";
std::cin >> ai;
std::cout << "输入模数" << i + 1 << ": ";
std::cin >> mi;
congruences.push_back({ ai, mi });
}
// 使用中国剩余定理求解同余方程组
int solution = solve_congruences(congruences);
// 输出结果
std::cout << "The solution is: " << solution << std::endl;
return 0;
}
</details>
运行结果: