Berlekamp-Massey算法及python代码实现

1. Berlekamp-Massey算法原理介绍

1.1 基本概念简介

  设 a ‾ = ( a 0 , , a 1 , ⋯   , a N − 1 ) \underline{a}=\left( a_{0,},a_1,\cdots ,a_{N-1} \right) a=(a0,,a1,,aN1) F 2 F_2 F2上的长度为N的序列, F 2 F_2 F2上的多项式为:
f ( x ) = c 0 + c 1 x + c 2 x 2 + ⋯ + c l x l f\left( x \right) =c_0+c_1x+c_2x^2+\cdots +c_lx^l f(x)=c0+c1x+c2x2++clxl
  其中 c 0 = 1 c_0 = 1 c0=1。如果序列中的元素满足递推关系:
a k = c 1 a k − 1 + c 2 a k − 2 + ⋯ + c l a k − l , k = l , l + 1 , ⋯   , N − 1 a_k=c_1a_{k-1}+c_2a_{k-2}+\cdots +c_la_{k-l},k=l,l+1,\cdots ,N-1 ak=c1ak1+c2ak2++clakl,k=l,l+1,,N1
  则称 < f ( x ) , l > \left< f\left( x \right) ,l \right> f(x),l产生二元序列 a ‾ \underline{a} a。其中 < f ( x ) , l > \left< f\left( x \right) ,l \right> f(x),l表示以 f ( x ) f\left( x \right) f(x)为反馈多项式的 l l l级线性移位寄存器。如果 f ( x ) f\left( x \right) f(x)是一个能产生 a ‾ \underline{a} a并且级数最小的线性移位寄存器的反馈多项式, l l l是该移存器的级数,则称 < f ( x ) , l > \left< f\left( x \right) ,l \right> f(x),l为序列 a ‾ \underline{a} a的线性综合解。
  给定一个N长二元序列 a ‾ \underline{a} a,求能产生 a ‾ \underline{a} a并且级数最小的线性移位寄存器,就是求 a ‾ \underline{a} a的线性综合解。利用B-M算法便可以有效地求出。

1.2 B-M算法流程

  任意给定一个N长序列 a ‾ = ( a 0 , , a 1 , ⋯   , a N − 1 ) \underline{a}=\left( a_{0,},a_1,\cdots ,a_{N-1} \right) a=(a0,,a1,,aN1),规定 f 0 ( x ) = 1 f_0\left( x \right) =1 f0(x)=1是生成序列 a ‾ \underline{a} a的前0位的最低次多项式,假定 f 0 ( x ) , f 1 ( x ) , ⋯   , f n ( x ) f_0\left( x \right) ,f_1\left( x \right) ,\cdots ,f_n\left( x \right) f0(x),f1(x),,fn(x)依次是 a ‾ \underline{a} a的前0位、前1位,……前n位的最低次多项式,其次数分别为 l 0 , l 1 . . . , l n l_0,l_1...,l_n l0,l1...,ln。BM算法流程如下:
  1、取初始值: f 0 ( x ) = 1 , l 0 = 0 , n = 0 f_0\left( x \right) =1,\quad l_0=0\text{,}n=0 f0(x)=1,l0=0n=0
  2、假设 < f 0 ( x ) , l 0 > , < f 1 ( x ) , l 1 > , ⋯   , < f n ( x ) , l n > \left< f_0\left( x \right) ,l_0 \right> ,\left< f_1\left( x \right) ,l_1 \right> ,\cdots ,\left< f_n\left( x \right) ,l_n \right> f0(x),l0,f1(x),l1,,fn(x),ln均已经求得,下面计算 f n + 1 ( x ) f_{n+1}\left( x \right) fn+1(x)以及 l n + 1 l_{n+1} ln+1。记 f n ( x ) = c 0 ( n ) + c 1 ( n ) x + ⋯ c l n ( n ) x l n , c 0 ( n ) = 1 f_n\left( x \right) =c_{0}^{\left( n \right)}+c_{1}^{\left( n \right)}x+\cdots c_{l_n}^{\left( n \right)}x^{l_n}\text{,}c_{0}^{\left( n \right)}=1 fn(x)=c0(n)+c1(n)x+cln(n)xlnc0(n)=1,再计算:
d n = c 0 ( n ) a n + c 1 ( n ) a n − 1 + ⋯ + c l n ( n ) a n − l n d_n=c_{0}^{\left( n \right)}a_n+c_{1}^{\left( n \right)}a_{n-1}+\cdots +c_{l_n}^{\left( n \right)}a_{n-l_n} dn=c0(n)an+c1(n)an1++cln(n)anln
  (1)若 d n = 0 \boldsymbol{d}_{\boldsymbol{n}}=0 dn=0,即 f n ( x ) f_n\left( x \right) fn(x)能生成 a ‾ \underline{a} a的前n+1项,则令:
f n + 1 ( x ) = f n ( x ) , l n + 1 = l n f_{n+1}\left( x \right) =f_n\left( x \right) ,\quad l_{n+1}=l_n fn+1(x)=fn(x),ln+1=ln
  (2)若 d n = 1 \boldsymbol{d}_{\boldsymbol{n}}=1 dn=1,即 f n ( x ) f_n\left( x \right) fn(x)不能生成 a ‾ \underline{a} a的前n+1项,
    (i)当 l 0 = l 1 = ⋯ = l n = 0 l_0=l_1=\cdots =l_n=0 l0=l1==ln=0时,取 f n + 1 ( x ) = 1 + x n + 1 , l n + 1 = n + 1 f_{n+1}\left( x \right) =1+x^{n+1}\text{,}l_{n+1}=n+1 fn+1(x)=1+xn+1ln+1=n+1

    (ii)当 l m < l m + 1 = l m + 2 = ⋯ = l n l_mlm<lm+1=lm+2==ln时:
      <1>如果 m − l m ≥ n − l n m-l_m\geq n-l_n mlmnln,那么取
f n + 1 ( x ) = f n ( x ) − d n d m − 1 x ( m − l m ) − ( n − l n ) f m ( x ) = f n ( x ) + x ( m − l m ) − ( n − l n ) f m ( x ) f_{n+1}\left( x \right) =f_n\left( x \right) -d_nd_{m}^{-1}x^{\left( m-l_m \right) -\left( n-l_n \right)}f_m\left( x \right) =f_n\left( x \right) +x^{\left( m-l_m \right) -\left( n-l_n \right)}f_m\left( x \right) fn+1(x)=fn(x)dndm1x(mlm)(nln)fm(x)=fn(x)+x(mlm)(nln)fm(x)
      <2>如果 m − l m < n − l n m-l_mmlm<nln,那么取
f n + 1 ( x ) = x ( n − l n ) − ( m − l m ) f n ( x ) − d n d m − 1 f m ( x ) = x ( n − l n ) − ( m − l m ) f n ( x ) + f m ( x ) f_{n+1}\left( x \right) =x^{\left( n-l_n \right) -\left( m-l_m \right)}f_n\left( x \right) -d_nd_{m}^{-1}f_m\left( x \right) =x^{\left( n-l_n \right) -\left( m-l_m \right)}f_n\left( x \right) +f_m\left( x \right) fn+1(x)=x(nln)(mlm)fn(x)dndm1fm(x)=x(nln)(mlm)fn(x)+fm(x)
  3、不断重复步骤2,直至 n = N − 1 n=N-1 n=N1,最后得到的 < f N ( x ) , l N > \left< f_N\left( x \right) ,l_N \right> fN(x),lN便是产生序列 a ‾ \underline{a} a的最短线性移位寄存器。

2. Python代码实现

2.1 编程思路

  根据1.2中BM算法流程,编写程序的流程图如下:
Berlekamp-Massey算法及python代码实现_第1张图片

2.2 python源代码

# @ BM算法求序列的最低次多项式(二元域)
# @ 2020.11.20 
def BM(sequence): 
    f_min = [0]  #最低次多项式 
    l = [0]      #记录每一次最低次多项式次数 
    for i in range(len(sequence)):
        d = 0           
        for j in f_min:  #计算每一次的d值
            d += sequence[i+j-max(l)]  #mod问题、序列问题
        d = d %2            
        if d == 0:       #d为0时
            l.append(l[i])     
        else:            #d不为0时
            if the_same(l):       #d不为0且l列表中数字相同时
                n = i
                fn = f_min.copy()           #copy问题
                f_min.append(i+1)
                l.append(i+1)
            else:                 #d不为0时且l列表中数字不同时 
                if max(f_min) > max(fn):  #用于记录m以及fm的值    
                    m = n 
                    fm = fn.copy()
                n = i
                fn = f_min.copy()
                if m-l[m] >= n-l[n]: 
                    f_min += [j+(m-l[m]-n+l[n]) for j in fm]
                else:
                    f_min = [j+(-m+l[m]+n-l[n]) for j in f_min] + fm
                l.append(max(f_min))     
    f_min = condense(f_min)                
    return f_min

def condense(f_min):    #压缩f多项式,即相同的阶数利用二元加法合并排序后返回 
    f = list(set(f_min))
    for i in f_min:
        if f_min.count(i) % 2 ==0:
            if i in f:
                f.remove(i)
    f = sorted(f, reverse=True)        
    return f

def the_same(l):           #判断l列表中的数字是否全部相同 
    for i in range(len(l)-1):
        if l[i]!=l[i+1]:        
            return False
    return True
 
def print_f(f_min):        #还原多项式字符串并返回
    result = ''     
    for i in f_min: 
        if i == 0: 
            result += '1' 
        else: 
            result += 'x^' + str(i) 
        if i != f_min[-1]: 
            result += '+' 
    return result 
 
def Seq2list(sequence):    #将字符串转为int形列表 
    result = [] 
    for i in sequence: 
        result.append(int(i)) 
    return result 

if __name__ == "__main__":
    seq = ['10010000111101000011100000011', '00001110110101000110111100011', '10101111010001001010111100010']
    for S in seq: 
        f_min = BM(Seq2list(S)) 
        print('输入序列:' + S)  
        print('最低次多项式:' + print_f(f_min)) 
        print('最低次数:' + str(max(f_min))) 
        print(" ")

2.3 注意事项

  本文的BM算法是定义在二元域上:
   ●在计算d时,需要使用d = d % 2后,在判断d取值是否为0。
   ● 在输出结果前需要对f_min进行压缩,x^n有偶数次则不输出。

2.4 结果测试

测试序列为:

10010000111101000011100000011
00001110110101000110111100011
10101111010001001010111100010
Berlekamp-Massey算法及python代码实现_第2张图片

参考文献

m序列与BM算法(密码学)

python-----删除列表中某个元素的3种方法

删除列表中重复元素的几种方法

Python获取列表元素出现次数

[Python]正确复制列表的方法

你可能感兴趣的:(python,密码学)