Ich forsche, wie Python Wörterbücher implementiert. Eine der Gleichungen in der Python Wörterbuch Implementierung bezieht sich die der Pseudozufalls für einen leeren Schlitz Wörterbuch Sondieren der GleichungIn Python-Wörterbücher, wie funktioniert ((j * 5) +1)% 2 ** Ich durchlaufe alle 2 ** ich
j = ((j*5) + 1) % 2**i
die here erläutert.
Ich habe diese Frage gelesen, How are Python's Built In Dictionaries Implemented, und im Grunde verstehen, wie Wörterbücher implementiert werden.
Was ich nicht verstehe ist, warum/wie die Gleichung:
j = ((j*5) + 1) % 2**i
Zyklen durch alle Reste von 2**i
. Zum Beispiel geht, wenn i = 3
für eine Gesamtausgangsgröße von 8 j
durch den Zyklus:
0
1
6
7
4
5
2
3
0
, wenn die Ausgangsgröße 16 ist, würde es durch den Zyklus gehen:
0 1 6 15 12 13 2 11 8 9 14 7 4 5 10 3 0
Dies ist sehr nützlich für die Untersuchung aller Slots im Wörterbuch. Aber warum funktioniert es? Warum funktioniert j = ((j*5)+1)
funktioniert aber nicht j = ((j*6)+1)
oder j = ((j*3)+1)
die beide in kleineren Zyklen stecken bleiben.
Ich hoffe, ein intuitiveres Verständnis davon zu bekommen als die Gleichung funktioniert einfach und deshalb haben sie es verwendet.
Da 5 co-prime mit 2^i ist, ist das [LCM] (https://en.wikipedia.org/wiki/Least_common_multiple) 5 * 2^i. –
Ein paar Zeilen über Ihrem Zitat: "irgendeinen Text zur Zufallszahlengenerierung als Beweis sehen" :) – Jasper
@OliverCharlesworth durch dieses Argument, dann sollte (j * 3) +1 auch funktionieren. – kevmo314