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()