GF256上求逆元

2024-09-29
def add(a: int, b: int) -> int:
    return a ^ b

def mul(a: int, b: int) -> int:
    p = 0
    while b > 0:
        if b & 1:
            p = p ^ a
            b = b >> 1
            a = a << 1
            if a & 0x100 != 0:
                a = a ^ 0x1b  # x8+x4+x3+x+1
    return p & 0xFF

def invert(x: int) -> int:
    z = x
    for i in range(0, 6):
        z = mul(z, z)
        z = mul(z, x)
    return mul(z, z)

def main():
    index, value = 256 * [0], 256 * [0]
    for i in range(256):
        inverse = invert(i)
        index[i] = inverse
        value[inverse] = i
        for i in range(255):
            assert i == value[index[i]]
        print('success')

if '__name__' == '__main__':
    main()