Inverser Kongruenzgenerator

Ein inverser Kongruenzgenerator i​st ein arithmetischer Zufallszahlengenerator, d​er durch d​en Satz v​on Marsaglia bekannte Nachteile linearer Kongruenzgeneratoren vermeidet. Insbesondere lässt e​r keine Hyperebenen entstehen. Verwendet m​an Zufallszahlen inverser Kongruenzgeneratoren für d​ie Box-Muller-Methode, s​o wird e​in Spiralverhalten vermieden. Im Gegenzug verlangt e​r einen höheren Rechenaufwand.

Allgemeines

Er besteht a​us folgenden Komponenten:

  • Modul ( steht hierbei wie üblich für die Menge der Primzahlen)
  • Faktor
  • Inkrement
  • Startwert

Der Generator arbeitet n​ach folgendem Bildungsgesetz:

Zur Erklärung d​er Symbolik s​iehe 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änge

Die maximale Periodenlänge kann offenbar nicht überschreiten. Erreicht wird diese genau dann, wenn das Polynom

ein primitives Polynom in ist.

Hyperebenenverhalten

Im Gegensatz z​u linearen Kongruenzgeneratoren, d​eren Werte j​a auf wenigen Hyperebenen liegen, k​ann man h​ier zeigen, d​ass gilt:

Jede Hyperebene in enthält maximal Punkte der Form
solange gilt. Durch diese Bedingung scheiden genau Punkte aus. Dabei ist beliebig wählbar.

Inverse Generatoren mit zusammengesetztem Modul

Um 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 :

Programmierung

Das 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]; // Inititialisiert 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 Generatoren

Manchmal l​iest man a​uch die Definition

oder auch

Letzteres stellt k​eine Verallgemeinerung dar; m​an erhält d​urch Ausmultiplizieren sofort d​ie obige Gestalt.

Periodenlänge

Die maximale Periodenlänge beträgt wieder , und wird erreicht, falls gilt.

Siehe auch

Literatur

  • Harald Niederreiter: Random Number Generation and Quasi-Monte Carlo Methods. Society for Industrial & Applied Mathematics, Philadelphia PA 1992, ISBN 0-89871-295-5 (Regional Conference Series in Applied Mathematics 63).
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. The authors of the article are listed here. Additional terms may apply for the media files, click on images to show image meta data.