<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Kongruenzgenerator</id>
	<title>Kongruenzgenerator - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Kongruenzgenerator"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Kongruenzgenerator&amp;action=history"/>
	<updated>2026-06-11T14:26:10Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Kongruenzgenerator&amp;diff=124022&amp;oldid=prev</id>
		<title>imported&gt;Bithisarea: /* growthexperiments-addlink-summary-summary:2|1|0 */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Kongruenzgenerator&amp;diff=124022&amp;oldid=prev"/>
		<updated>2025-01-12T20:19:37Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;growthexperiments-addlink-summary-summary:2|1|0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Die &amp;#039;&amp;#039;&amp;#039;Kongruenzgeneratoren&amp;#039;&amp;#039;&amp;#039; bilden eine Klasse von [[Algorithmus|Algorithmen]], die [[Zufallszahl|zufällig]] aussehende [[Folge (Mathematik)|Zahlenfolgen]] erzeugen. Die dadurch erzeugten Zahlen nennt man [[Pseudozufall]]szahlen, da sie [[Determinismus (Algorithmus)|deterministisch]] erzeugt werden und somit nicht wirklich [[Zufall|zufällig]] sind. Kongruenzgeneratoren sind die bekanntesten und meistverwendeten [[Arithmetischer Zufallszahlengenerator|rekursiven arithmetischen Zufallszahlengeneratoren]].&lt;br /&gt;
&lt;br /&gt;
== Allgemeiner Kongruenzgenerator ==&lt;br /&gt;
Ein Kongruenzgenerator wird durch folgende Parameter definiert:&lt;br /&gt;
* Anzahl &amp;lt;math&amp;gt;n \in \mathbb{N}^+&amp;lt;/math&amp;gt; der Zustandswerte&lt;br /&gt;
* Modul &amp;lt;math&amp;gt;m \in \{2, 3, 4, \ldots\}&amp;lt;/math&amp;gt;&lt;br /&gt;
* Faktoren &amp;lt;math&amp;gt;a_1, \ldots, a_n \in \left\{ 0, \ldots, m-1 \right\}&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;margin-left:2em;&amp;quot;&amp;gt;mit &amp;lt;math&amp;gt;a_n &amp;gt; 0&amp;lt;/math&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Inkrement &amp;lt;math&amp;gt;b \in \left\{ 0, \ldots, m-1 \right\}&amp;lt;/math&amp;gt;&lt;br /&gt;
* Startwerte &amp;lt;math&amp;gt;y_1, \ldots, y_n \in \left\{ 0, \ldots, m-1 \right\}&amp;lt;/math&amp;gt; &amp;lt;span style=&amp;quot;margin-left:2em;&amp;quot;&amp;gt;(nicht alle 0, wenn &amp;lt;math&amp;gt;b = 0&amp;lt;/math&amp;gt;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für &amp;lt;math&amp;gt;i &amp;gt; n&amp;lt;/math&amp;gt; setzt man nun&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \left( \left(\sum_{k=1}^{n} a_k y_{i-k} \right) + b \right) \, \bmod \, m&amp;lt;/math&amp;gt;. &amp;lt;span style=&amp;quot;margin-left:2em;&amp;quot;&amp;gt; Dabei bezeichnet &amp;lt;math&amp;gt; \mod{} &amp;lt;/math&amp;gt; den Divisionsrest; siehe [[Division mit Rest#Modulo|Modulo]].&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die so berechneten &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; werden als Zufallszahlen verwendet.&lt;br /&gt;
&lt;br /&gt;
Der Zustand des Generators vor der Erzeugung von &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; wird durch die Werte &amp;lt;math&amp;gt;y_{i-n}, \ldots, y_{i-1}&amp;lt;/math&amp;gt; gegeben. Dieser Zustand legt (bei gegebenen &amp;lt;math&amp;gt;n,m,a_k,b&amp;lt;/math&amp;gt;) alle folgenden Zufallszahlen fest, da die nächste Zufallszahl und der nächste Zustand durch den aktuellen Zustand determiniert werden. Es gibt &amp;lt;math&amp;gt;m^n&amp;lt;/math&amp;gt; mögliche Zustände, und deshalb muss spätestens nach &amp;lt;math&amp;gt;m^n&amp;lt;/math&amp;gt; Schritten ein früherer Zustand wiederholt werden. Der Kongruenzgenerator erzeugt somit eine [[Periodizität (Mathematik)|periodische]] Folge von Zahlen, wobei die Periodenlänge auch wesentlich kleiner als &amp;lt;math&amp;gt;m^n&amp;lt;/math&amp;gt; sein kann. Im Extremfall ist sie 1, und der Generator erzeugt immer die gleiche „Zufallszahl“. Bei der Festlegung der Parameter kommt es somit unter anderem darauf an, eine ausreichende Periodenlänge sicherzustellen.&lt;br /&gt;
&lt;br /&gt;
Braucht man reelle Zufallszahlen im Intervall &amp;lt;math&amp;gt;[0, 1)&amp;lt;/math&amp;gt;, so kann man dafür die Näherung&lt;br /&gt;
:&amp;lt;math&amp;gt;u_i := \frac{y_i}{m}&amp;lt;/math&amp;gt;&lt;br /&gt;
verwenden, falls der Modulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; groß genug ist, um eine ausreichend feine Unterteilung zu ergeben.&lt;br /&gt;
&lt;br /&gt;
== Linearer Kongruenzgenerator ==&lt;br /&gt;
Mit &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt; erhält man den Sonderfall eines &amp;#039;&amp;#039;&amp;#039;linearen Kongruenzgenerators&amp;#039;&amp;#039;&amp;#039;. Bei &amp;lt;math&amp;gt;b = 0&amp;lt;/math&amp;gt; wird er als &amp;#039;&amp;#039;multiplikativer Kongruenzgenerator&amp;#039;&amp;#039; bezeichnet, und für andere &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; als &amp;#039;&amp;#039;gemischter linearer Kongruenzgenerator&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Letzterer wird häufiger verwendet und hat vier [[natürliche Zahl]]en als Parameter:&lt;br /&gt;
* Modul &amp;lt;math&amp;gt;m \in \{2, 3, 4, \ldots\}&amp;lt;/math&amp;gt;&lt;br /&gt;
* Faktor &amp;lt;math&amp;gt;a \in \{1, \ldots , m-1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
* Inkrement &amp;lt;math&amp;gt;b \in \{1, \ldots , m-1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
* Startwert &amp;lt;math&amp;gt;y_1 \in \{0, \ldots , m-1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aus dem Startwert werden dann die weiteren Werte nach folgender Formel (mit &amp;lt;math&amp;gt; i \ge 2 &amp;lt;/math&amp;gt;) berechnet:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = (a y_{i-1} + b) \ \bmod \ m &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der lineare Kongruenzgenerator wurde 1949 von [[Derrick Henry Lehmer]] eingeführt.&amp;lt;ref name=&amp;quot;KNUTH&amp;quot;&amp;gt;[[Donald E. Knuth]]: &amp;#039;&amp;#039;[[The Art of Computer Programming]]. Volume 2: Seminumerical Algorithms.&amp;#039;&amp;#039; 3. Auflage. Addison-Wesley, 1997, ISBN 0-201-89684-2, S. 10–26&amp;lt;/ref&amp;gt; Er wird in den Laufzeitbibliotheken verschiedener [[Programmiersprache]]n zur Erzeugung von Pseudozufallszahlen verwendet, z.&amp;amp;nbsp;B. in [[C (Programmiersprache)|C]]/[[C++]] in der [[Funktion (Programmierung)|Funktion]] &amp;#039;&amp;#039;rand()&amp;#039;&amp;#039; in der Headerdatei stdlib.h.&amp;lt;ref&amp;gt;Stackoverflow-Forum: [https://stackoverflow.com/questions/6793065/understanding-the-algorithm-of-visual-cs-rand-function &amp;#039;&amp;#039;Understanding the algorithm of Visual C++&amp;#039;s rand() function&amp;#039;&amp;#039;]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der [[Kryptographie]] dagegen kommt der lineare Kongruenzgenerator nicht zum Einsatz, da man schon aus wenigen Werten der erzeugten Zahlenfolge die Parameter &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; und damit die vollständige Zahlenfolge berechnen kann.&lt;br /&gt;
&lt;br /&gt;
=== Periodenlänge ===&lt;br /&gt;
Lineare Kongruenzgeneratoren erreichen nach dem &amp;#039;&amp;#039;Satz von Knuth&amp;#039;&amp;#039; genau dann ihre maximal mögliche Periodenlänge &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, wenn die folgenden Voraussetzungen erfüllt sind:&lt;br /&gt;
* Das Inkrement &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; ist zum Modul &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; [[Teilerfremdheit|teilerfremd]].&lt;br /&gt;
* Jeder [[Primfaktorzerlegung|Primfaktor]] von &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; teilt &amp;lt;math&amp;gt;a-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Wenn &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; durch 4 teilbar ist, dann auch &amp;lt;math&amp;gt;a-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In diesem Fall erzeugt der Generator jede Zahl von 0 bis &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; genau einmal und beginnt dann wieder von vorn. Er liefert also eine [[Zufällige Permutation|pseudozufällige Permutation]] dieser Zahlen. Der Startwert &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt; kann dann jede Zahl aus dieser Menge sein.&lt;br /&gt;
&lt;br /&gt;
Der &amp;#039;&amp;#039;multiplikative Kongruenzgenerator&amp;#039;&amp;#039; (mit &amp;lt;math&amp;gt;b=0&amp;lt;/math&amp;gt;) muss somit eine Periodenlänge kleiner als &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; haben. Der [[Satz von Carmichael]] besagt: bei gegebenem &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ist seine Periodenlänge genau dann maximal, wenn gilt:&lt;br /&gt;
* &amp;lt;math&amp;gt;y_1&amp;lt;/math&amp;gt; ist zu &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; teilerfremd,&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ist ein [[Primitivwurzel|primitives Element]] modulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
Für einige Sonderfälle von &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; können die primitiven Elemente modulo &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; leicht bestimmt werden:&lt;br /&gt;
* Ist &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; eine [[Potenz (Mathematik)#Spezielle Potenzen|Zweierpotenz]] &amp;lt;math&amp;gt; \ge 16&amp;lt;/math&amp;gt;, dann muss &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; mod 8 den Rest 3 oder 5 liefern. Die Periodenlänge ist dann &amp;lt;math&amp;gt;m/4&amp;lt;/math&amp;gt;, und der Startwert &amp;lt;math&amp;gt; y_1 &amp;lt;/math&amp;gt; muss ungerade sein. Es gibt zwei Perioden, die jeweils die Hälfte der ungeraden Zahlen von &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; bis &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; umfassen.&lt;br /&gt;
* Wenn &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; eine [[Primzahl]] &amp;lt;math&amp;gt; \ge 3&amp;lt;/math&amp;gt; ist, dann muss für alle Primfaktoren &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; von &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; gelten:&amp;lt;br /&amp;gt; &amp;lt;math&amp;gt;a^{(m-1)/q} \ \bmod \ m \ne 1&amp;lt;/math&amp;gt;. Dann beträgt die Periodenlänge &amp;lt;math&amp;gt;m - 1&amp;lt;/math&amp;gt;. Der Startwert &amp;lt;math&amp;gt; y_1 &amp;lt;/math&amp;gt; darf nicht Null sein.&lt;br /&gt;
&lt;br /&gt;
=== Mängel der erzeugten Zahlen ===&lt;br /&gt;
Der lineare Kongruenzgenerator liefert keine vollkommen zufällig erscheinenden Zahlen. Man kann nachweisen, dass eine Abhängigkeit von aufeinanderfolgenden Zahlen besteht.&lt;br /&gt;
&lt;br /&gt;
==== Teilperiode ====&lt;br /&gt;
Oft wählt man &amp;lt;math&amp;gt;m = 2^e&amp;lt;/math&amp;gt;, wobei &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; die Wortlänge des Rechners in [[Bit]] ist, denn dann muss man die Modulo-Division nicht explizit berechnen. Sie ergibt sich von selbst durch das Abschneiden der Überlauf-Bits. In diesem Fall verhalten sich die &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; niederwertigsten Bits der Zustandszahl &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; wie ein Generator mit dem Modul &amp;lt;math&amp;gt;2^x&amp;lt;/math&amp;gt;. Diese Bits wiederholen sich also spätestens nach &amp;lt;math&amp;gt;2^x&amp;lt;/math&amp;gt; Schritten. Dies bedeutet insbesondere, dass das niederwertigste Bit bestenfalls die Periode&amp;amp;nbsp;2 besitzt, also regelmäßig zwischen 0 und 1 wechselt. Beim multiplikativen Kongruenzgenerator ist es sogar konstant.&lt;br /&gt;
&lt;br /&gt;
Allgemein gilt für alle linearen Kongruenzgeneratoren: wenn &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; ein Teiler des Moduls &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ist, dann ergibt &amp;lt;math&amp;gt;y_i \ \bmod \ d&amp;lt;/math&amp;gt; eine Zahlenfolge mit der Periode &amp;lt;math&amp;gt;o \le d&amp;lt;/math&amp;gt;:&lt;br /&gt;
: für ein &amp;lt;math&amp;gt; o \in \{1, \ldots, d\} &amp;lt;/math&amp;gt; gilt: &amp;lt;math&amp;gt; \forall i: y_{i+o} \equiv y_i \ ( \bmod \ d) &amp;lt;/math&amp;gt;.&lt;br /&gt;
Wenn der Generator nach dem Satz von Knuth die Periode &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; hat, dann beträgt die Länge &amp;lt;math&amp;gt;o&amp;lt;/math&amp;gt; der Teilperiode genau &amp;lt;math&amp;gt; d &amp;lt;/math&amp;gt; für alle Teiler &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; von &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Wegen dieses Teilperioden-Verhaltens ist es ungünstig, Zufallszahlen &amp;lt;math&amp;gt;r_i \in \{0, \ldots, k-1\} &amp;lt;/math&amp;gt; durch &amp;lt;math&amp;gt; r_i := y_i \ \bmod \ k &amp;lt;/math&amp;gt; zu gewinnen, wenn &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; nicht teilerfremd sind. Dann würde der Divisionsrest &amp;lt;math&amp;gt; r_i \ \bmod \ d &amp;lt;/math&amp;gt; für eine Zahl &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;, die &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; teilt, eine Periode der Länge höchstens &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; durchlaufen. Wenn man z.&amp;amp;nbsp;B. einen sechsseitigen [[Spielwürfel|Würfel]] simulieren will und &amp;lt;math&amp;gt;m &amp;lt;/math&amp;gt; gerade ist, dann liefert &amp;lt;math&amp;gt; r_i := y_i \ \bmod \ 6 &amp;lt;/math&amp;gt; Zahlen, die abwechselnd gerade und ungerade sind.&lt;br /&gt;
&lt;br /&gt;
Mögliche Abhilfe:&lt;br /&gt;
* Man nutzt einen gemischten linearen Kongruenzgenerator mit Periode &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, wobei man den Modul &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; zu &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; teilerfremd wählt. Die Ergebnisse &amp;lt;math&amp;gt; r_i := y_i \ \bmod \ k &amp;lt;/math&amp;gt; sind nicht gleichverteilt, aber bei &amp;lt;math&amp;gt;k \ll m&amp;lt;/math&amp;gt; ist die Abweichung von der Gleichverteilung nur gering und kann oft vernachlässigt werden.&lt;br /&gt;
* Man nutzt einen multiplikativen Kongruenzgenerator mit Periode &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; und wählt für &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; eine große Primzahl. Wenn außerdem &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ein Vielfaches von &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ist, sind die &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; auch gleichverteilt.&lt;br /&gt;
* Man setzt &amp;lt;math&amp;gt;m = 2^e&amp;lt;/math&amp;gt; und wendet mit den höchstwertigen Bits von &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; eine [[Verwerfungsmethode]] an. Die &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; werden um &amp;lt;math&amp;gt;e-f&amp;lt;/math&amp;gt; Bit nach rechts [[Bitweiser Operator#Bitweise Verschiebungen|geschoben]], wobei &amp;lt;math&amp;gt; 2^f&amp;lt;/math&amp;gt; die kleinste Zweierpotenz &amp;lt;math&amp;gt; \ge k&amp;lt;/math&amp;gt; ist: &amp;lt;math&amp;gt; r_i := \lfloor y_i / 2^{e-f} \rfloor &amp;lt;/math&amp;gt;. Dabei verwendet man nur die &amp;lt;math&amp;gt; r_i &amp;lt; k &amp;lt;/math&amp;gt;, die übrigen werden verworfen. Diese Methode liefert gleichverteilte Ergebnisse.&lt;br /&gt;
* Man berechnet &amp;lt;math&amp;gt; r_i := y_i \ \bmod \ x &amp;lt;/math&amp;gt;, wobei &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; die kleinste zu &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; teilerfremde Zahl &amp;lt;math&amp;gt; \ge k &amp;lt;/math&amp;gt; ist, und &amp;lt;math&amp;gt;r_i \ge k&amp;lt;/math&amp;gt; werden verworfen.&lt;br /&gt;
* Manche Implementierungen eines linearen Kongruenzgenerators umgehen das Problem, indem sie nur den höherwertigen Teil des Zustandswertes &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; als Ergebnis liefern. Z.&amp;amp;nbsp;B. ist &amp;lt;math&amp;gt;m = 2^e&amp;lt;/math&amp;gt; und das dem Nutzer gelieferte Ergebnis ist &amp;lt;math&amp;gt;\lfloor y_i / 2^b \rfloor&amp;lt;/math&amp;gt; mit &amp;lt;math&amp;gt;2b = e&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Hyperebenen-Verhalten ====&lt;br /&gt;
[[Datei:Lcg 3d.gif|mini|„Hyperebenenverhalten“ eines linearen Kongruenzgenerators in drei Dimensionen]]&lt;br /&gt;
[[Datei:TI59 3d.jpg|mini|Gemischter Kongruenzgenerator: &amp;lt;math&amp;gt;x_{n+1} = 24298x_n + 99991\ \bmod\ 199017&amp;lt;/math&amp;gt;. Dieser Generator wird im [[TI-59]] von [[Texas Instruments]] verwendet. Gezeigt werden überlappende Tripel, d.&amp;amp;nbsp;h., &amp;lt;math&amp;gt;(x_1,x_2,x_3)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;(x_2,x_3,x_4)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;(x_3,x_4,x_5)&amp;lt;/math&amp;gt; etc. Ohne Überlappungen bliebe nur jede dritte Ebene übrig.]]&lt;br /&gt;
Der lineare Kongruenzgenerator weist ein [[Hyperebene]]n-Verhalten auf, siehe [[Satz von Marsaglia]]. Durch geeignete Wahl der Parameter &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; kann man das Verhalten des Generators optimieren und eine große Zahl von Hyperebenen erreichen. Bei gegebenem &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; kann man &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; nach folgenden Faustregeln bilden:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; sollte weder zu groß noch zu klein sein, etwa: &amp;lt;math&amp;gt;0{,}01 \cdot m &amp;lt; a &amp;lt; 0{,}99 \cdot m&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; sollte möglichst zufällig gewählt werden, also nicht in [[Dualsystem|dualer]] oder [[Dezimalsystem|dezimaler]] Darstellung eine „runde“ Zahl sein.&lt;br /&gt;
* Beim gemischten linearen Kongruenzgenerator sollte die &amp;#039;&amp;#039;Potency&amp;#039;&amp;#039; möglichst groß sein. Sie ist der minimale Wert &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, für den &amp;lt;math&amp;gt;(a-1)^s&amp;lt;/math&amp;gt; ein Vielfaches von &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ist. [[Donald E. Knuth]] empfiehlt, dass die Potency mindestens 5 sein sollte. Wenn &amp;lt;math&amp;gt;m = 2^e&amp;lt;/math&amp;gt;, dann sollte &amp;lt;math&amp;gt; a \ \bmod \ 8 = 5&amp;lt;/math&amp;gt; sein, um die maximal mögliche Potency &amp;lt;math&amp;gt;\lceil e/2 \rceil&amp;lt;/math&amp;gt; zu erhalten.&lt;br /&gt;
&lt;br /&gt;
Wenn man sichergehen will, dass der Generator gute Zufallszahlen erzeugt, sollte man sich nicht allein auf diese Faustregeln verlassen, sondern den Generator mit dem [[Spektraltest]] prüfen.&lt;br /&gt;
&lt;br /&gt;
Wegen des Hyperebenen-Verhaltens greift man statt auf den linearen Kongruenzgenerator gelegentlich auf den [[Inverser Kongruenzgenerator|inversen Kongruenzgenerator]] zurück, der dieses Problem nicht aufweist. Allerdings erfordert er einen höheren Rechenaufwand. Er ist kein Spezialfall des allgemeinen Kongruenzgenerators.&lt;br /&gt;
&lt;br /&gt;
=== Programmierung ===&lt;br /&gt;
Das folgende [[Programmiersprache|Programm]] in der [[Programmiersprache]] [[C++]] implementiert einen linearen Kongruenzgenerator mit &amp;lt;math&amp;gt;m=2^{64}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a=6364136223846793005&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;b=2531011&amp;lt;/math&amp;gt;, der nur die 32 höchstwertigen Bits jeder erzeugten Zufallszahl ausgibt und die niederwertigen, die von geringerer Qualität sind, verwirft. Das Programm erzeugt 10 [[Zufallszahl]]en, die in einem [[Feld (Datentyp)|Array]] gespeichert und anschließend auf der Konsole ausgegeben werden.&amp;lt;ref&amp;gt;Rosetta Code: [https://rosettacode.org/wiki/Linear_congruential_generator Linear congruential generator]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;GeeksforGeeks: [https://www.geeksforgeeks.org/linear-congruence-method-for-generating-pseudo-random-numbers/ Linear Congruence method for generating Pseudo Random Numbers]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
// Funktion, die die Zufallszahlen erzeugt&lt;br /&gt;
void linearCongruentialGenerator(uint64_t &amp;amp;y, uint32_t *randNumbers, int count)&lt;br /&gt;
{&lt;br /&gt;
    const uint64_t a = 6364136223846793005;&lt;br /&gt;
    const uint64_t b = 2531011;&lt;br /&gt;
    uint64_t r = y;  // lokale Variable für die Berechnung&lt;br /&gt;
    for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
        r = a * r + b;&lt;br /&gt;
        randNumbers[i] = r &amp;gt;&amp;gt; 32;&lt;br /&gt;
    }&lt;br /&gt;
    y = r; // Zustand zurückschreiben&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    const int count = 10;        // Anzahl der Zufallszahlen&lt;br /&gt;
    uint32_t randNumbers[count]; // Array für die Zufallszahlen&lt;br /&gt;
    const uint64_t seed = 12345; // Startwert für den Generator&lt;br /&gt;
&lt;br /&gt;
    uint64_t y = seed;           // Zustand des Generators&lt;br /&gt;
    linearCongruentialGenerator(y, randNumbers, count); // Erzeugung der Zufallszahlen&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
        cout &amp;lt;&amp;lt; randNumbers[i] &amp;lt;&amp;lt; endl; // Ausgabe auf der Konsole&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fibonacci-Generator ==&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Fibonacci-Generator&amp;#039;&amp;#039;&amp;#039; ist ebenfalls ein Kongruenzgenerator (mit &amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b=0&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt; a_1 = a_2 = 1&amp;lt;/math&amp;gt;) und besteht aus folgenden Komponenten:&lt;br /&gt;
* Modul &amp;lt;math&amp;gt;m \in \{2, 3, 4, \dotsc\}&amp;lt;/math&amp;gt;&lt;br /&gt;
* Startwerte &amp;lt;math&amp;gt;y_1, y_2 \in \{ 0, \dotsc, m-1 \} &amp;lt;/math&amp;gt;&lt;br /&gt;
Es sollte &amp;lt;math&amp;gt;\operatorname{ggT}(m,y_1,y_2) = 1&amp;lt;/math&amp;gt; sein.&lt;br /&gt;
&lt;br /&gt;
Mit folgender Bildungsregel werden die Pseudozufallszahlen erzeugt:&lt;br /&gt;
: &amp;lt;math&amp;gt;y_i = ( y_{i-1} + y_{i-2} ) \bmod m \quad (\text{mit } i \ge 3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Eigenschaft ist, dass die Fälle &amp;lt;math&amp;gt;y_{i-1} &amp;lt; y_{i+1} &amp;lt; y_i&amp;lt;/math&amp;gt; bzw. &amp;lt;math&amp;gt;y_i &amp;lt; y_{i+1} &amp;lt; y_{i-1}&amp;lt;/math&amp;gt; nie auftreten. Fibonacci-Generatoren sind daher als Pseudozufallszahlengeneratoren wenig geeignet. Das gilt insbesondere für [[Mathematisches Objekt|mathematische Objekte]], zu deren Erzeugung mehr als zwei Zufallszahlen erforderlich sind. Würde man beispielsweise damit versuchen, eine zufällige Punktewolke in einem Würfel zu generieren, so kämen alle Punkte auf zwei Ebenen zu liegen.&lt;br /&gt;
&lt;br /&gt;
== Verzögerter Fibonacci-Generator ==&lt;br /&gt;
Das Prinzip des Fibonacci-Generators kann aber verallgemeinert werden, indem man nicht die beiden letzten, sondern weiter zurückliegende Zustandswerte &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; zur Erzeugung der neuen Zufallszahl verwendet. Dies ergibt einen &amp;#039;&amp;#039;verzögerten (engl. &amp;#039;lagged&amp;#039;) Fibonacci-Generator&amp;#039;&amp;#039;:&lt;br /&gt;
: &amp;lt;math&amp;gt;y_i = ( y_{i-B} + y_{i-A} ) \bmod m \quad \text{mit } A,B \in \N^+, \ A &amp;gt; B; \quad i &amp;gt; A&amp;lt;/math&amp;gt;&lt;br /&gt;
: mit den Startwerten &amp;lt;math&amp;gt;y_1, \dotsc, y_A \in \{ 0, \dotsc, m-1 \}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann ist also &amp;lt;math&amp;gt;n=A&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;a_A = a_B = 1&amp;lt;/math&amp;gt;, die übrigen &amp;lt;math&amp;gt;a_k&amp;lt;/math&amp;gt; sind Null. Dabei wählt man in der Regel &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; gerade und &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; so, dass das Polynom in &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt; x^A + x^B + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
ein &amp;#039;&amp;#039;primitives Polynom modulo 2&amp;#039;&amp;#039; ist. Dann beträgt die Periodenlänge des Generators mindestens &amp;lt;math&amp;gt; 2^A - 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die folgende Tabelle gibt einige Wertepaare für &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; an, die diese Bedingung erfüllen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;#039;&amp;#039;A&amp;#039;&amp;#039;&lt;br /&gt;
| 2|| 31|| 55|| 73|| 98|| 100|| 135|| 258|| 607|| 3217|| 23209&lt;br /&gt;
|-&lt;br /&gt;
! &amp;#039;&amp;#039;B&amp;#039;&amp;#039;&lt;br /&gt;
| 1|| 13|| 24|| 25|| 27|| 37|| 22|| 83|| 273|| 576|| 9739&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x^A + x^B + 1 &amp;lt;/math&amp;gt; ist genau dann ein &amp;#039;&amp;#039;primitives Polynom modulo&amp;amp;nbsp;2&amp;#039;&amp;#039;, wenn dies für &amp;lt;math&amp;gt; x^A + x^{A-B} + 1 &amp;lt;/math&amp;gt; gilt. Somit kann man statt &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; immer auch &amp;lt;math&amp;gt;A-B&amp;lt;/math&amp;gt; verwenden.&lt;br /&gt;
&lt;br /&gt;
Dieser Generator wird auch praktisch eingesetzt. Er liefert aber ebenfalls keine vollkommen zufällig erscheinenden Zahlen. Das Problem des einfachen Fibonacci-Generators wird nur verlagert: Man hat niemals &amp;lt;math&amp;gt; y_{i-A} &amp;lt; y_i &amp;lt; y_{i-B} &amp;lt;/math&amp;gt; oder &amp;lt;math&amp;gt; y_{i-B} &amp;lt; y_i &amp;lt; y_{i-A} &amp;lt;/math&amp;gt;. Außerdem gibt es noch weitere Mängel.&lt;br /&gt;
&lt;br /&gt;
Als Abhilfe wurde vorgeschlagen, immer nur &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; aufeinanderfolgende Zahlen zu verwenden, und dann die nächsten &amp;lt;math&amp;gt;4 A&amp;lt;/math&amp;gt; bis &amp;lt;math&amp;gt;10 A&amp;lt;/math&amp;gt; Zahlen zu verwerfen. Dies funktioniert gut, aber um den Preis eines 5- bis 11-mal höheren Rechenaufwands. Der von Donald Knuth vorgeschlagene Generator &amp;#039;&amp;#039;ranarray&amp;#039;&amp;#039; arbeitet auf diese Weise. Bei ihm ist &amp;lt;math&amp;gt;A = 100&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;B = 37&amp;lt;/math&amp;gt;, und von 1009 aufeinanderfolgenden Zahlen wird immer nur ein Block von 100 Zahlen verwendet.&lt;br /&gt;
&lt;br /&gt;
Um die Periode &amp;lt;math&amp;gt; 2^A - 1 &amp;lt;/math&amp;gt; sicherzustellen, kommt es nur auf das jeweils niederwertigste Bit in den Zustandswerten &amp;lt;math&amp;gt; y_i &amp;lt;/math&amp;gt; an, also darauf, ob sie gerade oder ungerade sind. Man kann die höherwertigen Bits beliebig modifizieren, um die Qualität der erhaltenen Zufallszahlen zu verbessern. Beispielsweise:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; y_i = (y_{i-A} + y_{i-B} + f(y_{i-C})) \bmod m; \quad f\colon \{0, \dotsc, m-1\} \to \{0, 2, 4, 6, \dotsc\}, \; C \in \{ 1, \dotsc, n \} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Andere ==&lt;br /&gt;
Man kann den verzögerten Fibonacci-Generator weiter verallgemeinern, indem man mehr als zwei Zustandswerte verarbeitet:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_i = \left( \sum_{k \in M} y_{i-k} \right) \bmod m \quad \text{mit} \quad M \subset \N^+ &amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ist hier das größte Element in &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Um eine Periode von mindestens &amp;lt;math&amp;gt; 2^n-1 &amp;lt;/math&amp;gt; zu garantieren, muss auch hier das entsprechende Polynom&lt;br /&gt;
: &amp;lt;math&amp;gt; \sum_{k \in M} x^k + 1 &amp;lt;/math&amp;gt; oder gleichbedeutend das Polynom &amp;lt;math&amp;gt; x^n + \sum_{k \in M} x^{n-k} &amp;lt;/math&amp;gt;&lt;br /&gt;
ein &amp;#039;&amp;#039;primitives Polynom modulo 2&amp;#039;&amp;#039; sein (mit geradem Modul &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;). Ein so konstruierter Generator mit &amp;lt;math&amp;gt; |M| &amp;gt; 2 &amp;lt;/math&amp;gt; liefert im Allgemeinen bessere Zufallszahlen als mit &amp;lt;math&amp;gt; |M| = 2 &amp;lt;/math&amp;gt;, aber wiederum um den Preis eines höheren Rechenaufwands.&lt;br /&gt;
&lt;br /&gt;
Mit einer weiteren Verallgemeinerung kann man bei gegebenem &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; die Periodenlänge vergrößern und wohl auch die Qualität der Zufallszahlen weiter verbessern. &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; sei ein Primfaktor von &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. für die Berechnungsvorschrift&lt;br /&gt;
: &amp;lt;math&amp;gt; y_i = \left( \sum_{k = 1}^{n} a_k y_{i-k} \right) \bmod m &amp;lt;/math&amp;gt;&lt;br /&gt;
werden die &amp;lt;math&amp;gt; a_k \in \{ 0, \dotsc, m-1 \} &amp;lt;/math&amp;gt; derart gewählt, mit &amp;lt;math&amp;gt; a_n \not\equiv 0 \pmod p &amp;lt;/math&amp;gt;, dass das Polynom in &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt; x^n - \sum_{k=1}^{n} (a_k \bmod p) x^{n-k} &amp;lt;/math&amp;gt;&lt;br /&gt;
ein &amp;#039;&amp;#039;primitives Polynom modulo &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;&amp;#039;&amp;#039; ist. Dann beträgt die Periodenlänge mindestens &amp;lt;math&amp;gt; p^n - 1 &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Der vorige Generator ergibt sich daraus mit &amp;lt;math&amp;gt; p = 2 &amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt; a_k \in \{ 0, 1 \} &amp;lt;/math&amp;gt; als Sonderfall, und &amp;lt;math&amp;gt;n=1; \ p=m&amp;lt;/math&amp;gt; liefert einen multiplikativen Kongruenzgenerator mit der Periodenlänge &amp;lt;math&amp;gt; p - 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Das Polynom &amp;lt;math&amp;gt; f(x) = x^n - \sum_{k=1}^{n} a_k x^{n-k} &amp;lt;/math&amp;gt; ist ein &amp;#039;&amp;#039;primitives Polynom modulo &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;&amp;#039;&amp;#039;, wenn die folgenden Bedingungen erfüllt sind:&lt;br /&gt;
&lt;br /&gt;
(&amp;lt;math&amp;gt;\text{sei } r = \frac{p^n-1}{p-1} \text{ und } a = (-1)^{n-1} a_n &amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; ist ein primitives Element modulo &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;&lt;br /&gt;
* das Polynom &amp;lt;math&amp;gt; x^r &amp;lt;/math&amp;gt; ist kongruent zu &amp;lt;math&amp;gt; a &amp;lt;/math&amp;gt; (modulo &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;)&lt;br /&gt;
* für alle Primfaktoren &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; von &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; ist der Grad des Polynoms &amp;lt;math&amp;gt; x^{r/q} \bmod f(x) &amp;lt;/math&amp;gt; positiv&lt;br /&gt;
Dabei wird Polynomarithmetik angewandt (siehe [[Polynom#Polynome in der abstrakten Algebra|Polynome]] sowie [[Polynomdivision]]), und mit den Koeffizienten wird modulo &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; gerechnet (sie sind Elemente des [[Restklassenring]]s &amp;lt;math&amp;gt; \Z / p \Z &amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Liste von Zufallszahlengeneratoren]]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Pseudozufallszahlengenerator]]&lt;br /&gt;
[[Kategorie:Zahlentheorie]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.staff.uni-mainz.de/pommeren/Kryptologie02/Bitstrom/Bitstrom.pdf Abhandlung über Bitstrom-Verschlüsselungen]&lt;/div&gt;</summary>
		<author><name>imported&gt;Bithisarea</name></author>
	</entry>
</feed>