Lineaarinen kongruenssimenetelmä on yksi menetelmistä pseudosatunnaislukujen generoimiseksi . Sitä käytetään yksinkertaisissa tapauksissa, eikä sillä ole kryptografista vahvuutta . Sisältyy eri kääntäjien vakiokirjastoihin .
Lineaarista kongruenssimenetelmää ehdotti D. G. Lehmer vuonna 1949. [1] Menetelmän ydin on laskea satunnaislukusarja olettaen
missä on moduuli ( luonnollinen luku , johon suhteutettuna jaon jäännös lasketaan ; ), on kerroin ( ), on lisäys ( ), on alkuarvo ( ).
Tätä sekvenssiä kutsutaan lineaariseksi kongruenttiksi sekvenssiksi . Esimerkiksi saamme sekvenssin [2]
Lineaarinen yhtenevä sarja, joka määritellään luvuilla , ja on jaksollinen jakson ollessa enintään . Tässä tapauksessa jakson pituus on yhtä suuri, jos ja vain jos [3] :
Tämän ominaisuuden olemassaolon tapaukselle , jossa on konesanan bittien määrä , osoitti M. Greenberg . [4] TE Hull ja AR Dobell todistivat tämän ominaisuuden olemassaolon yleisessä tapauksessa ja ehtojen riittävyyden . [5]
Menetelmää lineaarisen yhteneväisen sekvenssin generoimiseksi osoitteessa kutsutaan multiplikatiiviseksi kongruenttimenetelmäksi ja sekakongruenttimenetelmäksi . Kun , luoduilla luvuilla on lyhyempi jakso kuin , mutta tietyin edellytyksin voit saada jakson, jonka pituus on , jos on alkuluku . W.E. Thomson ( eng. WT Thomson ) ja itsenäisesti A. Rotenberg ( eng. A. Rotenberg ) totesivat sen tosiasian, että tila voi johtaa pitempien ajanjaksojen ilmaantumiseen . [2] Jotta taataan sekvenssin maksimitoistojakso kohdassa , on tarpeen valita parametrin arvoksi alkuluku. Tunnetuin tällainen generaattori on Stephen Parkin ja Keith Millerin vuonna 1988 ehdottama niin kutsuttu vähimmäisstandardi-satunnaislukugeneraattori . Myös hänelle . [6] [7]
Yleisimmin käytetty menetelmä näennäissatunnaisten lukujen sekvenssien muodostamiseksi on sekakongruenssimenetelmä.
Numeroa valittaessa on otettava huomioon seuraavat ehdot:
1) numeron on oltava melko suuri, koska jaksossa ei voi olla enemmän elementtejä;
2) luvun arvon tulee olla sellainen, että se voidaan laskea nopeasti.
Käytännössä menetelmää toteutettaessa valitaan määritettyjen ehtojen perusteella useimmiten , jossa on konesanan bittien määrä . Samalla on otettava huomioon, että tällä tavalla muodostettujen satunnaislukujen vähiten merkitsevät bitit osoittavat käyttäytymistä, joka on kaukana satunnaisesta, joten on suositeltavaa käyttää vain merkittävimpiä bittejä. Tätä tilannetta ei synny, kun , missä on konesanan pituus. Tässä tapauksessa alemmat bitit käyttäytyvät yhtä satunnaisesti kuin korkeammat bitit. [2] Kertoimen ja lisäyksen valinta johtuu pääasiassa tarpeesta täyttää enimmäispituusjakson saavuttamisen ehto.
Lineaaristen kongruenssigeneraattoreiden hyvien vakioiden taulukkoKaikki yllä olevat vakiot varmistavat generaattorin toiminnan maksimijaksolla. Taulukko on järjestetty suurimman tuotteen mukaan, joka ei aiheuta ylivuotoa määritetyn pituisessa sanassa. [kahdeksan]
Ylivuoto klo | a | c | m |
---|---|---|---|
2 20 | 106 | 1283 | 6075 |
2 21 | 211 | 1663 | 7875 |
222 _ | 421 | 1663 | 7875 |
2 23 | 430 | 2531 | 11979 |
2 23 | 936 | 1399 | 6655 |
2 23 | 1366 | 1283 | 6075 |
2 24 | 171 | 11213 | 53125 |
2 24 | 859 | 2531 | 11979 |
2 24 | 419 | 6173 | 29282 |
2 24 | 967 | 3041 | 14406 |
2 25 | 141 | 28411 | 134456 |
2 25 | 625 | 6571 | 31104 |
2 25 | 1541 | 2957 | 14 000 |
2 25 | 1741 | 2731 | 12960 |
2 25 | 1291 | 4621 | 21870 |
2 25 | 205 | 29573 | 139968 |
2 26 | 421 | 17117 | 81 000 |
2 26 | 1255 | 6173 | 29282 |
2 26 | 281 | 28411 | 134456 |
2 27 | 1093 | 18257 | 86436 |
2 27 | 421 | 54773 | 259 200 |
2 27 | 1021 | 24631 | 116640 |
2 28 | 1277 | 24749 | 117128 |
2 28 | 2041 | 25673 | 121500 |
2 29 | 2311 | 25367 | 120050 |
2 29 | 1597 | 51749 | 244944 |
2 29 | 2661 | 36979 | 175 000 |
2 29 | 4081 | 25673 | 121500 |
2 29 | 3661 | 30809 | 145 800 |
2 30 | 3877 | 29573 | 139968 |
2 30 | 3613 | 45289 | 214326 |
2 30 | 1366 | 150889 | 714025 |
2 31 | 8121 | 28411 | 134456 |
2 31 | 4561 | 51349 | 243 000 |
2 31 | 7141 | 54773 | 259 200 |
2 32 | 9301 | 49297 | 233280 |
2 32 | 4096 | 150889 | 714025 |
2 33 | 2416 | 374441 | 1771875 |
2 34 | 17221 | 107839 | 510300 |
2 34 | 36261 | 66037 | 312500 |
2 35 | 84589 | 45989 | 217728 |
"Epäonnistunut" (tulosjonon laadun kannalta) RANDU -algoritmi , jota on käytetty useissa kääntäjissä vuosikymmeniä, on surullisen kuuluisa.
Lukusarjan tilastollisten ominaisuuksien parantamiseksi monet näennäissatunnaislukugeneraattorit käyttävät vain tulosbittien osajoukkoa. Esimerkiksi ISO/IEC 9899 C -standardi tarjoaa (mutta ei määrittele pakolliseksi) esimerkin rand()-funktiosta, joka pakottaa hylkäämään matalat 16s ja yksi korkea numero.
#define RAND_MAX 32767 staattinen etumerkitön pitkä int seuraava = 1 ; int rand ( tyhjä ) { seuraava = seuraava * 1103515245 + 12345 ; paluu ( unsigned int )( seuraava / 65536 ) % ( RAND_MAX + 1 ); } void srand ( unsigned int seed ) { seuraava = siemen ; }Näin rand()-funktiota käytetään Watcom C/C++ -kääntäjässä . Muiden eri kääntäjissä ja kirjastoissa käytettyjen algoritmien numeeriset parametrit tunnetaan.
Lähde | m | tekijä a | termi c | käytettyjä bittejä |
---|---|---|---|---|
Numeeriset reseptit [9] | 2 32 | 1664525 | 1013904223 | |
Borland C/C++ | 2 32 | 22695477 | yksi | bitit 30..16 in rand() , 30..0 in lrand() |
glibc ( GCC :n käyttämä ) [10] | 2 31 | 1103515245 | 12345 | bittiä 30...0 |
ANSI C : Watcom , Digital Mars , CodeWarrior , IBM VisualAge C/C++ [11] | 2 31 | 1103515245 | 12345 | bittiä 30...16 |
C99 , C11 : Ehdotus standardissa ISO/IEC 9899 [12] | 2 32 | 1103515245 | 12345 | bittiä 30...16 |
Borland Delphi , Virtual Pascal | 2 32 | 134775813 | yksi | bitit 63..32 / (siemen * L) |
Microsoft Visual/Quick C/C++ | 2 32 | 214013 ( 343FD16 ) | 2531011 (269EC3 16 ) | bittiä 30...16 |
Microsoft Visual Basic (6 ja aikaisemmat) [13] | 2 24 | 1140671485 (43FD43FD 16 ) | 12820163 (C39EC3 16 ) | |
RtlUniform alkuperäisestä sovellusliittymästä [14] | 2 31 - 1 | 2147483629 (7FFFFFED 16 ) | 2147483587 (7FFFFFC3 16 ) | |
Apple CarbonLib , C++11 's minstd_rand0[15] | 2 31 - 1 | 16807 | 0 | katso MINSTD |
C++11 :t minstd_rand[15] | 2 31 - 1 | 48271 | 0 | katso MINSTD |
Donald Knuthin MMIX | 264 _ | 6364136223846793005 | 1442695040888963407 | |
Newlib | 264 _ | 6364136223846793005 | yksi | bitit 63…32 |
VAX :n MTH$RANDOM , [16] glibc :n vanhat versiot | 2 32 | 69069 | yksi | |
Java | 248 _ | 25214903917 | yksitoista | bitit 47…16 |
Aiemmin monissa kääntäjissä: | ||||
RANDU | 2 31 | 65539 | 0 |
Vaikka lineaarinen kongruenssimenetelmä tuottaa tilastollisesti hyvän näennäissatunnaisen numerosarjan, se ei ole kryptografisesti turvallinen. Lineaariseen kongruenssimenetelmään perustuvat generaattorit ovat ennakoitavissa, joten niitä ei voida käyttää kryptografiassa. Lineaariset yhtenevät generaattorit hakkeroivat ensin Jim Reeds ja myöhemmin Joan Boyar. Hän onnistui myös avaamaan neliö- ja kuutiogeneraattoreita. Muut tutkijat ovat laajentaneet Boyarin ideoita kehittämällä tapoja rikkoa mikä tahansa polynomigeneraattori. Siten todettiin kongruentteihin menetelmiin perustuvien generaattoreiden hyödyttömyys kryptografialle. Lineaariset kongruenssigeneraattorit ovat kuitenkin edelleen hyödyllisiä ei-salauksen sovelluksissa, kuten simulaatiossa. Ne ovat tehokkaita ja osoittavat hyvää tilastollista suorituskykyä useimmissa käytetyissä empiirisissa testeissä [8] .