1.在GF(28)中,计算f(x)*g(x)mod m(x);
2.通过编程实现算法:以二进制方式多项式,输入f(x),g(x)及m(x),输出结果。
【实验内容】参考教材p88的技巧
验证例子:
例1. 设f(x)=x6+x4+x2+x+1,g(x)=x7+x+1,模m(x)=x8+x4+x3+x+1,采用二进制运算方式,求解f(x)*g(x) mod m(x)。
乘法技巧:f(x)左移1位,后面补0,然后,如果丢失的最高位是1的话,异或m(x)-x8的二进制表示。
计算f(x)*g(x)=01010111*10000011。
f(x)*1=(01010111)*(00000001)=(01010111)
f(x)*x=(01010111)*(00000010)=(10101110)
f(x)*x2=(01010111)*(00000100)=(01011100)⊕(00011011)=(01000111)
f(x)*x3=(01010111)*(00001000)=(10001110)
f(x)*x4=(01010111)*(00010000)=(00011100)⊕(00011011)=(00000111)
f(x)*x5=(01010111)*(00100000)=(00001110)
f(x)*x6=(01010111)*(01000000)=(00011100)
f(x)*x7=(01010111)*(10000000)=(00111000)
所以
f(x)*g(x)=(01010111)*(10000011)
=(01010111)*[(00000001)⊕(00000010)⊕(10000000)]
=(01010111)⊕(10101110)⊕(00111000)
=(11000001)
结果等价于x7+x6+1。
def zeroreplace(g):#去除最高位
return g[1:]
def poly_add_sub(a,b): 各位异或运算,与模加法等价
if len(b)>len(a):
a,b=b,a
r=''
for i in range(0,len(a)-len(b)):
r+=a[i]
for i in range(len(b)):
if a[i+len(a)-len(b)]==b[i]:
r+='0'
else:
r+='1'
r.lstrip('0')
return r
def gf_mul(f,g,m):#f,g都是8位
lis=[f]
r=''
m=zeroreplace(m)
lenth=len(f)
for i in range(7):
if f[0]=='0':
f=f[1:]+'0'
else:
f =f[1:]+'0'
f=poly_add_sub(f,m)
lis.append(f)
print('计算f(x)*x^n的结果为:\n',lis)
for i in range(7,-1,-1):
if g[i]=='1':
r=poly_add_sub(lis[7-i],r)
print('r=',r)
return r
#例1
f='01010111'
g='10000011'
m='100011011'
ans=gf_mul(f,g,m)
print('例题1:f(x)*g(x)=',ans)
#例2
f='01001101'
g='10011001'
m='100011101'
ans=gf_mul(f,g,m)
print('例题2f(x)*g(x)=',ans)