Congruentiegenerator

Een congruentiegenerator is een algoritme dat pseudotoevalsgetallen genereert, dat wil zeggen getallenrijen die deterministisch worden gegenereerd en dus niet echt willekeurig zijn, maar veel kenmerken van toevalsgetallen hebben. Congruentiegeneratoren zijn de bekendste en meestgebruikte pseudotoevalsgeneratoren.

Een congruentiegenerator wordt bepaald door de volgende parameters:

  • het aantal toestandswaarden
  • de modulus
  • de multipliers
  • de toename

en het algoritme waarmee een nieuw gegenereerd getal gegenereerd wordt voor door de recurrente betrekking:

.

Daarin zijn de startwaarden.

Reële toevalsgetallen in het interval [0, 1] kunnen verkregen worden als , mits groot genoeg is om een voldoende nauwkeurige onderverdeling te geven.

De toestand van de generator voor de productie van wordt gegeven door de startwaarden. Deze toestand legt (voor gegeven , , , ) alle volgende toevalsgetallen vast, omdat het volgende toevalsgetal en de volgende toestand door de huidige toestand bepaald worden. Er zijn mogelijke toestanden, en daarom moet er na maximaal stappen een eerdere toestand herhaald worden. De congruentiegenerator produceert dus een periodieke rij getallen, waarbij de lengte van de periode veel kleiner dan kan zijn. In extreme gevallen is de lengte 1, en zal de generator altijd hetzelfde "toevalsgetal" geven. Bij het kiezen van de parameters is het dus onder andere van belang om te zorgen voor een periode die lang genoeg is.

Lineaire congruentie bewerken

Als  , spreekt men van een lineaire-congruentiegenerator. Het algoritme is:

 .

Is ook nog  , dus

 ,

dan is er sprake van een multiplicatieve-congruentiegenerator. De multiplicatieve congruentie heet ook Lehmer-congruentie, naar D. H. Lehmer die dit algoritme in 1949 introduceerde.

Fibonacci-generator bewerken

Een Fibonacci-generator is een congruentiegenerator met  ,   en  , en bestaat uit de volgende componenten:

  • Modulus  
  • Startwaarden  

Met de volgende functie worden de pseudowillekeurige getallen gegenereerd:

 .

Een kenmerk is dat de gevallen   respectievelijk   nooit voorkomen. Fibonacci-generatoren zijn dus niet geschikt als pseudotoevalsgenerator. Dit geldt met name voor wiskundige objecten waarvoor de productie van meer dan twee toevalsgetallen nodig is. Als men bijvoorbeeld probeert om een willekeurige wolk van punten in een kubus te genereren, dan zouden alle punten op twee vlakken liggen.

Vertraagde Fibonacci-generator bewerken

Het principe van de Fibonacci-generator kan worden gegeneraliseerd door niet de laatste twee, maar verder terug liggende waarden   te gebruiken om een nieuw toevalsgetal te genereren. Dit resulteert in een vertraagde (Eng. 'lagged') Fibonacci-generator:

 

met de startwaarden  .

Dan is   en   en de andere   zijn nul. Hierbij wordt   in het algemeen even gekozen en   en   worden gekozen, zodat de polynoom in  :   een primitieve polynoom modulo 2 is. De periode van de generator is dan minimaal  .

  is een primitieve polynoom modulo 2 dan en slechts dan als   dat ook is. Zo kan men in plaats van   ook altijd   berekenen.

De volgende tabel geeft enkele waarden voor   en   die aan deze voorwaarde voldoen:

A 2 31 55 73 98 100 135 258 607 3217 23209
B 1 13 24 25 27 37 22 83 273 576 9739

Deze generator wordt ook gebruikt in de praktijk. Het geeft echter niet altijd volledig willekeurige getallen. Het probleem van de gewone Fibonacci-generator is slechts verschoven; nu komen   of   nooit voor. Er zijn zelfs nog meer tekortkomingen.

Als oplossing werd voorgesteld om altijd alleen gebruikmaken van   opeenvolgende nummers, en dan de volgende   tot   getallen te verwerpen. Dit werkt goed, maar zorgt voor een 5 tot 11 keer hogere computatietijd. De door Donald Knuth voorgestelde generator ranarray werkt op deze manier. Hierbij is   en  , en van 1009 opeenvolgende getallen wordt slechts een blok van 100 getallen gebruikt.

Om voor een periode van   te zorgen, is alleen de minst significante bit in de toestandswaarde   van belang, dat wil zeggen, dat het van belang is of de bit even of oneven is. Het is mogelijk om de hogere orde bits naar behoefte te veranderen, om de kwaliteit van de resulterende toevalsgetallen te verbeteren. Bijvoorbeeld:

 

Verdere veralgemening bewerken

Men kan de vertraagde Fibonacci-generator verder veralgemenen door meer dan twee toestandswaarden te verwerken:

 .

Hier is   het grootste element in  . Om een periode van ten minste   te garanderen, moet ook hier de bijbehorende polynoom   of equivalent, de polynoom   een primitieve polynoom modulo 2 zijn (met een even modulus  ). Een generator die zo opgebouwd is met   levert over het algemeen beter toevalsgetallen dan met  , maar ook dit gaat ten koste van de rekentijd.

Met een verdere generalisering kan voor een gegeven   de lengte van de periode verhoogd worden en waarschijnlijk ook de kwaliteit van willekeurige getallen verbeterd worden.   is een priemfactor van  . Voor de rekenregel

 

zullen de  , met  , zodanig worden geselecteerd dat de polynoom in  

 

een primitieve polynoom modulo   is. Dan is de periode ten minste  .

De vorige generator vloeit hieruit voort met   en   als een bijzonder geval, en   levert een multiplicatieve congruentiegenerator met periode  .

De polynoom   is een primitieve polynoom modulo p als

  en  

voldoen aan:

  •   is een primitief element modulo  
  • de polynoom   is congruent aan   (modulo  )
  • voor alle priemfactoren   van   is de graad van de polynoom   positief.

Hiervoor wordt polynoomrekening gebruikt en er wordt modulo   gerekend met de coëfficiënten (het zijn elementen van de quotiëntring  ).