CINTA_EXT_01

CINTA拓展作业一

GF乘法逆元及求逆元操作

定义集合\(GF=\{0,1\}^8\),即所有8比特长的二进制串集合。定义集合\(GF\)上的加法、乘法如下:

— 加法等同于异或,即任取\(a,b\in GF,a+b\doteq a\oplus b\)

— 乘法置定义乘2 的运算。任取\(a\in GF\),如果\(a\)的最高比特为0,则\(a*2\doteq a<<1\)(左移一个比特)。如果\(a\)的最高比特为1,则\(a*2\doteq (a<<1)\oplus0x1B\),也就是说,左移一个比特之后再异或一个八比特的十六进制值\(0x1B\)。当然,\(a*0\doteqa*2+a\),由此可以得到\(GF\)中任意值的乘法,回顾一下\(Simple-Mul\)的过程。


1、编写程序完成任意\(GF\)中元素的乘法。

# 实现GF中元素乘2的函数
def GFmul2(a):
base_1 = 0b10000000
base_2 = 0x1b
if a & base_1 == 0:
return a << 1
else:
return (a << 1) ^ base_2

# 实现任意乘法
def GF_mul(a, b):
if b == 0:
return 0
if b == 1:
return a
if b & 1 == 0: # 乘数为偶数
return GFmul2(GF_mul(a, b >> 1))
else: # 乘数为奇数
return GFmul2(GF_mul(a, b >> 1)) ^ a

2、请写一个程序GF_inverse完成求逆任务。

def