Algorithm 得到x。“的价值”;线性同余发生器“;

Algorithm 得到x。“的价值”;线性同余发生器“;,algorithm,Algorithm,我有一个“线性同余生成器”,它为我的2生成随机键。费兹·奥特。我基本上需要有一个种子,我将在客户端和服务器上生成一个密钥,这样我就不必发送它 问题是,如果用户长时间不使用客户机,那么它必须在获得当前密钥之前生成大量密钥。公式是 s1=(a*s0+2)mod m我需要这个序列的第n个成员。首先,LCG用于身份验证,真的吗?这对我来说是个坏主意 但不管怎样,回到问题上来: s(i+1) = (a*s(i) + 2) mod m s(i+2) = (a*(a*s(i) + 2) + 2) mod m

我有一个“线性同余生成器”,它为我的2生成随机键。费兹·奥特。我基本上需要有一个种子,我将在客户端和服务器上生成一个密钥,这样我就不必发送它

问题是,如果用户长时间不使用客户机,那么它必须在获得当前密钥之前生成大量密钥。公式是
s1=(a*s0+2)mod m
我需要这个序列的第n个成员。

首先,LCG用于身份验证,真的吗?这对我来说是个坏主意

但不管怎样,回到问题上来:

s(i+1) = (a*s(i) + 2) mod m
s(i+2) = (a*(a*s(i) + 2) + 2) mod m = a^2*s(i) + 2*(a+1) mod m
s(i+4) = (a^2*(a^2*s(i) + a*2+2) + a*2+2) mod m = a^4*s(i) + 2*(a^3+a^2+a+1) mod m
通过递归

s(i+2^n) = a^2^n * s(i) + 2*(a^2^n-1)/(a-1)

然后要快进
n
步骤,只需用二进制写
n
,然后在
log_2(n)
步骤中使用上述公式即可。

首先,LCG用于身份验证,真的吗?这对我来说是个坏主意

但不管怎样,回到问题上来:

s(i+1) = (a*s(i) + 2) mod m
s(i+2) = (a*(a*s(i) + 2) + 2) mod m = a^2*s(i) + 2*(a+1) mod m
s(i+4) = (a^2*(a^2*s(i) + a*2+2) + a*2+2) mod m = a^4*s(i) + 2*(a^3+a^2+a+1) mod m
通过递归

s(i+2^n) = a^2^n * s(i) + 2*(a^2^n-1)/(a-1)

然后要快进
n
步骤,只需将
n
写成二进制,然后使用上面的公式在
log_2(n)
步骤中进行操作。

这仅用于学校目的。我不打算在其他地方使用它,所以我将使用哪种类型的伪随机发生器并不重要。我会在测试它是否有效后立即将其标记为答案:)这个答案很好,但我认为最终的公式适用于任意n,而不仅仅是2的幂,因此如果用
n
的形式编写,它会更清晰,不
2^n
。您只需要使用
n
的二进制表示形式,以便通过平方进行有效的幂运算。(当你用模运算法计算a^n时,你应该计算mod(m*(a-1),这样除法就行了。).这只是为了学校的目的。我不打算在其他地方使用它,所以我将使用哪种类型的伪随机发生器都没关系。我会在测试它工作后立即将它标记为答案:)这个答案很好,但我认为最后的公式对任何n都有效,不仅仅是2的幂,因此,如果它是按照
n
而不是
2^n
的方式编写的,那么就更清楚了。您只需要使用
n
的二进制表示形式,以便通过平方进行有效的幂运算。(当你用模运算法计算a^n时,你应该计算出mod(m*(a-1),这样除法就行了。)。