该寄存器可以保存一个二进制位集。
两种方法将位加载到寄存器中:①并行加载,位同时加载 ②使用移位寄存器来加载。
在移位时,每个位均往右移一位,最右边的位被丢弃,而最左边的位被输入位代替。
标8位移位寄存器并行加载题 标题移入一个0后的寄存器内容最简单的反馈移位寄存器。
一般由两部分组成:①移位寄存器 ②反馈函数
每次移位寄存器中所有位右移一位,新的最左端的位根据寄存器中某些位计算得到,由寄存器某些位计算最左端的部分被称为反馈函数。
反馈函数是寄存器中某些位简单异或,这些位叫做抽头,有时也叫Fibonacci配置。
移位寄存器是由位组成的序列,其长度用位来表示,如果它是n位长,则称其为n级移位寄存器。
移位寄存器输出的一个位常常是最低有效的位。
移位寄存器的周期是指输出序列从开始到重复时的长度。
一个n位移位寄存器的当前存储内容能够处于2^n-1个状态中的任意一个。所以理论上,n级LFSR的输出序列在重复之前能够产生2^n-1位长的伪随机序列(是2^n-1而不是2^n,是因为全0的状态将使LFSR无止境地输出0序列)。
只有特定抽头序列的LFSR才能循环地遍历所有2^n-1个内部状态,且此时输出序列被称为m序列。
为了使LFSR生成最大周期序列,其生成多项式(由抽头序列加上常数1形成的多项式)必须是本原多项式,多项式的阶数为移位寄存器的级数。
选择一个15次以上的不可约多项式,编写一个线性反馈移位寄存器。验证生成序列的周期。
def lfsr(ai, t):
array_init = ai #初始位
tap_init = t #抽头
tap = tap_init[0:]
tap_len=len(tap) #抽头长度
array_init_bin = '{:0{taplen}b}'.format(array_init,taplen=tap_len) #把初始位转化为二进制 ‘:0{taplen}b’中‘tapen’为占位符
#print("二进制为:",array_init_bin)
array_init_bin=list(array_init_bin)
#其实应该可以直接array_init_bin=list(array_init_bin)
array_new = '0' * len(array_init_bin) #创建变量与array_init_bin长度相同的字符串
array_new = list(array_new) #将字符串转换为列表
for i in range(len(array_init_bin)):
array_new[i] = str(array_init_bin[i])
#print(array_new[0])
with open('series.txt', 'a+') as f: # 将序列写入txt
f.write(str(array_new[0]) ) #array_new[0]为输出序列
xorNum = int(array_new[0])
for k in range(1, len(array_init_bin)):
if (tap[k] == '1'):
xorNum ^= int(array_new[k])
for i in range(len(array_init_bin)-1): #寄存器右移,输入反馈部分
j = i + 1
array_new[i] = str(array_new[j])
array_new[len(array_init_bin) - 1]=str(xorNum)
array_new = ''.join(array_new)
return int(array_new, 2) #将移位寄存器转换成整数
tap=input("请输入抽头:")
init=pow(2,len(tap))-1 #初始的位为2^n-1
primary = init
tt=1 #初始周期为1
#print("序列密码为:")
for i in range(4294967299): #计算移位寄存器的周期
init = lfsr(init, tap)
if(init!=primary):
tt+=1
else:
break
print('序列周期为:',tt)