Dreher von Mersenne

Der Mersenne Dreher ist ein Pseudozufallszahlengenerator entwickelt 1997 dadurch, und das basiert auf einem geradlinigen Matrixwiederauftreten über ein begrenztes binäres Feld. Es sorgt für schnelle Generation von sehr hochwertigen Pseudozufallszahlen, spezifisch dafür entworfen, viele der in älteren Algorithmen gefundenen Fehler zu berichtigen.

Sein Name ist auf die Tatsache zurückzuführen, dass Periode-Länge gewählt wird, um erster Mersenne zu sein. Es gibt mindestens zwei allgemeine Varianten des Algorithmus, sich nur in der Größe der verwendeten Blüte von Mersenne unterscheidend. Der neuere und allgemeiner verwendete ist der Mersenne Dreher MT19937 mit 32-Bit-Wortlänge. Es gibt auch eine Variante mit 64-Bit-Wortlänge, MT19937-64, der eine verschiedene Folge erzeugt.

Für eine K-Bit-Wortlänge erzeugt der Mersenne Dreher Zahlen mit fast Rechteckverteilung in der Reihe.

Anwendungen

Der Algorithmus in seiner heimischen Form ist für die Geheimschrift (verschieden von Blum Blum Shub) nicht passend. Das Beobachten einer ausreichenden Anzahl dessen wiederholt (624 im Fall von MT19937, da diese Zahl die Größe des Zustandvektoren ist, von dem Zukunft wiederholt, werden erzeugt) erlaubt vorauszusagen, dass die ganze Zukunft wiederholt. Ein Paar von kryptografischen Strom-Ziffern, die auf der Produktion vom Dreher von Mersenne gestützt sind, ist von Makoto Matsumoto vorgeschlagen worden u. a. Die Autoren fordern Geschwindigkeiten 1.5 zu 2mal schneller als Fortgeschrittener Verschlüsselungsstandard in der Gegenweise.

Ein anderes Problem ist, dass es viel Zeit in Anspruch nehmen kann, um einen nichtzufälligen anfänglichen Staat (namentlich die Anwesenheit vieler Nullen) in die Produktion zu drehen, die Zufälligkeitstests besteht. Ein kleiner isolierter Generator von Fibonacci oder geradliniger congruential Generator werden viel schneller angefangen und werden gewöhnlich verwendet, um den Mersenne Dreher mit zufälligen Anfangswerten zu entsamen.

Für viele Anwendungen wird der Dreher von Mersenne der Pseudozufallszahlengenerator der Wahl schnell.

Der Mersenne Dreher wird mit Simulationen von Monte Carlo und anderen statistischen Simulationen im Sinn entworfen. Forscher wollen in erster Linie hohe Qualitätszahlen sondern auch ziehen aus seiner Geschwindigkeit und Beweglichkeit einen Nutzen.

Vorteile

Die allgemein verwendete Variante des Mersenne Drehers, MT19937, der eine Folge von ganzen 32-Bit-Zahlen erzeugt, hat die folgenden wünschenswerten Eigenschaften:

  1. Es hat einen sehr langen Zeitraum 2 − 1. Während ein langer Zeitraum nicht eine Qualitätsgarantie in einem Zufallszahlengenerator ist, können kurze Perioden (wie die 2, die in vielen Softwarepaketen üblich sind), problematisch sein.
  2. Es ist k-distributed zu 32-Bit-Genauigkeit für jeden 1  k  623 (sieh Definition unten).
  3. Es besteht zahlreiche Tests für die statistische Zufälligkeit einschließlich der Hartnäckigen Tests. Es geht am meisten, aber nicht alle der noch strengeren TestU01-Druck-Zufälligkeitstests.

K-Vertrieb

Wie man

sagt, ist eine pseudozufällige Folge x ganzer W-Bit-Zahlen der Periode P k-distributed zur V-Bit-Genauigkeit, wenn der folgende hält.

: Lassen Sie trunc (x) zeigen die Zahl an, die durch die Führung v Bit von x gebildet ist, und denken P der Kv-Bit-Vektoren

::

: Dann kommt jede der 2 möglichen Kombinationen von Bit dieselbe Zahl von Zeiten in einer Periode abgesehen von der Vollnullkombination vor, die einmal weniger häufig vorkommt.

Alternativen

Der Mersenne Dreher-Algorithmus hat etwas Kritik im Informatik-Feld namentlich durch George Marsaglia erhalten. Diese Kritiker behaupten, dass, während es gut Zufallszahlen erzeugen kann, es nicht sehr elegant ist und allzu kompliziert ist, um durchzuführen. Marsaglia hat mehrere Beispiele von Zufallszahlengeneratoren zur Verfügung gestellt, die noch weniger kompliziert sind, die bedeutsam größere Perioden zur Verfügung stellen. Zum Beispiel kann ein einfacher multiply-carry Ergänzungsgenerator eine 10mal so lange Periode haben, bedeutsam schneller sein, und besser oder gleiche Zufälligkeit aufrechterhalten.

Ein anderes Problem ist, dass Mersenne Dreher zur schlechten Initialisierung empfindlich ist und viel Zeit in Anspruch nehmen kann, um sich von einem anfänglichen Nullüberstaat zu erholen. Eine Alternative, GUT ("Gut Equidistributed Langer Zeitraum Geradlinig"), hat schnellere Wiederherstellung, dieselbe oder bessere Leistung und gleiche Zufälligkeit.

Algorithmisches Detail

Der Mersenne Dreher-Algorithmus ist ein gedrehtes verallgemeinertes Feed-Back-Verschiebungsregister (hat GFSR oder TGFSR gedreht) der vernünftigen normalen Form (TGFSR(R)), mit dem Zustandbit-Nachdenken und Mildern. Es wird durch die folgenden Mengen charakterisiert:

  • w: Wortgröße (in der Zahl von Bit)
  • n: Grad des Wiederauftretens
  • m: mittleres Wort oder die Zahl von parallelen Folgen, 1  M  n
  • r: Trennungspunkt eines Wortes oder die Zahl von Bit tiefer bitmask, 0  r  w - 1
  • a: Koeffizienten der vernünftigen normalen Form drehen Matrix
  • b, c: TGFSR(R), der bitmasks mildert
  • s, t: TGFSR(R), der Bit mildert, wechselt aus
  • u, l: Zusätzlicher Mersenne Dreher, der Bit mildert, wechselt aus

mit der Beschränkung, dass 2  1 erster Mersenne sind. Diese Wahl vereinfacht den Primitivity-Test- und K-Vertriebstest, die in der Parameter-Suche erforderlich sind.

Für ein Wort x mit w hat Breite gebissen, er wird als die Wiederauftreten-Beziehung ausgedrückt

:

mit | als der bitwise oder und weil haben das bitwise exklusive oder (XOR), x, x, x mit oberem und niedrigerem bitmasks seiend, gegolten. Die Drehungstransformation A wird in der vernünftigen normalen Form definiert

A = R = \begin {pmatrix} 0 & I_ {w - 1} \\a_ {w-1} & (a_ {w - 2}, \ldots, a_0) \end {pmatrix }\

</Mathematik>

mit mir als (n &minus; 1) &times; (n &minus; 1) Identitätsmatrix (und im Gegensatz zur normalen Matrixmultiplikation bitwise ersetzt XOR Hinzufügung). Die vernünftige normale Form hat den Vorteil, dass es als effizient ausgedrückt werden kann

\boldsymbol {x} = \begin {Fälle }\\boldsymbol {x} \gg 1 & x_0 = 0 \\(\boldsymbol {x} \gg 1) \oplus \boldsymbol & x_0 = 1\end {Fälle }\

</Mathematik>wo:

Um die 2  zu erreichen, muss 1 theoretische obere Grenze der Periode in einem TGFSR, φ (t) ein primitives Polynom, φ (t) sein das charakteristische Polynom von zu sein

B = \begin {pmatrix }\

0 & I_ {w} & \cdots & 0 & 0 \\

\vdots & & & & \\

I_ {w} & \vdots & \ddots & \vdots & \vdots \\

\vdots & & & & \\

0 & 0 & \cdots & I_ {w} & 0 \\

0 & 0 & \cdots & 0 & I_ {w - r} \\

S & 0 & \cdots & 0 & 0

\end {pmatrix }\

\begin {Matrix-}\

\\\\\leftarrow m\hbox {-th Reihe} \\\\\\\\

\end {Matrix-}\

</Mathematik>

S = \begin {pmatrix} 0 & I_{r} \\I_ {w - r} & 0 \end {pmatrix} Ein

</Mathematik>

Die Drehungstransformation verbessert den klassischen GFSR mit den folgenden Schlüsseleigenschaften:

  • Periode erreicht die theoretische obere Grenze 2  1 (außer, wenn initialisiert, mit 0)
  • Equidistribution in n Dimensionen (z.B können geradlinige congruential Generatoren am besten, angemessenen Vertrieb in 5 Dimensionen führen)

Als TGFSR(R) wird der Mersenne Dreher mit einem Mildern wellig gefallen verwandeln sich, um den reduzierten dimensionality von equidistribution zu ersetzen (wegen der Wahl von A, der in der vernünftigen normalen Form ist), der zur Transformation = R  = TRT, T invertible gleichwertig ist. Das Mildern wird im Fall vom Mersenne Dreher als definiert

:y: = x &oplus; (x>> u)

:y: =: y &oplus; ((y

damit

Die Koeffizienten für MT19937 sind:

  • (w, n, M, r) = (32, 624, 397, 31)
  • a = 9908B0DF
  • u = 11
  • (s, b) = (7, 9D2C5680)
  • (t, c) = (15, EFC60000)
  • l = 18

Pseudocode

Das folgende Stück des Pseudocodes erzeugt gleichförmig hat ganze 32-Bit-Zahlen in der Reihe [0, 2 &minus verteilt; 1] mit dem MT19937 Algorithmus:

//Schaffen Sie eine Länge 624 Reihe, um den Staat des Generators zu versorgen

interne Nummer [0.. 623] MT

int Index = 0

//Initialisieren Sie den Generator von einem Samen

fungieren Sie initialize_generator (int Samen) {\

MT [0]: = entsamen

weil ich von 1 bis 623 {//Schleife über einander Element

MT [ich]: = dauern 32 Bit dessen (1812433253 * (MT [i-1] xor (richtige Verschiebung durch 30 Bit (MT [i-1]))) + i)//0x6c078965

}\

}\

//Ziehen Sie eine gehärtete pseudozufällige Zahl heraus, die auf dem Wert des Index-th, gestützt ist

//das Benennen generate_numbers alle 624 Zahlen

fungieren Sie extract_number {\

wenn Index == 0 {\

generate_numbers

}\

interne Nummer y: = MT [Index]

y: = y xor (richtige Verschiebung durch 11 Bit (y))

y: = y xor (verlassen Verschiebung durch 7 Bit (y) und (2636928640))//0x9d2c5680

y: = y xor (verlassen Verschiebung durch 15 Bit (y) und (4022730752))//0xefc60000

y: = y xor (richtige Verschiebung durch 18 Bit (y))

Index: = (Index + 1) mod 624

geben Sie y zurück

}\

//Erzeugen Sie eine Reihe von 624 ungehärteten Zahlen

fungieren Sie generate_numbers {\

weil ich von 0 bis 623 {\

interne Nummer y: = 32. Bit (MT [ich]) + dauern 31 Bit (MT [(i+1) mod 624])

MT [ich]: = MT [(ich + 397) mod 624] xor (richtige Verschiebung durch 1 Bit (y))

wenn (y mod 2)! = 0 {//ist y sonderbarer

MT [ich]: = MT [ich] xor (2567483615)//0x9908b0df

}\

}\ }\

SFMT

SFMT, der SIMD-orientierte Schnelle Mersenne Dreher, ist eine Variante des Mersenne Drehers, vorgestellt 2006, entworfen, um schnell zu sein, wenn er auf 128-Bit-SIMD läuft.

  • Es ist grob zweimal so schnell wie Mersenne Dreher.
  • Es hat ein besseres equidistribution Eigentum der V-Bit-Genauigkeit als MT, aber schlechter als GUT ("Gut Equidistributed Langer Zeitraum Geradlinig").
  • Es hat schnellere Wiederherstellung vom anfänglichen Nullüberstaat als MT, aber langsamer als GUT.
  • Es unterstützt verschiedene Perioden von 2-1 bis 2-1.

Intel SSE2 und PowerPC AltiVec werden durch SFMT unterstützt. Es wird auch für Spiele mit der Zelle verwendet, in PlayStation 3 ZU SEIN.

Durchführungen auf verschiedenen Sprachen

C ++ C ++ C ++ F# Haskell

Außenverbindungen


Ustad Isa / Sozialer Darwinismus
Impressum & Datenschutz