设 a ‾ = ( a 0 , , a 1 , ⋯ , a N − 1 ) \underline{a}=\left( a_{0,},a_1,\cdots ,a_{N-1} \right) a=(a0,,a1,⋯,aN−1) 是 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=c1ak−1+c2ak−2+⋯+clak−l,k=l,l+1,⋯,N−1
则称 < 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算法便可以有效地求出。
任意给定一个N长序列 a ‾ = ( a 0 , , a 1 , ⋯ , a N − 1 ) \underline{a}=\left( a_{0,},a_1,\cdots ,a_{N-1} \right) a=(a0,,a1,⋯,aN−1),规定 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=0,n=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)xln,c0(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)an−1+⋯+cln(n)an−ln
(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+1,ln+1=n+1
(ii)当 l m < l m + 1 = l m + 2 = ⋯ = l n l_m
<1>如果 m − l m ≥ n − l n m-l_m\geq n-l_n m−lm≥n−ln,那么取
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)−dndm−1x(m−lm)−(n−ln)fm(x)=fn(x)+x(m−lm)−(n−ln)fm(x)
<2>如果 m − l m < n − l n m-l_m
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(n−ln)−(m−lm)fn(x)−dndm−1fm(x)=x(n−ln)−(m−lm)fn(x)+fm(x)
3、不断重复步骤2,直至 n = N − 1 n=N-1 n=N−1,最后得到的 < f N ( x ) , l N > \left< f_N\left( x \right) ,l_N \right> ⟨fN(x),lN⟩便是产生序列 a ‾ \underline{a} a的最短线性移位寄存器。
# @ 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(" ")
本文的BM算法是定义在二元域上:
●在计算d时,需要使用d = d % 2后,在判断d取值是否为0。
● 在输出结果前需要对f_min进行压缩,x^n有偶数次则不输出。
测试序列为:
m序列与BM算法(密码学)
python-----删除列表中某个元素的3种方法
删除列表中重复元素的几种方法
Python获取列表元素出现次数
[Python]正确复制列表的方法