以下是使用Python实现的中国剩余定理算法。代码使用了扩展欧几里得算法来求解逆元,并处理了模数不一定两两互质的情况(虽然标准CRT要求互质,但此实现更具通用性)。
def extended_gcd(a, b):
if a == 0:
return b, 0, 1
else:
gcd, x, y = extended_gcd(b % a, a)
return gcd, y - (b // a) x, x
def chinese_remainder_theorem(numerators, denominators):
# 检查输入是否有效
if len(numerators) != len(denominators):
raise ValueError("Numerators and denominators must have the same length.")
# 计算所有模数的乘积
M = 1
for d in denominators:
M = d
x = 0
for i in range(len(numerators)):
m_i = denominators[i]
a_i = numerators[i]
# 计算 M_i = M / m_i
M_i = M // m_i
# 计算 M_i 模 m_i 的逆元
gcd, inv, _ = extended_gcd(M_i % m_i, m_i)
if gcd != 1:
raise ValueError("Moduli are not pairwise coprime.")
# 累加解
x += a_i M_i inv
# 返回最小非负解
return x % M
示例:物不知数问题
numerators = [2, 3, 2]
denominators = [3, 5, 7]
result = chinese_remainder_theorem(numerators, denominators)
print(f"解为: {result}") # 输出: 解为: 23
这段代码清晰地展示了中国剩余定理的计算步骤:计算总模数、分解模数、求解逆元、累加求和。它是理解该定理算法实现的绝佳范例。