请帮助我理解bbs算法。我做到了:
class EmptySequenseError(Exception):
pass
class BlumBlumShub(object):
def __init__(self, length):
self.length = length
self.primes = e(1000) # Primes obtained by my own Sieve of Eratosthenes implementation.
def get_primes(self):
out_primes = []
while len(out_primes) < 2:
curr_prime = self.primes.pop()
if curr_prime % 4 == 3:
out_primes.append(curr_prime)
return out_primes
def set_random_sequence(self):
p, q = self.get_primes()
m = p * q
self.random_sequence = [((x+1)**2)%m for x in range(self.length)]
def get_random_sequence(self):
if self.random_sequence:
return self.random_sequence
raise EmptySequenseError("Set random sequence before get it!")
我有几个问题。一开始我不想使用
random
库,这太天真了。我的序列在增加,它不是绝对随机的如何防止返回序列增加?我不理解算法描述的这一部分:在算法的每一步,都从xn+1导出一些输出;输出通常是xn+1的位奇偶校验或xn+1的一个或多个最低有效位。
请向我解释这是什么意思?
编辑摘要:
算法得到修正。
引用替换为en.wikipedia引用。
最佳答案
for x in range(self.length):
self.random_sequence.append((x ** 2) % m)
只生成
[(x ** 2) % m for x in range(self.length)]
,大约是xn+1=n2 mod M。算法应该是:xn+1=xn2 mod m
你看到你的版本有什么不同吗?
至于报价-你没有说它来自哪里,但是Wikipedia有:
在算法的每一步,都从xn+1导出一些输出;输出通常是xn+1的位奇偶校验或xn+1的一个或多个最低有效位。
这意味着xn+1是下一次迭代的种子,而不是返回的伪随机数。相反,返回值是通过计算xn+1的位奇偶校验(每次迭代产生0或1)或只取一些顶位从xn+1中导出的。