ウィキペディアの手順を使用して、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) 以外のガロア体を処理できる一般化されたバージョンを作成することですが、非バイナリ LFSRに関するセクションがわかりません。この部分は私には意味がありません:「フィードバック ビット (出力ビット) は、特定のタップ ポイントごとに一定である q-ary 値で乗算 (モジュロ q) されます。」1 つの出力ビットに各タップ ポイントの値を乗算するにはどうすればよいですか?
これは私が思いついたものですが、循環シーケンスを与える代わりに、出力はすぐにすべて 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) ]