Псевдослучайная перестановка на лету очень большого набора без повторения и с обратной операцией

У меня очень большой набор значений (0-300000^700), и я хотел бы найти алгоритм, который бы биективно назначал уникальное значение в том же наборе.

Это эквивалент перестановки, но из-за очевидных проблем с памятью это должно быть сделано "на лету". И алгоритм должен был бы быть инвертирован в какой-то момент.

Эта проблема похожа на эту проблему в "библиотеке Вавилона": http://www.fromquarkstoquasars.com/meet-the-digital-library-of-babel-a-complete-combination-of-every-possible-combination-of-letters-ever/

Используется LCG с параметрами, установленными с использованием теоремы Халла-Добелла, чтобы гарантировать отсутствие повторений. Семя используется в качестве начального значения. Чего я не понимаю, так это того, как возможно обратное (то есть получение семян из выходных данных), так как я думал, что для этого потребуется грубая сила.

1 ответ

Решение

Для LCG начальное число совпадает с состоянием и служит предыдущим значением для вычисления следующего. Известно, что LCG является обратимым, если

next = (a * prev + c) mod m

затем

prev = (next - c) * a_inv mod m

где a_inv может быть вычислено с использованием алгоритма Евклида

больше обсуждения здесь

Обратимый генератор псевдослучайных последовательностей

Другие вопросы по тегам