请帮助我理解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中导出的。

10-07 18:56