私はPythonが辞書をどのように実装しているかを研究しています。 Pythonの辞書の実装における方程式の一つは、hereを説明する方程式Python Dictionariesでは、どのように((j * 5)+1)%2 **すべて2を循環**
j = ((j*5) + 1) % 2**i
を使用して空の辞書スロットのプロービング擬似ランダムに関する。
私はこの質問How are Python's Built In Dictionaries Implementedを読んで、基本的に辞書がどのように実装されているか理解しています。
j = ((j*5) + 1) % 2**i
サイクル2**i
のすべての余りを経て:私は理解していない何
はなぜ/どのように方程式です。例えば、8 j
の総出発サイズがサイクルを通過するためi = 3
場合:出発サイズが16であれば
0
1
6
7
4
5
2
3
0
することは、それがサイクルを行く:
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)
はどちらも小さなサイクルでスタックしません。
よりも直感的な理解を得たいと考えています。この式はちょうどうまく動作し、それで彼らはを使用しています。
5は2^iとコプライムなので、[LCM](https://en.wikipedia.org/wiki/Least_common_multiple)は5 * 2^iです。 –
あなたの引用の数行上に: "証明のための乱数生成に関するテキストを参照してください": – Jasper
@OliverCharlesworthその引数で、(j * 3)+1も動作するはずです。 – kevmo314