오류 검출 코드 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""오류 검출 코드 문서의 주장 검증: 홀짝 패리티, 10진 CRC 비유."""
import itertools
def parity(bits):
return sum(bits) % 2 # 짝수 패리티: 1의 개수를 짝수로 맞추는 비트
def main():
data = [1, 0, 1, 1, 0, 0, 1]
p = parity(data); sent = data + [p]
assert p == 0 and sum(sent) % 2 == 0
# 1비트, 3비트 오류는 검출, 2비트 오류는 놓친다
for k, detected in ((1, True), (2, False), (3, True), (4, False)):
for pos in itertools.combinations(range(8), k):
r = list(sent)
for i in pos:
r[i] ^= 1
assert (sum(r) % 2 != 0) == detected
# 문서 본문의 10진 비유: 젯수 11, 데이터 331 → 3311
x = next(d for d in range(10) if (3310 + d) % 11 == 0)
assert x == 1 and 3311 % 11 == 0
assert 3310 % 11 != 0 and 2311 % 11 != 0 # 검출
assert 2211 % 11 == 0 # 놓침
# 젯수 10이면 마지막 자리만 본다: 앞자리 오류는 모두 놓친다
assert all((d * 1000 + 310) % 10 == 0 for d in range(10))
# 카드 C2: 젯수 7, 데이터 52 → 52x가 7로 나누어떨어지는 x
assert [d for d in range(10) if (520 + d) % 7 == 0] == [5]
print("ALL CHECKS PASSED")
if __name__ == "__main__":
main()