【问题标题】:Non-binary linear feedback shift register非二进制线性反馈移位寄存器
【发布时间】:2012-11-15 22:47:19
【问题描述】:

我使用Wikipedia上的指令用Python写了一个伽罗瓦线性反馈移位寄存器:

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) 以外的伽罗瓦域的通用版本,但我不明白关于 non-binary LFSRs 的部分。这部分对我来说没有意义:“反馈位(输出位)乘以(模 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) ]

【问题讨论】:

  • “它似乎不起作用”是什么意思?
  • 输出不是循环序列。使用的多项式实际上应该给出一个最大长度的循环序列。
  • 您是否有关于您使用的多项式生成最大循环的断言的参考?

标签: python math language-agnostic


【解决方案1】:

我建议您熟悉polynomial rings 的概念(尽管维基百科的那篇文章技术性太强,无法做出最好的介绍)。您似乎遇到的最根本的问题是您试图过于接近地模拟二进制移位寄存器,当您将其视为离散的动态系统而不是电路时,无法完全理解发生了什么。

二进制移位寄存器是一个巧妙的电路,它计算X^N 除以f(X) 时的余数,其中f 的所有系数都在环Z/2Z 中,该环仅包含0 和1。这些余数是用欧几里德算法计算的,就像计算整数的余数一样。此模型中 LFSR 的状态是某个次数小于 f 次数的多项式。 LFSR 的第一个状态是1,第二个是X。 LFSR 中的每个循环都等效于乘以 X,然后是长除法的一个步骤。移位操作是乘法,抽头是长除法。分工确实是这里的核心。

[顺便说一句:您可以使用任意环作为此构造的系数,但零除数作为除数多项式的主要系数的问题使事情变得复杂。反正你用的是字段,我只说字段作为系数。]

如果您使用的是除位以外的系数环,则需要考虑长除法的一步是什么样的。如果除数多项式f 看起来像a_k X^k + ...,新状态g 看起来像b_k X^k + ...,那么长除法的第一步是计算b_k / a_k。对于一个字段(正如我假设的那样),这是一个数字c。所以余数是g - cf,它是一个度数为k-1 的多项式。剩下的就是你的新状态。

(表达式cf是理解维基百科文章中让你感到困惑的部分的关键。你可能想说服自己,你可以将多项式f除以其领先系数a_k得到另一个多项式生成的序列只是第一个序列的倍数。)

【讨论】:

    【解决方案2】:

    您可以在 math.stackoverflow.com 上询问有关 Galois 域下的乘法问题,但其要点是,每个“位”实际上是 1,而不是“位”,其中每个位是 0 或 1 (GF_2)符号的数量——确切的数字取决于字段的大小。

    要从二进制 LFSR 到 Galois LFSR,您必须概括“位”和“乘法”的概念,以便在该领域有意义。 乘法运算字段中的加法也代替了app()函数中的异或。

    在二进制版本中,乘法是隐式的;输出位乘以 0 或 1,具体取决于是否存在抽头。在一般字段中,tap 本身可以具有与之关联的任何字段元素,然后将其乘以输出。

    【讨论】:

    • 我想我理解那部分,例如我不明白的是多项式的常数项(在二进制情况下似乎总是 1)或如何设置最重要的位。
    猜你喜欢
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多