Inverser KongruenzgeneratorEin inverser Kongruenzgenerator ist ein arithmetischer Zufallszahlengenerator, der durch den Satz von Marsaglia bekannte Nachteile linearer Kongruenzgeneratoren vermeidet. Insbesondere lässt er keine Hyperebenen 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. AllgemeinesEr besteht aus folgenden Komponenten:
Der Generator arbeitet nach folgendem Bildungsgesetz: Zur Erklärung der Symbolik siehe den Artikel Modulo. Wegen gibt es zu jedem ein eindeutiges multiplikativ inverses Element , so dass . Nur für muss man sich noch Gedanken machen. Rein formal wäre das inverse Element von . Da nicht darstellbar ist, wird es am besten übersprungen, indem man setzt, wie es auch der zweiten Darstellung (mit ) entspricht. PeriodenlängeDie maximale Periodenlänge kann offenbar nicht überschreiten. Erreicht wird diese genau dann, wenn das Polynom ein primitives Polynom in ist. HyperebenenverhaltenIm Gegensatz zu linearen Kongruenzgeneratoren, deren Werte ja auf wenigen Hyperebenen liegen, kann man hier zeigen, dass gilt:
Inverse Generatoren mit zusammengesetztem ModulUm die Modulodivision durch das Abschneiden der höchstwertigen Bits ersetzen zu können, wäre es angenehm, Moduln für die Berechnungsvorschrift zuzulassen, die keine Primzahl, sondern eine Potenz von 2 sind. Dazu muss ungerade sein, und müssen so festgelegt werden, dass alle ungerade sind, denn dann kann das inverse Element zu eindeutig berechnet werden. Die Periodenlänge beträgt höchstens . Falls folgende Bedingungen erfüllt sind, beträgt sie genau : ProgrammierungDas folgende Programm in der Programmiersprache C++ zeigt die Implementierung eines inversen Kongruenzgenerators mit , und . Es erzeugt 10 Zufallszahlen, die in einem Array gespeichert werden. Das multiplikativ inverse Element von modulo wird mit dem erweiterten euklidischen Algorithmus bestimmt. Bei der Ausführung des Programms wird die Hauptfunktion main verwendet, die die Zufallszahlen auf der Konsole ausgibt. #include <iostream>
using namespace std;
// Diese Funktion bestimmt das multiplikative Inverse von a modulo b mithilfe des erweiterten euklidischen Algorithmus
int getModularMultiplicativeInverse(int a, int b)
{
if (a == 0)
{
return 0; // Spezialfall: Inverses von 0
}
int d = 1; // Deklaration der lokalen Variablen
int t = 0;
int u = 0;
int v = 1;
while (b != 0)
{
int q = a / b;
int b1 = b; // Variable zum Zwischenspeichern
b = a - q * b;
a = b1;
int u1 = u; // Variable zum Zwischenspeichern
u = d - q * u;
d = u1;
}
return d;
}
// Funktion, die die Zufallszahlen erzeugt
int* inversiveCongruentialGenerator(int y0, int p, int a, int b, int count)
{
int* randomNumbers = new int[count]; // Initialisiert das Array für die Zufallszahlen
randomNumbers[0] = y0; // Startwert für den Zufallszahlengenerator
for (int i = 0; i < count; i++)
{
randomNumbers[i] = (a * getModularMultiplicativeInverse(randomNumbers[i - 1], p) + b) % p;
}
return randomNumbers;
}
// Hauptfunktion die das Programm ausführt
int main()
{
int y0 = 0; // Deklaration der lokalen Variablen
int p = 21269;
int a = 8;
int b = 3;
int count = 10;
int* randomNumbers = inversiveCongruentialGenerator(y0, p, a, b, count); // Aufruf der Funktion
for (int i = 0; i < count; i++)
{
cout << randomNumbers[i] << endl; // Ausgabe auf der Konsole
}
}
Explizite inverse GeneratorenManchmal liest man auch die Definition oder auch Letzteres stellt keine Verallgemeinerung dar; man erhält durch Ausmultiplizieren sofort die obige Gestalt. PeriodenlängeDie maximale Periodenlänge beträgt wieder und wird erreicht, falls gilt. Siehe auchLiteratur
|
Portal di Ensiklopedia Dunia