<?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=Inverser_Kongruenzgenerator</id>
	<title>Inverser 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=Inverser_Kongruenzgenerator"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Inverser_Kongruenzgenerator&amp;action=history"/>
	<updated>2026-06-05T08:19:20Z</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=Inverser_Kongruenzgenerator&amp;diff=124356&amp;oldid=prev</id>
		<title>imported&gt;Rigormath: /* Programmierung */ Erweiterter euklidischer Algorithmus: Linkziel ersetzt durch eines mit Beispiel zur Inversenberechnung.</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Inverser_Kongruenzgenerator&amp;diff=124356&amp;oldid=prev"/>
		<updated>2026-02-22T10:55:44Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Programmierung: &lt;/span&gt; Erweiterter euklidischer Algorithmus: Linkziel ersetzt durch eines mit Beispiel zur Inversenberechnung.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Ein &amp;#039;&amp;#039;&amp;#039;inverser Kongruenzgenerator&amp;#039;&amp;#039;&amp;#039; ist ein [[arithmetischer Zufallszahlengenerator]], der durch den [[Satz von Marsaglia]] bekannte Nachteile [[linearer Kongruenzgenerator]]en vermeidet. Insbesondere lässt er keine [[Hyperebene]]n entstehen. Verwendet man Zufallszahlen inverser Kongruenzgeneratoren für die [[Box-Muller-Methode]], so wird ein Spiralverhalten vermieden. Im Gegenzug verlangt er einen höheren Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Er besteht aus folgenden Komponenten:&lt;br /&gt;
&lt;br /&gt;
*Modul &amp;lt;math&amp;gt;p \in \mathbb{P}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\mathbb{P}&amp;lt;/math&amp;gt; steht hierbei wie üblich für die Menge der [[Primzahl]]en)&lt;br /&gt;
*Faktor &amp;lt;math&amp;gt;a \in \{0, ... , p-1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Inkrement &amp;lt;math&amp;gt;b \in \{0, ... , p-1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Startwert &amp;lt;math&amp;gt;y_0 \in \{0, ... , p-1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Generator arbeitet nach folgendem Bildungsgesetz:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_{n+1} = (a y_n^{-1} + b) \, \bmod \, p = ( a y_n^{p-2} + b ) \, \bmod \, p&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Erklärung der Symbolik siehe den Artikel [[Modulo]].&lt;br /&gt;
&lt;br /&gt;
Wegen &amp;lt;math&amp;gt;p\in\mathbb{P}&amp;lt;/math&amp;gt; gibt es zu jedem &amp;lt;math&amp;gt;y_n \ne 0&amp;lt;/math&amp;gt; ein eindeutiges multiplikativ inverses Element &amp;lt;math&amp;gt;y_n^{-1}&amp;lt;/math&amp;gt;, so dass &amp;lt;math&amp;gt;y_n \, y_n^{-1} \equiv 1&amp;lt;/math&amp;gt;. Nur für &amp;lt;math&amp;gt;y_n = 0&amp;lt;/math&amp;gt; muss man sich noch Gedanken machen. Rein formal wäre &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; das inverse Element von &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Da &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; nicht darstellbar ist, wird es am besten übersprungen, indem man &amp;lt;math&amp;gt;0^{-1} = 0&amp;lt;/math&amp;gt; setzt, wie es auch der zweiten Darstellung (mit &amp;lt;math&amp;gt;y_n^{p-2}&amp;lt;/math&amp;gt;) entspricht.&lt;br /&gt;
&lt;br /&gt;
=== Periodenlänge ===&lt;br /&gt;
Die maximale Periodenlänge kann offenbar &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; nicht überschreiten. Erreicht wird diese genau dann, wenn das Polynom&lt;br /&gt;
:&amp;lt;math&amp;gt;x^2 - bx -a&amp;lt;/math&amp;gt;&lt;br /&gt;
ein primitives Polynom in &amp;lt;math&amp;gt;\mathbb{Z}_p&amp;lt;/math&amp;gt; ist.&lt;br /&gt;
&lt;br /&gt;
=== Hyperebenenverhalten ===&lt;br /&gt;
Im Gegensatz zu [[Kongruenzgenerator|linearen Kongruenzgeneratoren]], deren Werte ja auf wenigen Hyperebenen liegen, kann man hier zeigen, dass gilt:&lt;br /&gt;
&lt;br /&gt;
:Jede Hyperebene in &amp;lt;math&amp;gt;\mathbb{Z}_p^k&amp;lt;/math&amp;gt; enthält maximal &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; Punkte der Form&lt;br /&gt;
::&amp;lt;math&amp;gt;(x_1,\dots,x_k), (x_2,\dots,x_{k+1}),\dots&amp;lt;/math&amp;gt;&lt;br /&gt;
: solange &amp;lt;math&amp;gt;x_l\cdots x_{l+k-2} \ne 0&amp;lt;/math&amp;gt; gilt. Durch diese Bedingung scheiden genau &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; Punkte aus. Dabei ist &amp;lt;math&amp;gt;k\geq 2&amp;lt;/math&amp;gt; beliebig wählbar.&lt;br /&gt;
&lt;br /&gt;
=== Inverse Generatoren mit zusammengesetztem Modul ===&lt;br /&gt;
Um die Modulodivision durch das Abschneiden der höchstwertigen Bits ersetzen zu können, wäre es angenehm, Moduln &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; für die Berechnungsvorschrift&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_{n+1} = ( a y_n^{p-2} + b ) \, \bmod \, m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zuzulassen, die keine Primzahl, sondern eine Potenz von 2 sind. Dazu muss &amp;lt;math&amp;gt;y_0&amp;lt;/math&amp;gt; ungerade sein, und &amp;lt;math&amp;gt;a,b&amp;lt;/math&amp;gt; müssen so festgelegt werden, dass alle &amp;lt;math&amp;gt;y_n&amp;lt;/math&amp;gt; ungerade sind, denn dann kann das inverse Element zu &amp;lt;math&amp;gt;y_n&amp;lt;/math&amp;gt; eindeutig berechnet werden. Die Periodenlänge beträgt höchstens &amp;lt;math&amp;gt;m/2&amp;lt;/math&amp;gt;. Falls folgende Bedingungen erfüllt sind, beträgt sie genau &amp;lt;math&amp;gt;m/2&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;m=2^e \; \; \mbox{mit} \; \; e\geq 3&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;a \equiv  1 \; (\bmod 4)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;b \equiv  2 \; (\bmod 4)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Programmierung ===&lt;br /&gt;
Das folgende [[Programmiersprache|Programm]] in der [[Programmiersprache]] [[C++]] zeigt die Implementierung eines inversen Kongruenzgenerators mit &amp;lt;math&amp;gt;p=21269&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a=8&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;b=3&amp;lt;/math&amp;gt;. Es erzeugt 10 [[Zufallszahl]]en, die in einem [[Feld (Datentyp)|Array]] gespeichert werden. Das [[Multiplikation|multiplikativ]] [[Inverses Element|inverse Element]] von &amp;lt;math&amp;gt;y_n&amp;lt;/math&amp;gt; [[modulo]] &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; wird mit dem [[Restklassenring#Invertierbarkeit und Inversenberechnung|erweiterten euklidischen Algorithmus]] bestimmt. Bei der Ausführung des Programms wird die Hauptfunktion &amp;#039;&amp;#039;main&amp;#039;&amp;#039; verwendet, die die Zufallszahlen auf der Konsole ausgibt.&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
// Diese Funktion bestimmt das multiplikative Inverse von a modulo b mithilfe des erweiterten euklidischen Algorithmus&lt;br /&gt;
int getModularMultiplicativeInverse(int a, int b)&lt;br /&gt;
{&lt;br /&gt;
    if (a == 0)&lt;br /&gt;
    {&lt;br /&gt;
        return 0; // Spezialfall: Inverses von 0&lt;br /&gt;
    }&lt;br /&gt;
    int d = 1; // Deklaration der lokalen Variablen&lt;br /&gt;
    int t = 0;&lt;br /&gt;
    int u = 0;&lt;br /&gt;
    int v = 1;&lt;br /&gt;
    while (b != 0)&lt;br /&gt;
    {&lt;br /&gt;
        int q = a / b;&lt;br /&gt;
        int b1 = b; // Variable zum Zwischenspeichern&lt;br /&gt;
        b = a - q * b;&lt;br /&gt;
        a = b1;&lt;br /&gt;
        int u1 = u; // Variable zum Zwischenspeichern&lt;br /&gt;
        u = d - q * u;&lt;br /&gt;
        d = u1;&lt;br /&gt;
    }&lt;br /&gt;
    return d;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion, die die Zufallszahlen erzeugt&lt;br /&gt;
int* inversiveCongruentialGenerator(int y0, int p, int a, int b, int count)&lt;br /&gt;
{&lt;br /&gt;
    int* randomNumbers = new int[count]; // Initialisiert das Array für die Zufallszahlen&lt;br /&gt;
    randomNumbers[0] = y0; // Startwert für den Zufallszahlengenerator&lt;br /&gt;
    for (int i = 0; i &amp;lt; count; i++)&lt;br /&gt;
    {&lt;br /&gt;
        randomNumbers[i] = (a * getModularMultiplicativeInverse(randomNumbers[i - 1], p) + b) % p;&lt;br /&gt;
    }&lt;br /&gt;
    return randomNumbers;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Hauptfunktion die das Programm ausführt&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int y0 = 0; // Deklaration der lokalen Variablen&lt;br /&gt;
    int p = 21269;&lt;br /&gt;
    int a = 8;&lt;br /&gt;
    int b = 3;&lt;br /&gt;
    int count = 10;&lt;br /&gt;
    int* randomNumbers = inversiveCongruentialGenerator(y0, p, a, b, count); // Aufruf der Funktion&lt;br /&gt;
    for (int i = 0; i &amp;lt; count; i++)&lt;br /&gt;
    {&lt;br /&gt;
        cout &amp;lt;&amp;lt; randomNumbers[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;
== Explizite inverse Generatoren ==&lt;br /&gt;
Manchmal liest man auch die Definition&lt;br /&gt;
:&amp;lt;math&amp;gt;y_{n+1} = (a n + b)^{-1} \mod p = ( a n + b )^{p-2}\,  \bmod\,  p&amp;lt;/math&amp;gt;&lt;br /&gt;
oder auch&lt;br /&gt;
:&amp;lt;math&amp;gt;y_{n+1} = (a (n+y_0) + b)^{-1} \mod p = ( a (n+y_0) + b )^{p-2}\,  \bmod\,  p&amp;lt;/math&amp;gt;&lt;br /&gt;
Letzteres stellt keine Verallgemeinerung dar; man erhält durch Ausmultiplizieren sofort die obige Gestalt.&lt;br /&gt;
&lt;br /&gt;
=== Periodenlänge ===&lt;br /&gt;
Die maximale Periodenlänge beträgt wieder &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; und wird erreicht, falls &amp;lt;math&amp;gt;a\ne 0&amp;lt;/math&amp;gt; gilt.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Kongruenzgenerator]]&lt;br /&gt;
* [[Erweiterter euklidischer Algorithmus]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* [[Harald Niederreiter]]: &amp;#039;&amp;#039;Random Number Generation and Quasi-Monte Carlo Methods.&amp;#039;&amp;#039; Society for Industrial &amp;amp; Applied Mathematics, Philadelphia PA 1992, ISBN 0-89871-295-5 (&amp;#039;&amp;#039;Regional Conference Series in Applied Mathematics&amp;#039;&amp;#039; 63).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Zahlentheorie]]&lt;br /&gt;
[[Kategorie:Pseudozufallszahlengenerator]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Rigormath</name></author>
	</entry>
</feed>