CRC 예제 사다리 문서의 문제 4 풀이 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""CRC 예제 사다리 문제 1~4 검증. XOR 나눗셈은 3.개념집/50_crc_impl.py에서 복사했다."""


def xor_div(dividend, divisor):
    r = list(dividend); k = len(divisor) - 1; q = []; windows = []
    for i in range(len(dividend) - k):
        if r[i] == "1":
            q.append("1"); windows.append("".join(r[i:i + k + 1]))
            for j in range(len(divisor)):
                r[i + j] = "0" if r[i + j] == divisor[j] else "1"
        else:
            q.append("0")
    return "".join(q).lstrip("0") or "0", "".join(r[-k:]), windows


def main():
    q, f, w = xor_div("10011010" + "000", "1101")                             # 문제 1
    assert (q, f) == ("11111001", "101") and w == ["1001", "1001", "1000", "1011", "1100", "1000"]
    q, f, w = xor_div("110101" + "000", "1011")                               # 문제 2
    assert f == "111" and w == ["1101", "1100", "1111", "1000", "1100"]
    q, f, w = xor_div("101110" + "0000", "10011")                             # 문제 3
    assert f == "1011" and w == ["10111", "10000", "11000"]
    assert xor_div("1011101011", "10011")[1] == "0000"
    assert xor_div("10011010111", "1101")[1] == "010"                         # 문제 4 (a)
    e = "00001101000"                                                          # 문제 4 (b): 오류 = C를 옮긴 것
    p = "10011010101"
    bad = "".join("1" if a != b else "0" for a, b in zip(p, e))
    assert xor_div(bad, "1101")[1] == "000"
    print("ALL CHECKS PASSED")


if __name__ == "__main__":
    main()