Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 非线性二进制线性反馈移位寄存器_Python_Math_Language Agnostic - Fatal编程技术网

Python 非线性二进制线性反馈移位寄存器

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

我使用上的说明在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):
    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),或者如何设置最高有效位。你说的“它似乎不起作用”是什么意思?输出不是循环序列。所使用的多项式实际上应该给出一个最大长度的循环序列。您是否有一个引用来证明您所使用的多项式生成了一个最大循环?