LFSR 代码给出了错误的结果

LFSR code is giving wrong result

我有 LFSR 的代码但得到了错误的结果,前 8 位应该是 01110010 但我得到的是 0101111001。

我说的是 Galois LSFR:en.wikipedia。org/wiki/Linear-feedback_shift_register

谁能看出这段代码有什么问题?

def lfsr(seed, taps):
  for i in range(10):
      nxt = sum([ seed[x] for x in taps]) % 2
      yield nxt
      seed = ([nxt] + seed)[:max(taps)+1]



for x in lfsr([0,0,1,1,1,0,0,1],[6,5,1]) :
  print x

我对发布的问题 "Can anyone see what the problem is with this code?" 的回答是否定的。该代码是可操作的,实现了 LFSR(经常用于在硬件中处理伪随机信号的类型,以及流行的 CRC 函数的基础)。我只能猜测你为什么不这么认为。

这种类型的 LFSR 可以可视化为带抽头的移位寄存器:

pos   0 1 2 3 4 5 6 7
reg   0 0 1 1 1 0 0 1
    ^-  +       + +

每次迭代,从抽头计算一个值并插入一端,移动其他值。在这种情况下,新位变为 LSB。那么让我们 运行 这个 LFSR 几个周期:

taps    +       + +
pos   0 1 2 3 4 5 6 7
reg   0 0 1 1 1 0 0 1
c1    0 0 0 1 1 1 0 0
c2    1 0 0 0 1 1 1 0
c3    0 1 0 0 0 1 1 1
c4    1 0 1 0 0 0 1 1
c5    1 1 0 1 0 0 0 1
c6    1 1 1 0 1 0 0 0
c7    1 1 1 1 0 1 0 0
c8    0 1 1 1 1 0 1 0

请注意,我们从 c1 向下读取列 0 中产生的输出位。顺便说一下,位置 7 不需要存在,因为没有那么远的水龙头;代码中的切片删除了这些列。

我已经通过反转八个周期的输入和输出成功地重现了你所说的你得到的值。你能解释一下你是如何得出你认为应该的价值的吗?

我可以想象得到类似值的一种方法是换另一种方式并在一个周期后观察移位寄存器的状态。这需要在活动抽头之后保持其宽度(在 CRC 使用中并不罕见)。

taps    +       + +  -v
pos   0 1 2 3 4 5 6 7
reg   0 0 1 1 1 0 0 1
c1    0 1 1 1 0 0 1 0
c2    1 1 1 0 0 1 0 0
c3    1 1 0 0 1 0 0 0
c4    1 0 0 1 0 0 0 1

但即便如此输出还是0001010111(这次读入第7列)。