Php 创建双射以获取具有已知最大值的无序计数器

Php 创建双射以获取具有已知最大值的无序计数器,php,algorithm,math,cryptography,entropy,Php,Algorithm,Math,Cryptography,Entropy,我有一个已知最大值的计数器(称为max)最大值可以很大(实际上是36^40-1或62^40-1) 我想要一个从[0..max]到[0..max]的双射b(n+1)不容易从b(n)猜到 我不是在寻找一个加密安全的函数,我只是想要尽可能多的熵来模糊计数器的输出 该函数必须在PHP中可行。这允许使用PHP的所有功能。我认为这个问题在当前的形式下是无法回答的。标准 b(n+1)不容易从b(n) 定义不明确。您没有给出度量或可量化的约束。由于您继续写道您“不搜索加密安全函数”,并在评论中提到您“并不真正关

我有一个已知最大值的计数器(称为
max
)<代码>最大值可以很大(实际上是
36^40-1
62^40-1

我想要一个从
[0..max]
[0..max]
的双射
b(n+1)
不容易从
b(n)
猜到

我不是在寻找一个加密安全的函数,我只是想要尽可能多的熵来模糊计数器的输出


该函数必须在PHP中可行。这允许使用PHP的所有功能。

我认为这个问题在当前的形式下是无法回答的。标准

b(n+1)
不容易从
b(n)

定义不明确。您没有给出度量或可量化的约束。由于您继续写道您“搜索加密安全函数”,并在评论中提到您“并不真正关心任何人是否找到该函数”,因此不清楚您为什么需要双射

然而,这里有一些想法可以帮助你找到一个你满意的双射,或者澄清你的问题,让其他人可以帮助你

任何线性多项式可逆模
max
都可以工作。也就是说,一个多项式的形式

b(n) = a*n + b mod max 
给出一个双射当且仅当

gcd(a,max) = 1 
最简单的情况是
a=1
b=0
,因此
b(n)=n
,这似乎满足了您的模糊约束


如果你想喜欢它,你可以经常改变
a
b
,比如说生成一个随机数(但一定要检查
gcd(a,max)=1,否则你就不会得到双射)。

你有什么办法?您在什么时候被卡住了?为什么需要b^2=1?这听起来像是一个很强的限制。如果你想处理这么大的数字,你可能必须使用PHP中的GMP库。仅供参考。对不起,我的错。我不需要
b(b(n))=n
。“不过,我确实想要一个双射。@PengOne:我不知道我可以用什么双射来获得我正在搜索的熵。谢谢你,你给了我我正在搜索的东西。”。出于好奇,有没有一种方法可以得到一个不同阶数的多项式,保证它是一个双射?其他度数的限制条件是什么?@Frizlab对于更高的度数,函数是否可逆取决于max的数论性质。这是一个有趣的问题,但答案会让你进一步深入数论,远离你的应用。确保
gcd(a,max)的最简单方法=1可能是始终为
a
选择一个素数。