Python 非线性二进制线性反馈移位寄存器
我使用上的说明在Python中编写了Galois线性反馈移位寄存器:Python 非线性二进制线性反馈移位寄存器,python,math,language-agnostic,Python,Math,Language Agnostic,我使用上的说明在Python中编写了Galois线性反馈移位寄存器: def lfsr(coefficients, state): while 1: lsb = state.pop() state.insert(0, 0) if lsb: state = app(coefficients, state) yield lsb def app(coefficients, state): ret
def lfsr(coefficients, state):
while 1:
lsb = state.pop()
state.insert(0, 0)
if lsb:
state = app(coefficients, state)
yield lsb
def app(coefficients, state):
return [ (coefficients[i]^state[i]) for i in range(len(state)) ]
L = lfsr([1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1], [0]*15+[1])
seq = [ str(L.next()) for i in range(2**16+16) ]
这个很好用。我现在想做的是编写一个通用版本,它可以处理GF(2)以外的伽罗瓦字段,但我不理解关于它的部分。这一部分对我来说毫无意义:“反馈位(输出位)乘以(模q)每个特定抽头点恒定的q进制值。”如何将单个输出位乘以每个抽头点的值
这就是我想到的,但不是给出一个循环序列,而是输出迅速恶化为所有0:
# Multiplication table for GF(4)
mult_4 = [[0, 0, 0, 0],
[0, 1, 2, 3],
[0, 2, 3, 1],
[0, 3, 1, 2]]
def lfsr(coefficients, state):
while 1:
lsb = state.pop()
state.insert(0, 0)
state = app(coefficients, state)
yield lsb
def app(coefficients, state):
return [ mult_4[coefficients[i]][state[i]] for i in range(len(state)) ]
L = lfsr([ 1, 0, 0, 0, 1, 2, 3 ], [1]*6)
seq = [ str(L.next()) for i in range(4**6+6) ]
你可以在math.stackoverflow.com上询问Galois字段下的乘法,但其要点是,每个“位”不是“位”,即每个位是0或1(GF_2),而是实际上是一系列符号中的一个——确切的数字取决于字段的大小 要从二进制LFSR转换为伽罗瓦LFSR,必须推广“位”和“乘法”的概念,才能在该领域有意义。字段中的乘法运算加法也将取代
app()
函数中的异或运算
在二进制版本中,乘法是隐式的;根据抽头是否存在,输出位乘以0或1。在常规字段中,tap本身可以有与之关联的任何字段元素,然后将其乘以输出。我建议您熟悉的概念(尽管Wikipedia的文章技术性太强,无法做出最好的介绍)。你似乎遇到的最基本的问题是,你试图太过接近地模拟二进制移位寄存器,当你把它看作一个离散的动力系统,而不是一个电路时,你没有完全理解发生了什么 二进制移位寄存器是一种聪明的电路,它计算
X^N
除以f(X)
后的余数,其中f
的所有系数都在Z/2Z
环中,该环只包含0和1。这些余数是用欧几里德算法计算的,就像计算整数的余数一样。在该模型中,LFSR的状态是小于f
次数的多项式。LFSR的第一个状态是1
,第二个状态是X
。LFSR中的每个循环等于乘以X
,然后再乘以一步长除法。移位运算是乘法,抽头是长除法。这里的核心是分工
[旁白:您可以使用任意环作为此构造的系数,但零除数作为除数多项式的前导系数的问题使事情变得复杂。因为您使用的是字段,所以我将仅讨论字段作为系数。]
如果使用的是系数环而不是位环,则需要考虑长除法的一步是什么样子。如果除数多项式f
看起来像a_kx^k+…
,而新状态g
看起来像b_kx^k+…
,那么长除法的第一步就是计算b_k/a_k
。对于一个字段(我假设),这是一个数字c
。因此余数是g-cf
,这是一个次数为k-1
的多项式。剩下的就是你的新州
(表达式
cf
是理解维基百科文章中让你困惑的部分的关键。你可能想说服自己,你可以将一个多项式f
除以它的前导系数a_k
,得到另一个生成序列的多项式,该序列只是第一个序列的倍数。)我想我理解了这一部分,但我不明白的是,例如,多项式的常数项会发生什么变化(在二进制情况下似乎总是1),或者如何设置最高有效位。你说的“它似乎不起作用”是什么意思?输出不是循环序列。所使用的多项式实际上应该给出一个最大长度的循环序列。您是否有一个引用来证明您所使用的多项式生成了一个最大循环?