| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #!/usr/bin/env python3
- """课前零食:追踪 XOR 高斯消元与非互质 CRT 合并。"""
- from __future__ import annotations
- from math import gcd
- MATRIX = [
- [1, 1, 0, 1], # x1 xor x2 = 1
- [0, 1, 1, 0], # x2 xor x3 = 0
- [1, 0, 1, 1], # x1 xor x3 = 1(依赖前两行)
- ]
- def ask(prompt: str, default: str) -> str:
- try:
- return input(prompt).strip() or default
- except EOFError:
- return default
- def print_matrix(matrix: list[list[int]]) -> None:
- for row in matrix:
- print(" ", " ".join(map(str, row[:-1])), "|", row[-1])
- def xor_lab() -> None:
- matrix = [row[:] for row in MATRIX]
- variables = len(matrix[0]) - 1
- pivot_row = 0
- print("\n增广矩阵(最后一列为右侧常数):")
- print_matrix(matrix)
- for column in range(variables):
- pivot = next((r for r in range(pivot_row, len(matrix)) if matrix[r][column]), None)
- if pivot is None:
- print(f"第 {column + 1} 列没有主元:对应变量暂时自由。")
- continue
- matrix[pivot_row], matrix[pivot] = matrix[pivot], matrix[pivot_row]
- print(f"\n选第 {column + 1} 列主元,放到第 {pivot_row + 1} 行。")
- for row in range(len(matrix)):
- if row != pivot_row and matrix[row][column]:
- matrix[row] = [a ^ b for a, b in zip(matrix[row], matrix[pivot_row])]
- print(f" 第 {row + 1} 行 XOR 主元行")
- print_matrix(matrix)
- pivot_row += 1
- contradiction = any(not any(row[:-1]) and row[-1] for row in matrix)
- print("\n秩 =", pivot_row)
- if contradiction:
- print("出现 0=1:无解。")
- elif pivot_row < variables:
- print("相容但有自由变量:多解。")
- else:
- print("每个变量有主元:唯一解。")
- def exgcd(a: int, b: int) -> tuple[int, int, int]:
- if b == 0:
- return a, 1, 0
- g, x, y = exgcd(b, a % b)
- return g, y, x - (a // b) * y
- def merge(a: int, m: int, b: int, n: int) -> tuple[int, int] | None:
- g = gcd(m, n)
- print(f"gcd({m},{n})={g},差 b-a={b - a}")
- if (b - a) % g:
- return None
- reduced_m, reduced_n = m // g, n // g
- _, inverse, _ = exgcd(reduced_m, reduced_n)
- t = ((b - a) // g * inverse) % reduced_n
- modulus = m * reduced_n
- value = (a + m * t) % modulus
- print(f"解出 t={t},所以 x={value} (mod {modulus})")
- return value, modulus
- def crt_lab() -> None:
- raw = ask("输入 a m b n(回车为 1 4 3 6): ", "1 4 3 6")
- try:
- a, m, b, n = map(int, raw.split())
- if m <= 0 or n <= 0:
- raise ValueError
- except ValueError:
- print("格式应为四个整数 a m b n;使用预设。")
- a, m, b, n = 1, 4, 3, 6
- print(f"\n合并 x≡{a} (mod {m}) 与 x≡{b} (mod {n})")
- result = merge(a, m, b, n)
- if result is None:
- print("不兼容:两只时钟永远不会同时指向这些余数。")
- else:
- value, modulus = result
- print(f"验算:{value}%{m}={value % m},{value}%{n}={value % n};以后每隔 {modulus} 重复。")
- def main() -> None:
- choice = ask("选择 x=XOR 消元,c=CRT 合并(回车为 x): ", "x").lower()
- if choice == "c":
- crt_lab()
- else:
- xor_lab()
- if __name__ == "__main__":
- main()
|