Создайте биекцию, чтобы получить неупорядоченный счетчик с известным максимумом - PullRequest
1 голос
/ 18 января 2012

У меня есть счетчик с известным максимумом (называется max). max может быть большим (на самом деле это будет либо 36^40 - 1, либо 62^40 - 1).

Мне нужна биекция b от [0..max] до [0..max] со следующим свойством: b(n+1) трудно угадать из b(n).

Я НЕ ищу криптографически безопасную функцию, я просто хочу как можно больше энтропии, чтобы немного запутать вывод счетчика.

Функция должна выполняться в PHP. Это позволяет использовать все функции, которые выполняет PHP.

1 Ответ

3 голосов
/ 18 января 2012

Я не считаю этот вопрос ответственным в его нынешнем виде.Критерий

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 или вы не получите биекцию).

...