我已从stackoverflow成员提出的问题中获取此代码:
def lfsr(seed, taps):
sr, xor = seed, 0
while 1:
for t in taps:
xor += int(sr[t-1])
if xor%2 == 0.0:
xor = 0
else:
xor = 1
print xor
sr, xor = str(xor) + sr[:-1], 0
print sr
if sr == seed:
break
lfsr('11001001', (8,7,6,1))
我理解代码,但我想只打印此LFSR的前10个结果而忽略其他结果。我怎么能在python 3中做到这一点?
答案 0 :(得分:1)
一种简单的方法可以让您更好地控制函数计算的值的使用方法,即将函数转换为生成器。只需将print sr
行替换为yield sr
代替(并先删除print xor
):
def lfsr(seed, taps):
sr, xor = seed, 0
while 1:
for t in taps:
xor += int(sr[t-1])
if xor%2 == 0.0:
xor = 0
else:
xor = 1
sr, xor = str(xor) + sr[:-1], 0
yield sr
if sr == seed:
break
调用该函数的方式需要更改,因为它不再进行任何打印。要复制旧行为,请使用for
循环,如下所示:
for state in lfsr('11001001', (8,7,6,1)):
print state[0] # the xor value
print state # the sr value
要将输出限制为10个值,您可以使用enumerate
修改该循环,并在看到索引10(第11个结果)时执行break
:
for i, state in enumerate(lfsr('11001001', (8,7,6,1))):
if i == 10:
break
# printing or whatever here
可能还有其他方法可以限制结果的数量(例如使用itertools.islice
)。
答案 1 :(得分:0)
再次更改了代码,但不确定它是否正是您所需要的:
def lfsr(seed, taps):
sr, xor = seed, 0
for _ in range(10):
for t in taps:
xor += int(sr[t - 1])
if xor % 2 == 0.0:
xor = 0
else:
xor = 1
# print(xor)
sr, xor = str(xor) + sr[:-1], 0
# print(sr)
if sr == seed:
break
print("Return %s" % sr)
return sr
truth_table = {
'00000': '0',
'00001': '1',
'00010': '1',
...
'11111': '0',
}
lfsr_r = []
lfsr_r.append(lfsr('11001001', (8, 7, 6, 1)))
lfsr_r.append(lfsr('11001001', (3, 4)))
lfsr_r.append(lfsr('11001001', (7, 8)))
lfsr_r.append(lfsr('11001001', (2, 3, 5)))
lfsr_r.append(lfsr('11001001', (1, 4, 7)))
for pos in range(10):
seq = ''
# get [pos] bit from each sequence
for r in lfsr_r:
seq += lfsr_r[r][pos]
result = truth_table[seq]
print("Result for %s column: %s" % (pos, result))
答案 2 :(得分:0)
使用 pylfsr,您可以获得预期的结果。对于 8 位 LFSR 和反馈多项式 [8,7,6,1] (lfsr('11001001', (8,7,6,1)) 的示例,这里是获取前 10 位输出的代码< /p>
import numpy as np
from pylfsr import LFSR
s = '11001001'
s = [int(b) for b in s]
L = LFSR(initstate=s, fpoly=[8,7,6,1])
seq = L.runKCycle(10)
print(seq)
输出
[1 0 0 1 0 0 1 1 0 1]