Подтвердить что ты не робот

В словарях Python, как ((j * 5) +1)% 2 ** я цикл через все 2 ** i

Я изучаю, как python реализует словари. Одно из уравнений в реализации словаря на языке python связывает псевдослучайное зондирование для словарного слота с использованием уравнения

j = ((j*5) + 1) % 2**i

который объясняется здесь.

Я прочитал этот вопрос, Как внедряются встроенные словари Python, и в основном понимают, как используются словари.

Я не понимаю, почему/как уравнение:

j = ((j*5) + 1) % 2**i   

проходит через все остатки 2**i. Например, если i = 3 для полного начального размера 8. j проходит цикл:

0
1
6
7
4
5
2
3
0

если начальный размер равен 16, он будет проходить через цикл:

0 1 6 15 12 13 2 11 8 9 14 7 4 5 10 3 0

Это очень полезно для определения всех слотов в словаре. Но почему это работает? Почему работает j = ((j*5)+1), но не j = ((j*6)+1) или j = ((j*3)+1), оба из которых застревают в меньших циклах.

Я надеюсь получить более интуитивное понимание этого, чем просто работает уравнение и почему они его использовали.

4b9b3361

Ответ 1

Это тот же принцип, что и генераторы псевдослучайных чисел, как намекнул Джаспер, а именно линейные конгруэнтные генераторы. Линейный конгруэнтный генератор представляет собой последовательность, которая следует за соотношением X_(n+1) = (a * X_n + c) mod m. На странице wiki

Период общего LCG не более m, а для некоторых вариантов коэффициента намного меньше этого. LCG будет иметь полный период для всех значений семени тогда и только тогда, когда:

  • m и c являются взаимно простыми.
  • a - 1 делится на все простые множители m.
  • a - 1 делится на 4, если m делится на 4.

Ясно, что 5 - наименьшее a для удовлетворения этих требований, а именно

  • 2 ^ я и 1 взаимно просты.
  • 4 делится на 2.
  • 4 делится на 4.

Также интересно, что 5 - не единственное число, удовлетворяющее этим условиям. 9 также будет работать. Принимая значение m равным 16, использование j=(9*j+1)%16 дает

0 1 10 11 4 5 14 15 8 9 2 3 12 13 6 7

Доказательство этих трех условий можно найти в оригинальной статье Халла-Добелла на стр. 5, а также множество других связанных с PRNG теорем, которые также могут представляют интерес.