在Sage工作,基本上是python,我相信。我给出了以下代码。
def lfsr_1(regs,tabs):
I=regs
leng=len(I)
count=0
while True:
FB=0
print "Before"
print I
print regs
print temp
for i in range(0,leng):
FB=FB+tabs[i]*I[i] //Calculating the feedback value
for i in range(0,leng):
regs[leng-(i+1)]=regs[leng-(i+1)-1] //Shifting regs one bit to the right
I[0]=FB //Adding the feedback at the end
count=count+1 //Incrementing count value which will contain the periodicity
print "After"
print I
print regs
print temp
if (I==regs): //End when the initial state is repeated again. Now, count will contain the periodicity
break
输入变量初始化如下
tabs=[GF(2)(1),0,0,1,1,1]
regs=[GF(2)(0),1,1,0,1,1]
temp=regs
然而,我得到一个输出:
Before
[0, 0, 1, 1, 0, 1]
[0, 0, 1, 1, 0, 1]
[0, 0, 1, 1, 0, 1]
After
[0, 0, 0, 1, 1, 0]
[0, 0, 0, 1, 1, 0]
[0, 0, 0, 1, 1, 0]
不知道这是怎么发生的,因为'我'和'regs'一起变化。 '我'永远不会改变代码。我的任务有问题吗?
附录:尝试实现线性反馈移位寄存器。代码用于计算LFSR的周期性。 regs是初始状态,我习惯于检查regs何时再次返回初始状态(计算周期性),temp只是一个测试变量,看看是否还会移动另一个初始化变量。
答案 0 :(得分:2)
当然I
与regs
一起发生了变化,因为您完成了这项任务:
I=regs
现在I
和regs
引用相同的列表。这就是Python的工作原理。一个列表变量只是引用一个列表对象,它不包含整个列表对象。
以下是一个例子:
a = [1,2,3]
b = a
a[1] = 100
print b
也许您想让I
成为regs
的副本。
尝试:
I = regs[:]
当然,如果reg
包含对象,您可能会进行“结构共享”。
答案 1 :(得分:1)
问题在于
行I=regs
执行此操作时,您不会复制regs
的内容,而是将参考复制到regs
。从而使I
和regs
成为相同的数组。