python字符串实现GF(2^8)中的多项式乘法

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值