defgcd(a, b): """计算两个整数的最大公约数(欧几里得算法)""" while b != 0: a, b = b, a % b return a
defextended_gcd(a, b): """扩展欧几里得算法:返回(x, y, g)满足 ax + by = g,其中g = gcd(a,b)""" if b == 0: return (1, 0, a) else: x, y, g = extended_gcd(b, a % b) return (y, x - (a // b) * y, g)
defmod_inverse(a, m): """求解a在模m下的逆元(仅当gcd(a,m)=1时存在)""" x, y, g = extended_gcd(a, m) if g != 1: raise ValueError("逆元不存在(a与m不互素)") else: return x % m
defis_pairwise_coprime(ms): """判断模数列表是否两两互素""" n = len(ms) for i inrange(n): for j inrange(i + 1, n): if gcd(ms[i], ms[j]) != 1: returnFalse returnTrue
defread_test_data(file_path): """读取测试数据:按顺序提取a1,a2,a3,m1,m2,m3(每行1个数字)""" try: withopen(file_path, 'r', encoding='utf-8') as f: # 过滤空行,提取有效数字并转换为整数(支持大整数) lines = [line.strip() for line in f if line.strip()] iflen(lines) != 6: raise ValueError("测试数据格式错误:需包含6个数字(a1,a2,a3,m1,m2,m3)") a1 = int(lines[0]) a2 = int(lines[1]) a3 = int(lines[2]) m1 = int(lines[3]) m2 = int(lines[4]) m3 = int(lines[5]) return [a1, a2, a3], [m1, m2, m3] except FileNotFoundError: raise FileNotFoundError("测试数据文件未找到,请检查文件路径") except ValueError as e: raise ValueError(f"数据读取错误:{str(e)}")
defcrt_solver(as_list, ms_list): """中国剩余定理求解器(仅处理3个方程、模数两两互素的情况)""" # 验证输入列表长度 iflen(as_list) != 3orlen(ms_list) != 3: raise ValueError("需输入3个方程的余数和模数") # 步骤1:计算总模数m m = ms_list[0] * ms_list[1] * ms_list[2] # 步骤2:计算每个M_i = m / m_i M1 = m // ms_list[0] M2 = m // ms_list[1] M3 = m // ms_list[2] # 步骤3:计算每个M_i的逆元t_i t1 = mod_inverse(M1, ms_list[0]) t2 = mod_inverse(M2, ms_list[1]) t3 = mod_inverse(M3, ms_list[2]) # 步骤4:计算最小正整数解x x = (as_list[0] * M1 * t1 + as_list[1] * M2 * t2 + as_list[2] * M3 * t3) % m return x
# 主程序(执行入口) if __name__ == "__main__": # 读取测试数据 try: as_list, ms_list = read_test_data("3.txt") print("=" * 50) print("读取的测试数据:") print(f"同余方程组:") print(f"x ≡ {as_list[0]} (mod {ms_list[0]})") print(f"x ≡ {as_list[1]} (mod {ms_list[1]})") print(f"x ≡ {as_list[2]} (mod {ms_list[2]})") print("=" * 50) # 判断模数是否两两互素,非互素则直接跳出并提示 ifnot is_pairwise_coprime(ms_list): print("不能直接利用中国剩余定理") else: # 求解并输出结果 x = crt_solver(as_list, ms_list) print("中国剩余定理求解结果:") print(f"方程组的最小正整数解为:x = {x}") print("\n解的正确性验证:") for a, m inzip(as_list, ms_list): verify_result = x % m print(f"{x} mod {m} = {verify_result}(预期值:{a})→ {'验证通过'if verify_result == a else'验证失败'}") print("=" * 50) except Exception as e: print(f"程序执行错误:{str(e)}")