Inverz kongruens módszer

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2020. április 30-án felülvizsgált verziótól ; az ellenőrzések 3 szerkesztést igényelnek .

Az inverz kongruenciális módszer (vagy Eichenauer-Lehn generátor , esetleg Eichenauer-Lehn is) egy pszeudo-véletlen számgeneráló módszer , amely az inverz moduloszám felhasználásán alapul a sorozat következő tagjának generálásához.

Leírás

Az inverz kongruenciális módszert Eichenauer és Lehn javasolta 1986-ban [1] a nem rácsos lineáris kongruenciális módszer [2] helyettesítésére .

Ez a módszer abból áll, hogy véletlen számok sorozatát számítják ki a maradékok gyűrűjében természetes szám modulo .

A fő különbség a lineáris módszerhez képest az, hogy sorozat generálásakor az előző elem helyett az előző elemhez képest inverz szám kerül felhasználásra.

A generátor paraméterei a következők : [3] :

 -
 - szorzó
 - növekmény

Egyszerű n esetén

A sorozattagok értéke a következőképpen van megadva:

  ha
ha

Összetett n esetén

Ha a szám összetett, a sorozat elemeit a következőképpen számítjuk ki:

 

A paramétereket úgy választjuk meg, hogy .

Időszak

A sorozat periodikus, és a periódus nem haladja meg a gyűrű méretét . A maximális periódus akkor érhető el, ha a polinom primitív . A sorozat maximális periódusának elegendő feltétele az állandók ilyen megválasztása és az, hogy a polinom irreducibilis legyen [4] .

Kompozit esetén a maximális lehetséges periódus ( Euler függvény ) [5] .

Példa

A paraméterekkel rendelkező inverz kongruenciális generátor egy sorozatot generál a gyűrűben , ahol a és a számok , valamint a és inverzek egymással. Ebben a példában a polinom irreducibilis -ben, és a számok nem a gyökei, ezért a periódus maximális és egyenlő .

Megvalósítási példák

Python

A kód def egcd ( a , b ): ha a == 0 : return ( b , 0 , 1 ) else : g , y , x = egcd ( b % a , a ) return ( g , x - ( b // a ) * y , y ) def modinv ( a , m ): gcd , x , y = egcd ( a , m ) if gcd != 1 : return None # moduláris inverz nem létezik else : return x % m def ICG ( n , a , c , seed ): if ( seed == 0 ): return c return ( a * modinv ( seed , n ) + c ) % n mag = 1 n = 5 a = 2 c = 3 szám = 10 i tartományban ( szám ) : print ( mag ) seed = ICG ( n , a , c , seed ) _

C++

A kód #include <iostream> névtér használata std ; int mod_inv ( int a , int n ) { int b0 = n , t , q ; int x0 = 0 , x1 = 1 ; if ( n == 1 ) return 1 ; míg ( a > 1 ) { q = a / n ; t = n , n = a % n , a = t ; t = x0 , x0 = x1 - q * x0 , x1 = t ; } if ( x1 < 0 ) x1 += b0 ; vissza x1 ; } int ICG ( int n , int a , int c , int seed ) { ha ( mag == 0 ) visszatér c ; return ( a * mod_inv ( seed , n ) + c ) % n ; } int main ( void ) { int mag = 1 ; int n = 5 ; int a = 2 ; int c = 3 ; int count = 10 ; for ( int i = 0 ; i < count ; i ++ ) { cout << mag << endl ; mag = ICG ( n , a , c , mag ); } return 0 ; }

Kompozit inverz generátorok

Az inverz kongruenciális generátorok fő hátránya a számítási bonyolultság növekedése a periódus növekedésével. Ezt a hiányosságot az összetett inverz kongruenciális generátorok javítják.

A kompozit inverz generátorok felépítése két vagy több inverz kongruens generátor kombinációja.

Legyenek  külön prímszámok, mindegyik . Legyen minden indexen belüli  elem sorozata ponttal . Más szóval, .

Legyen  véletlen számok sorozata belül , ahol .

Az eredményül kapott sorozatot a következők összegeként határozzuk meg: .

A kapott sorozat periódusa [6] .

Ennek a megközelítésnek az egyik előnye a párhuzamosan futó inverz kongruenciális generátorok használata.

Példa egy összetett inverz generátorra

Hagyjuk és . Az egyszerűség kedvéért tegyük fel és . Mindegyikre kiszámoljuk .

Akkor . Vagyis egy ponttal rendelkező sorozatot kaptunk .

A törtszámok megszabadulása érdekében a kapott sorozat minden elemét megszorozhatjuk, és egész számsorozatot kaphatunk:

Az inverz kongruenciális generátorok előnyei

Az inverz kongruenciális generátorokat számos okból gyakorlati célokra használják.

Először is, az inverz kongruens generátorok meglehetősen jó egyenletességgel rendelkeznek [7] , ráadásul az így kapott sorozatokból teljesen hiányzik a lineáris kongruens generátorokra jellemző rácsszerkezet [1] [8] [9] .

Másodszor, az ICG-vel kapott bináris szekvenciák nem rendelkeznek nem kívánt statisztikai eltérésekkel. Az ezzel a módszerrel kapott szekvenciákat számos statisztikai teszttel igazolták, és változó paraméterekkel stabilak maradnak [7] [8] [10] [11] .

Harmadszor, az összetett oszcillátorok tulajdonságai megegyeznek az egyszeres lineáris inverz oszcillátorokéval [12] , ugyanakkor periódusuk jelentősen meghaladja az egyszeres oszcillátorok periódusát [13] . Ezenkívül a kompozit generátorok eszköze lehetővé teszi nagy teljesítménynövekedés elérését, ha többprocesszoros rendszereken használják [14] .

Létezik egy algoritmus, amely előre megjósolható periódushosszú és összetettségű kompozit generátorok fejlesztését teszi lehetővé, valamint a kimeneti sorozatok jó statisztikai tulajdonságaival [15] .

Az inverz kongruenciális generátorok hátrányai

Az inverz kongruenciális generátorok fő hátránya a sorozat elemeinek generálásának lassú sebessége: a sorozat egy elemének kiszámításához szorzási műveletek szükségesek [16] .

Jegyzetek

  1. 1 2 Knut, 2013 , p. 45.
  2. Eichenauer, Lehn, 1986 .
  3. Hellekalek, 1995 , p. 255: "Ki kell választanunk a p modulust, egy a szorzót, egy b additív tagot."
  4. Amy Glen: On the Period Length of Pseudorandom Number Sequences, 2002 , 5.3, p. 67: "Ha x2-bx-a egy primitív polinom Fp felett, akkor Xi teljes p periódushosszú".
  5. Amy Glen: Az álvéletlen számsorozatok periódushosszáról, 2002 , 5.4, p. 69: "A Xi sorozat tisztán periodikus, periódushossza d ≤ φ(m)".
  6. Hellekalek, 1995 , p. 256: "Elemi látni, hogy az (Xn)n sorozat periódusa egyenlő M := p1*p2*...* pr".
  7. 1 2 Eichenauer-Herrmann, Niederreiter, 1992 .
  8. 1 2 Eichenauer-Herrmann, 1991 .
  9. Eichenauer-Herrmann, Grothe, Niederreiter et al, 1990 , p. 81: "Ezek a generátorok nem mutatják a széles körben használt lineáris kongruenciális generátorok egyszerű rácsszerkezetét."
  10. Eichenauer-Herrmann, 1993 .
  11. Hellekalek, 1995 , p. 261: "Az inverzív módszerek kiváló elméleti és empirikus tulajdonságai a paraméterek változása mellett stabilak maradnak, feltéve, hogy maximális periódushosszunk van."
  12. Bubicz, Stoklosa, 2006 , p. 2: "Az összetett megközelítés az előállított sorozatok ugyanazokat a kiemelkedő tulajdonságait adja, mint az egyedi inverzív generátorok".
  13. Bubicz, Stoklosa, 2006 , p. 2: "Összetett inverzív generátorok lehetővé teszik az egyetlen ICG-nél lényegesen hosszabb periódushossz elérését".
  14. Bubicz, Stoklosa, 2006 , p. 2: "Úgy tűnik, többprocesszoros párhuzamos hardverplatformokra tervezték."
  15. Bubicz, Stoklosa, 2006 , p. 2: „Létezik egy állandó és egyszerű módja a paraméterválasztásnak, amely a Chou algoritmuson alapul. Garantálja a maximális hosszúságot."
  16. Anne Gille-Genest: Pseudo-Random Numbers Generators, 2012 , p. 12: "Mindkét inverz generátor fő hátránya, hogy egy véletlen szám kiszámítása O(log m ) szorzást igényel F m -ben , így az algoritmus nem gyors."

Irodalom

Könyvek
  • Knut D. E. A programozás művészete : 2. kötet. Megszerzett algoritmusok - 3 - M .: Williams , 2013. - 828 p. — ISBN 978-5-8459-0081-4
Cikkek