7 Zufallszahlen 7.1 Bedeutung 7.2 Lehmer-Generatoren für Zufallszahlen 7.2.1 7.2.2 7.2.3 7.2.4 7.2.5 Aufbau Kombination von Generatoren Berechnung von (a*s) mod m Empfehlung von Park und Miller Empfehlungen von Knuth 7.3 Tausworthe-Generatoren 7.3.1. 7.3.2 7.3.3 7.3.4 Aufbau Golombs Gütekriterien Implementation Parallele Nutzung 7.4 Generator von Blum, Blum und Shub 7.5 Test von Zufallszahlen 7.5.1 7.5.2 7.5.3 7.5.4 Chi-Quadrat-Test Empirische Tests Tests für Bitfolgen Tests nach FIBS 140-1 7.6 Anwendungen 7.6.1 7.6.2 7.6.3 Verschlüsselungsverfahren Primzahltests Buffons Nadelexperiment Bedeutung der Zufallszahlen: Zufallszahlen benötigt man in vielen Gebieten, z.B. (i) um Glücksspiele durchzuführen, (ii) um ausgesuchte Eigenschaften von Algorithmen zu bestimmen, z. B. ihre Effizienz, (iii) um Simulationsexperimente durchzuführen, (iv) zur Nutzung in der numerischen Mathematik (Stichwort: Monte Carlo Algorithmen), (v) um Nachrichten zwecks Geheimhaltung zu verschlüsseln, (vi) zur Nutzung in der genetischen Programmierung, (vii) als neutrale Datenquelle in probabilistischen Testverfahren, (viii) zur Nutzung in probabilistischen Algorithmen, (ix) als Hilfsmittel zur Erzeugung von Kompositionsvielfältigkeiten in der bildenden Kunst, u. s. w. Beispielausgabe eines von Neumannschen MittelquadratZufallszahlen-Generators, hier für vierstellige Dezimalzahlen: Form: Startwert: x := (x*x div 100) mod 10000 6239 Dies ist eine längste Folge für vierziffrige Startwerte, bis periodische Wiederholung einsetzt, *-Zeichen kennzeichnen die Periode. 6239 9251 5810 7561 1687 8459 5546 7581 4715 2312 3453 9232 2298 2808 8848 2871 2426 8854 3933 4684 9398 3224 3941 5314 2385 6882 3619 971 9428 8871 6946 2469 959 9196 5664 808 6528 6147 7856 7167 3658 3809 5084 8470 7409 8932 7806 9336 1608 5856 2927 5673 1829 3452 9163 9605 2560 5536 6472 8867 6236 8876 7833 3558 6593 4676 8649 8052 8347 6724 2121 4986 8601 9772 4919 1965 8612 1665 7722 6292 5892 7156 2083 3388 4785 8962 3174 742 5505 3050 3025 1506 2680 1824 3269 6863 1007 140 196 384 1474 1726 9790 8441 2504 2700 2900 4100 8100 * 6100 * 2100 * 4100 * Lehmer-Generator: Form (L): mit xn+1 := (a * xn + c) mod m m = a = c = x0 = Modul Multiplikator Addend Startwert (0 (1 (0 (0 < < ≤ ≤ (n ≥ 0) m) a < m) c < m) x0 < m) Beispiel: xn+1 := (7 * xn + 6) mod 64 Periodenstruktur von xn+1 = (7 * xn + 6) mod 64: 1) 0, 6, 48, 22, 32, 38, 16, 54 2) 1, 13, 33, 45 3) 2, 20, 18, 4, 34, 52, 50, 36 4) 3, 27 5) 5, 41, 37, 9 6) 7, 55 7) 8, 62, 56, 14, 40, 30, 24, 46 8) 10, 12, 26, 60, 42, 44, 58, 28 9) 11, 19 10) 15, 47 11) 17, 61, 49, 29 12) 21, 25, 53, 57 13) 23, 39 14) 31 15) 35, 59 16) 43, 51 17) 63 Bemerkung: Verfügt man über Lehmer-Generatoren, die Zahlenfolgen der Periode m erzeugen, dann entfällt das Startwertwahlproblem weitgehend. Es gilt: x1 = (a ∗ x0 + c) 2 x2 = (a ∗ x0 + a ∗ c + c) 3 2 x3 = (a ∗ x0 + a ∗ c + a ∗ c + c) 4 3 2 x4 = (a ∗ x0 + a ∗ c + a ∗ c + a ∗ c + c) ... allgemein: an − 1 n xn = ( a ∗ x0 + ∗ c ) modm (n ≥ 0) a−1 mod m mod m mod m mod m oder auch: xn + k ak − 1 ∗ c) mod m = (a ∗ xn + a −1 k (n ≥ 0, k ≥0) Sei nun λ > 0 der kleinste Index mit xλ = x0 , dann muß aλ − 1 λ x 0 = (a ∗ x 0 + ∗ c) mod m gelten, diese Formel kann a −1 man benutzen, um den folgenden Satz herzuleiten. Satz: Ein linearer Generator der Form L besitzt eine Periode der Maximallänge m genau dann, falls gilt: (i) c und m sind teilerfremd, (ii) jede Primzahl p, die m teilt, teilt auch a-1, (iii) a-1 ist ein Vielfaches von 4, falls m ein Vielfaches von 4 ist. Bemerkung: Der Generator xn+1 := (41*xn + 5) mod 64 erfüllt die Bedingungen des Satzes. Spezialfälle: e (i) Modul m = 2 , Addend c > 0: e Die volle Periode m = 2 erreicht man nur, falls für den Multiplikator a ≡ 1 (mod 4) gilt und der Addend c ungerade ist. Die niederwertigen Bit sind nur geringfügig zufällig. (ii) Modul m = 2 , Addend c = 0: e-2 Die maximale Periode ist 2 , man erreicht sie, falls für den Multiplikator a ≡ 3 (mod 8) oder a ≡ 5 (mod 8) gilt. Die niederwertigen Bit sind nur geringfügig zufällig. e (iii) Modul m ist eine Primzahl größer als 2, c = 0: Die Periode ist in diesem Fall maximal m – 1, der Zufallswert 0 ist zu meiden. Eine maximale Periode erhält man, falls man als Multiplikator a ein primitives Element modulo m wählt. Wählt man c ≠ 0, dann ist die maximale Periode auch nur m – 1, denn die Kongruenz x ≡ a*x + c (mod m) hat genau eine Lösung. Der Grad der Zufälligkeit der niederwertigen Bit ist durch a bestimmt, er ist im Einzelfall zu ermitteln. Zum Begriff primitives Element: Betrachten wir die Rekursion (R11) xn+1 := a * xn mod 11 mit Startwert 1: Für a = 2, 3, 4, ..., 10 erhält man die Zyklen: a a a a a a a a a = = = = = = = = = 2: 3: 4: 5: 6: 7: 8: 9: 10: 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 3, 9, 4, 5, 5, 3, 6, 3, 7, 5, 8, 9, 9, 4, 10 8, 5, 9, 4, 7, 2, 6, 3, 5, 4 3 9 9, 3, 4, 5 10, 9, 7, 3, 6 10, 5, 8, 4, 2 10, 4, 6, 9, 8 10, 3, 2, 5, 7 Nur die Multiplikatoren 2, 6, 7 und 8 führen zum Auftreten aller Zahlen ≠ 0 bei der Rekursion R11. Man nennt sie primitive Elemente modulo 11. Satz: Sei p eine ungerade Primzahl und sei a ≡ 0 (modulo p). a ist genau dann ein primitives Element modulo p, falls gilt: für jeden Primfaktor q von p – 1 ist: (p – 1) / q a ≡ 1 (modulo p). Zur Zufälligkeit der niederwertigen Bit: Ausgabe des Generators xn+1 := (9 * xn + 1) mod 32 bei Startwert x0 = 1: Nummer Zahl 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 10 27 20 21 30 15 8 9 18 3 28 29 6 23 16 Bitkette 00001 01010 11011 10100 10101 11110 01111 01000 01001 10010 00011 11100 11101 00110 10111 10000 Nummer Zahl 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 17 26 11 4 5 14 31 24 25 2 19 12 13 22 7 0 Bitkette 10001 11010 01011 00100 00101 01110 11111 11000 11001 00010 10011 01100 01101 10110 00111 00000 Bem.: Sei xn+1 := (a*xn + c) mod m (n ≥ 0), sei t ein Teiler von m, sei yn := xn mod t (n ≥ 0), dann gilt: yn+1 := (a*yn + c) mod t (n ≥ 0). Dies folgt aus: ∃ f mit xn+1 = a*xn + c – f*m, bildet man auf beiden Seiten den Rest bezüglich t, dann erhält man die Rekursion für yn. Zweidimensionale Darstellung der Ausgabe aller Punktpaare (xi, xi+1) des Generators xn+1 := (31 * xn) mod 61 60: : : : : : 55: : : : 50: : : : : 45: : : : : 40: : : : : 35: : : : : 30: : : : : 25: : : : : 20: : : : : 15: : : : : 10: : : : : 5: : : : : 0: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ------------------------------------------------------------0 5 0 5 0 5 0 5 0 5 0 5 0 * Bemerkung: Die Verteilung der 60 Punktpaare im (60, 60)-Quadrat macht nicht den Eindruck einer gleichmäßigen, zufälligen Verteilung. Zweidimensionale Darstellung der Ausgabe aller Punktpaare (xi, xi+1) des Generators xn+1 := (43 * xn) mod 61 60: * : * * : : * * : 55: * : * : * * : : * 50: * : * * : : * * : : * 45: * : * * : : * * 40: : * : * : * : * 35: * : * : * : * * : * 30: : * : * : * : * 25: * : * : * : * : * 20: * : * * : : * : * : 15: * * : * : * : * 10: * : * * : : * * : * 5: * : : * : * : * 0: ------------------------------------------------------------0 5 0 5 0 5 0 5 0 5 0 5 0 Bemerkung: Die Verteilung der 60 Punktpaare im (60, 60)-Quadrat ist gleichmäßiger als im Fall des Multiplikators 31; der Spektraltest ermöglicht eine Unterscheidung zwischen guten und weniger guten Multiplikatoren. Kombinieren von Lehmer-Generatoren: Lemma: Seien W1 und W2 zwei unabhängige ganzzahlige Zufallsvariablen; W1 sei gleichverteilt im Intervall [0, m) und der Wertebereich von W2 liege im Inter-vall [a, b]. Dann gilt: W = (W1 + W2) mod m ist gleichverteilt in [0, m). Beweis: Sei k ∈ [0, m), dann gilt für die Wahrscheinlichkeit P (W = k): P( W = k ) = ∞ ∑ P( W1 + W2 = k + i ∗ m ) i = −∞ b = ∑ P( W2 = j) ∗P ( W1 = (k − j) mod m ) j= a b 1 ∗ ∑ P(W2 = j) m j= a 1 = q.e.d. m = Bemerkung: Verfügt man über mehrere Lehmer-Generatoren L1, L2, ... , Ln, dann gewinnt man durch Addition oder Subtraktion dieser Generatoren einen neuen Generator. Seine Periode wird bestimmt durch das kleinste gemeinsame Vielfache der Perioden der benutzten Generatoren. // // // // // Zufallszahlengenerator von Brian Wichmann und David Hill aus Byte 12,3; pp. 127–128; (3/1987); programmiert für Rechner und Implementationen von Hochsprachen, deren Ganzzahlen mittels 16 Bit dargestellt werden. #include <cmath> static int x = 7; static int y = 77; static int z = 777; // Zustand gen1 // Zustand gen2; // Zustand gen3; int gen1 () { // x = (171 * x) mod 30269 x = 171 * (x % 177) - 2 * (x / 177); if (x < 0) x += 30269; return x ; }//gen1 int gen2 () { // y = (172 * y) mod 30307; y = 172 * (y % 176) - 35 * (y / 176); if (y < 0) y += 30307; return y; }//gen2 int gen3 () { // z = (170 * z) mod 30323; z = 170 * (z % 178) - 63 * (z / 178); if (z < 0) z += 30323; return z; }//gen3 // Vor dem ersten Aufruf von random sollten die // Zustandsvariablen mit Zahlen zwischen 1 und 30000 // initialisiert werden. double random () { int x = gen1 (); int y = gen2 (); int z = gen3 (); double t = x/30269.0 + y/30307.0 + z/30323.0; t -= floor (t); return t; }//random // Der Generator besitzt eine Periode von // 6.953.607.871.644, dies ist das kleinste gemeinsame // Vielfache von 30269–1, 30307–1 und 30323–1. Berechnung von (171 * x) mod 30269 für 0 <= x < 30269 auf einem Rechner mit vorzeichenbehafteten 16-Bit Ganzahlen ohne Unter- oder Überlauf. Sei x = 177 * r + s mit 0 ≤ r < 172 und 0 ≤ s < 176 Dann a = = = = = (171* x) mod 30269 (171* 177 * r + 171 * s) mod 30269 (30267 * r + 171 * s) mod 30269 ((30269 – 2)* r + 171 * s) mod 30269 (171 * s – 2 * r) mod 30269 Bemerkungen: (i) Ist die Größe a negativ, dann wird sie durch eine einmalige Addition von 30269 positiv. (ii) Analog zeigt man die Korrektheit der angegebenen Berechnungen für y = (172 * y) mod 30307 und z = (170 * z) mod 30323. Berechnung von (a ∗ s) mod m durch angenäherte Faktorisierung: Vor.: (i) 0 < m, m ganzzahlig (ii) 0 < a < m, a ganzzahlig (iii) 0 < s < m, s ganzzahlig Zerlege m gemäß m = m/a ∗ a + m mod a = q∗a + r Nun ist s = s/q ∗ q + s mod q, damit (a ∗ s) mod m = (a ∗ s/q ∗ q + a ∗ s mod q) mod m = (a ∗ q ∗ s/q + a ∗ s mod q) mod m = ((m − r) ∗ s/q + a ∗ s mod q) mod m (1) = (a ∗ s mod q − r ∗ s/q) mod m Nun (2) 0 ≤ a ∗ s mod q ≤ a ∗ q ≤ m (3) 0 ≤ r ∗ s/q ≤ r ∗ m/q ≤ m, falls r ≤ q Gilt (4) r = m mod a ≤ m div a = q, dann läßt sich (a ∗ s) mod m ohne Unterlauf oder Überlauf berechnen, wie aus (1), (2) und (3) folgt, falls alle Zahlen zwischen 0 und m darstellbar sind. Bemerkungen: 2 (i) Hinreichend für (4) ist: a ≤ m. (ii) Gilt (4) nicht, dann wiederholt man obiges Verfahren zur Berechnung von (r ∗ s/q) mod m, hierbei ist r < a, womit nach Bemerkung (i) das Verfahren konvergiert. Empfehlung von Park und Miller: Bemerkung: Die Autoren nennen diesen Generator den Minimalstandard. // Private constants int const m = 2147483647; int const a = 48271; // = 2^31 - 1 // vorher: 16807 // Der Multiplikator 48271 liefert gute Ergebnisse // beim Spektraltest. // Private global variable static int s = 314156; // Startwert austauschbar double random () { static int const q = m / a; // m div a = 44488 static int const r = m % a; // m mod a = 3399 // hier: m mod a <= m div a int t = a * (s % q) - r * (s / q); s = (t > 0) ? t : t + m; return double (s) / double (m); }// random 119 Werte aus Park-Miller-Generator: 0.0615785 0.454093 0.529076 0.0323609 0.0915079 0.179958 0.745017 0.723199 0.549313 0.897723 0.96913 0.85832 0.951798 0.221517 0.838093 0.568722 0.800124 0.78123 0.773503 0.759348 0.476195 0.423786 0.59633 0.467971 0.405241 0.395446 0.55617 0.870495 0.661351 0.0788992 0.543289 0.082255 0.532985 0.695545 0.630638 0.549417 0.904053 0.566268 0.313281 0.39865 0.251371 0.923453 0.0142327 0.0243577 0.768212 0.353732 0.0177051 0.641809 0.785729 0.900474 0.803796 0.0484152 0.051372 0.776847 0.200312 0.277336 0.301639 0.435707 0.00678907 0.715382 0.214854 0.20778 0.743274 0.560187 0.801608 0.405263 0.44494 0.72122 0.0236372 0.991878 0.930624 0.158735 0.303485 0.544629 0.784409 0.227 0.534783 0.509807 0.870688 0.980321 0.0867625 0.110459 0.960339 0.511774 0.850218 0.852749 0.0610166 0.330844 0.18896 0.296276 0.536301 0.784664 0.495256 0.480233 0.349615 0.281214 0.490855 0.0570173 0.280507 0.356536 0.330721 0.25465 0.219507 0.840382 0.057848 0.382201 0.242333 0.64218 0.678683 0.685739 0.308739 0.132027 0.0531209 0.198086 0.800794 0.108526 0.65618 0.447911 0.0910482 Empfehlungen von Knuth für Lehmer-Generatoren: xn+1 := (a ∗ xn + c) mod m (n ≥ 0) (i) Wähle den Modul m groß, die Rekursionsformel ist exakt auszuwerten. (ii) Ist m = 2 , dann gelte a mod 8 = 5, ist m = 10 , dann gelte a mod 200 = 21. x y (iii) Für a möge gelten √m < a < m − √m. (iv) Das Ziffernmuster von a sollte "recht unregelmäßig" sein. (v) Die Additionskonstante c sollte ungerade sein und nicht ein Vielfaches von 5. (vi) Man sollte daran denken, daß die niederwertigen Ziffern der Zahlen x0, x1, x2, ... nicht immer sehr zufällig sind (Gilt nur eingeschränkt für Primzahlmodul). Die Bemerkung (vi) hat Auswirkungen auf die Gewinnung kleiner Zufallszahlen aus großen Zufallszahlen. Sei xi (i ≥ 0) eine Folge von Zufallszahlen, die Ableitung von Zufallszahlen aus dem Intervall [0, r) sollte nicht mittels ri = xi mod r erfolgen, sondern eher mittels ((xi div u) ∗ r) div v oder auch mittels (xi div w) mod r für sinnvoll gewählte u, v oder w. Beispiel zu (vi): 8 m = 10 a = 31415821 c = 1 Der Startwert x = 1234567 liefert die folgenden 20 Zahlen: 35884508 80001069 63512650 43635651 1034472 87181513 6917174 209855 67115956 59939877 46594018 29158779 81642560 50941761 45000782 12172023 95775884 27860765 6163066 78267187 ⇑ Hier Regelmäßigkeit in der letzten Ziffer. Eine einfache Erweiterung des Lehmer-Generators: (T) xn := (a1*xn-1 + a2*xn-2 + ... + ak*xn-k) mod p Wählt man als Modul 2, dann verfügt man über einen Generator für zufällige Bitketten, traditionell nennt man Generatoren dieser Art Tausworthe-Generatoren. Bemerkung: Ein Bitgenerator der Form T hat eine k Periode der Länge p - 1, falls p eine Primzahl ist und das zugeordnete Polynom k k-1 k-2 x - a1*x - a2*x - ... - ak im Körper k mit p Elementen primitiv ist. Primitive Polynome zu bestimmen ist aufwendig, es existieren aber umfangreiche Tabellenwerke, beispielsweise sind die folgenden Polynome für p = 2 primitiv: 5 2 x +x +1 5 3 x +x +1 5 4 3 2 x +x +x +x +1 5 4 2 x +x +x +x+1 32 7 5 3 2 x +x +x +x +x +x+1 64 4 3 x +x +x +x+1 So liefert der Generator xn := xn-1 + xn-3 + xn-4 + xn-5 mit den Startwerten (x4, x3, x2, x1, x0) = (1, 1, 1, 0, 0) die Bitfolge mit der Periode 31: (B) 0 0 1 1 0 1 1 1 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 1 0 0 0 0 1 1 1 S. W. Golomb führte für maschinell erzeugte Bitketten b0, b1, b2, b3, b4, ... folgende Mindestanforderungen ein: K1: In einer Periode differieren die Zahl der 0-Bit und die Zahl der 1-Bit höchstens um 1. K2: In einer Periode haben mindestens die Hälfte der Läufe eine Länge von 1, mindestens ein Viertel der Läufe eine Länge von 2, mindestens ein Achtel der Läufe eine Länge von 3, ... K3: Die Autokorrelation ist zweiwertig, genauer p ∑ ( 2∗ b i − 1)∗ ( 2∗ b i + t − 1) = i=0 k p−1 ( t = 0) ( 1 ≤ t ≤ p − 1) Bemerkung: Eine Folge von 1-Bit, die durch 0-Bit begrenzt wird, nennt man einen 1-Lauf; analog definiert man den 0-Lauf. Für die obige Bitfolge B erhält man: ad K1: 15 0-Bit, 16 1-Bit ad K2: 16 Läufe: 8 Läufe der Länge 1 4 Läufe der Länge 2 2 Läufe der Länge 3 1 Lauf der Länge 4 1 Lauf der Länge 5 ad K3: Die Autokorrelationswerte sind 31 und −1. Schieberegister zur Implementation der Rekursion: xn := (xn-4 + xn-5 + xn-6 + xn-8) mod 2 8 4 3 (n ≥ 8) 2 beschreibendes Polynom: x + x + x + x + 1 7 0 6 1 5 0 4 1 3 1 ⊕ 2 0 1 1 ⊕ 0 0 ⊕ : 1−Bit Schieberegister, ⊕ : Exklusives Oder Folgezustände: 00101101 10010110 01001011 00100101 00010010 10001001 01000100 10100010 01010001 00101000 10010100 8 4 3 2 Bemerkung: Dem Polynom x + x + x + x + 1 läßt sich ein weiteres Schieberegister zuordnen, das bei der Programmierung in Hochsprachen einfacher zu nutzen ist. Beispiel: Erzeugung einer Bitfolge 32 Primitives Polynom: x 7 5 3 2 +x +x +x +x +x+1 Imitation eines Schieberegisters: unsigned sr32 () { static unsigned sr = Startwert; sr = (((( sr >> 7) ^( sr >> 5) ^( sr >> 3) ^( sr >> 2) ^( sr >> 1) ^( sr )) & 1) << 31) | (sr >> 1); return (sr & 0x80000000) >> 31; }//sr32 Zyklische Nutzung einer Tabelle: static unsigned bitw [32] = {Startwerte}; unsigned b32 () { static unsigned n = 31; n = (n+1)%32; bitw [n] = ( bitw [(n-25)%32] + bitw [(n-27)%32] + bitw [(n-29)%32] + bitw [(n-30)%32] + bitw [(n-31)%32] + bitw [(n-32)%32]) % 2; return bitw [n]; }//b32 // // // // // // // // Beispiel eines Tausworthe-Generators (auch verzögerter Fibonacci-Generator genannt) zur Erzeugung von Zufallszahlen; ein primitives Polynoms wird mit verschiedenen Anfangswerten parallel genutzt. Hier: Trinom x^q + x^p + 1; formelmäßig: x[k] := x [k-q+p] xor x [k-q] für k >= q oder : x[k] := x [k-p] xor x [k-q] für k >= q erprobte Paare (p, q) = (103, 250), (27, 98), (37, 532) // Wichtig ist ein guter Zufallszahlengenerator zur // Bereitstellung von Anfangswerten. int irandom () { /* z. B. Parks Empfehlung */ } // Die folgende Beschreibung läßt sich vereinfachen. const int pp = 103; const int qq = 250; static int p = pp-1; static int q = qq-1; static int table [qq]; void init_table () { for (int i = 0; i < qq; ++i) table [i] = irandom (); }//init_table int trand () { p = (p+1) % qq; q = (q+1) % qq; table [q] ^= table [p] ; return table [q]; }//trand Einige Beispielwerte des Generators (103, 250): 1819300605 1031285057 1934834310 455124156 1501855213 1104661026 144372488 2064976827 1453972417 1948531071 1700171956 190647411 1949347147 1336350827 1377025091 1131188961 406129345 1532409484 304225778 976411586 2117158018 1884439084 126172790 1676996747 2135738079 341210488 1489611118 210741831 1101452714 541835016 1148109169 36004216 885107139 206234496 1537131527 1629314416 1052679710 383226574 1917392911 555425406 891886653 1445586440 1130783474 2008889607 271449401 1452572210 1799383689 403840454 1582439978 129540647 1671612985 1775174694 815228250 696017821 1626624905 771542948 2131821843 300347862 443868223 1924308412 1128251553 1593618472 309005370 989139608 674722943 982183676 1617688801 430783668 2139809744 1287909855 650744332 558420571 688080882 344168785 1621645808 1256046690 932958997 1904092835 1702986752 1211428917 Zur Initialisierung paralleler Generatoren: Beispiel: xn := (xn-10 + xn-7) mod 2 für n = 10, 11, 12, Bild: Vierfache Parallelität xn–10 xn–9 xn–8 xn–7 xn–6 xn–5 xn–4 xn–3 xn–2 xn–1 Bemerkung: Nutzt man obigen Generator parallel, um Zufallszahlen im Intervall [0, 16) zu erzeugen, dann muß man bei der Initialisierung darauf achten, daß keine Reihe nur 0–Bit enthält. Ersetzt man die parallele Anwendung der Modulo–2–Addition durch eine 4 Addition modulo 2 , dann muß man nur darauf achten, daß die das niederwertigste Zahlbit repräsentierende Reihe mindestens ein 1–Bit enthält. Dies sicherzustellen ist trivial, ein erwünschter Nebeneffekt ist die Erhöhung der Periode. Generator von Blum, Blum, Shub: 1. Wähle zwei Primzahlen p und q mit p mod 4 = 3 und q mod 4 = 3 und berechne n = p * q. 2. Wähle s aus [1, n–1] mit s teilerfremd zu n und berechne 2 x0 := s mod n. 3. Bilde Folge 2 xi+1 := xi mod n (i ≥ 0) 4. Die Folge zi := xi mod 2 (i ≥ 0) ist eine kryptographisch sichere Bitfolge. Bemerkung: Die letzten log2 (n) Bit der Zahlen zi (i ≥ 0) werden als kryptographisch sicher angesehen. Beispiel: Die ersten 200 Bit des Generators x := (x*x) mod (223*251) bei Startwert 321: 0111111110111111111010000011 1111011110001110110000101110 1101100011000100001101010000 0110011011011110000001010111 0101101001110101111111001111 0110100000010010110100100111 1010010011010100010111111101 0000 Bemerkung: Es ist wichtig, daß die Primzahlen p und q hinreichend groß sind, wählt man z. B. p = 7, q = 11, dann hat die Folge zi (i ≥ 0) höchstens eine Periode von 4, dies ist bedeutend kleiner als 77. Daher sollte man an p und q die zusätzlichen Forderungen stellen, p = 2*p1 + 1, p1 = 2*p2 + 1, q = 2*q1 + 1, q1 = 2*q2 + 1 mit p1, p2, q1 und q2 prim. Selbst unter diesen zusätzlichen Bedingungen ist es schwierig, Anfangswerte zu finden, so daß die Folge zi (i ≥ 0) eine hinreichend lange Periode hat. So existieren nur zwei Zyklen der Länge 110 für den Generator x := (x * x) mod (23*47). Chi-Quadrat Test: Voraussetzungen: 1. Eine stochastische Quelle Q möge eine Folge unabhängiger Ereignisse e0, e1, e2, ... , en, ... liefern. 2. Die Ereignisse mögen k > 0 (nichtüberlappenden) Kategorien zuordbar sein; die Wahrscheinlichkeit, mit der ein Ereignis e zur Kategorie Ks gehört, sei ps > 0 (s = 1, ..., k). 3. Man kategorisiere n > 0 Ereignisse der Quelle Q, wobei ks die Zahl der Ereignisse in Kategorie Ks ist. Den Wert (1) 2 (k s − n ∗ ps ) 2 k χ = ∑ s=1 2 n ∗ ps nennt man die χ -Statistik mit k−1 Freiheitsgraden. Bemerkungen: 2 (i) Der Wert χ aus Zeile (1) läßt sich umformen zu: (2) 1 k ks 2 χ = ∗∑ −n n s= 1 ps 2 Dies folgt aus und k1 + k2 + ... + kk = n p1 + p2 + ... + pk = 1 (ii) Den Chi-Quadrat Test führte Karl Pearson im Jahre 1900 ein. Ian Hacking hält ihn für eine der 20 wichtigsten Erfindungen des zwanzigsten Jahrhunderts. (iii) Wie aus Zeile (1) ersichtlich, erhalten "seltene" Ereignisse eine hohe Gewichtung. (iv) Die Wahrscheinlichkeit einer Beobachtungskette mit k1 + k2 + ... + kk = n ist n! k k k ∗ p1 1 ∗ p 2 2 ∗ L ∗ p k k k1 ! ∗ k 2 ! ∗ L ∗ k k ! Hieraus lassen sich Vertrauensintervalle für eine Beobachtungskette der Länge n berechnen. (v) 2 Die tabellierte χ –Statistik ist unabhängig von n, daher ist sie für kleine n unzuverlässig. Beispielwerte sind: Freiheitsgrad 1 2 3 4 5 6 8 10 12 20 30 50 5%-Quantile 0.00393 0.1026 0.3518 0.7107 1.1455 1.635 2.733 3.940 5.226 10.85 18.49 34.76 95%-Quantile 3.841 5.991 7.815 9.488 11.07 12.59 15.51 18.31 21.03 31.41 43.77 67.50 (vi) Knuth gibt folgende Näherungsformel für Freiheitsgrade k > 30: χ 2 (k ) ≈ k + 2∗ k ∗ a + 2 2 1 ∗ a2 − + O k 3 3 mit a = −1.64 für 5%-Quantile und a = 1.64 für 95%-Quantile. (vii) Ein Beispiel: Eine Bitkette der Länge 50, die Wahrscheinlichkeit für das Auftreten eines 1-Bit sei 0.5. 1010100100 0110101000 1000101011 0011011000 1001100010 (4 (4 (5 (4 (4 1-Bit) 1-Bit) 1-Bit) 1-Bit) 1-Bit) Man hat 21 1-Bit und 29 0-Bit, die Hypothese für gleiche 1-Bit- und 0-Bit-Wahrscheinlichkeiten ergibt: 2 χ (1) = ( 21 − 25) 2 + ( 29 − 25) 2 25 25 = 32 = 1.28 25 Dieser Wert ist weder zu klein noch zu groß. Unterteilt man nun die Folge in 5 Abschnitte der Länge 10, dann ist: 2 2 2 2 8 2 χ (5) = + + 0 + + = = 1.6 5 5 5 5 5 Dieser Wert ist verhältnismäßig klein. Einfache empirische Tests: Ein Zahlengenerator ZG gibt vor, im Intervall [0, 1) gleichverteilte und unabhängige Zahlen zu liefern. Sei z0, z1, z2, z3, ... zn, die von ZG gelieferte Zahlenfolge. Einfache Test erlauben die Widerlegung der Gleichverteilung und Unabhängigkeit. 1) Test auf Gleichverteilung: Man wähle eine hinreichend große Zahl n und eine ganze Zahl d. Man bilde die Folge gi = zi ∗ d (0 ≤ i ≤ n), und zähle, wie oft jede der Zahlen 0, 1, 2, ..., d-1 vorkommt. Anschließend führe man 2 einen χ -Test mit d–1 Freiheitsgraden und der einheitlichen Kategorien-Wahrscheinlichkeit 1/d durch. 2) Paartest: Wie im Test auf Gleichverteilung wähle man eine hinreichend große Zahl n und eine positive Ganzzahl d. Man bilde wiederum die Folge gi = zi ∗ d (0 ≤ i ≤ n), nun zählt man das Auftreten der nicht überlappenden Paare (z2*i, z2*i+1), die Plausibilität der erhaltenen Kategorienwerte überprüft man in 2 2 einem χ -Test mit d –1 Freiheitsgraden und der 2 Basis-Wahrscheinlichkeit 1/d . In diesem Fall sollte 2 n größer als 5 ∗ d sein. Dieser Test ist verallgemeinerbar auf Tripel, Quadrupel, Quintupel, u.s.w. 3) Geburstagtest ("Birthday Spacings" Test): Dieser Test stammt von George Marsaglia, er untersucht die Abstände in der geordneten Folge der Zufallszahlen, seine Bedeutung liegt darin, daß die meisten Tausworthe-Generatoren ihn nicht bestehen. Zum Ablauf: Ein Generator produziere die nichtnegativen Ganzzahlen Ik (k = 1, ..., m) im Zahlbereich [1, n]; man führe folgende Schritte aus: (a) Sortiere die Folge Ik (k = 1, ..., m) aufsteigend. (b) Bilde die Folge der Differenzen D1 = I1 - Im + m, D2 = I2-I1, D3 = I3-I2, ..., Dm = Im - Im-1 (c) Setze Y = m – Zahl der verschiedenen Differenzen; Y nähert sich asymptotisch einer Poisson3 Verteilung mit Parameter λ= m /(4∗n), daher wähle man n und m so, daß m³ ≈ 4∗n. (d) Auf den Kategorien Y = 0, Y = 1, Y = 2; Y > 2 2 führt man einen χ -Test aus, die Kategorienwahrscheinlichkeiten entnimmt man der zugehörigen Poisson-Verteilung. Die Zahl der Probanden sollte mehrere hundert sein. Bemerkung: Die Zahl dieser Tests läßt sich beliebig verlängern, jede Eigenschaft, für die man die Wahrscheinlichkeitsverteilung kennt, eignet sich als Testgrundlage. Zu fragen ist aber, ob ein weiterer Test neue Erkenntnisse bringt oder nur alte bestätigt. Einfache Tests für Zufallsbitfolgen: Sei b = b0, b1, b2, ..., bn-1 ein Abschnitt der Länge n einer Zufallsbitfolge. (i) Monobittest: Sei n0 die Zahl der 0-Bit, n1 die Zahl der 1-Bit, dann folgt 2 n 0 − n1 ) ( x1 = n 2 einer χ -Verteilung mit einem Freiheitsgrad. (ii) Zweibittest Sei nxy die Zahl der Bitpaare (x, y) aus {0, 1} ✕ {0, 1}, n0 und n1 seien wie oben definiert, dann folgt x2 = ( ) ( ) 4 2 2 2 2 2 2 2 ∗ n 00 + n 01 + n10 + n11 − ∗ n 0 + n1 + 1 n−1 n 2 einer χ -Verteilung mit zwei Freiheitsgraden, es gilt auch n00 + n01 + n10 + n11 = n-1. (iii) Pokertest: m Sei m eine positive Ganzzahl mit n/m ≥ 5 ∗2 , sei k = n/m, teile die Folge b in nichtüberlappende Teilabschnitte der Länge m; sei ni die Zahl der Teilabschnitte m der Form i (0 ≤ i < 2 ), dann folgt 2m 2 − 1 2 x3 = ∗ ∑ ni − k k i=0 m 2 m einer χ -Verteilung mit 2 - 1 Freiheitsgraden. (iv) Lauftest: Die erwartete Zahl von 1–Läufen oder 0–Läufen der Länge i (1 ≤ i < n) in einer Bitfolge der Länge n ist ei = n−i+3 2i + 2 Die Statistik k x4 = ∑ i =1 (Bi −e i )2 + k (Ci −e i )2 ei 2 ∑ i =1 ei folgt einer χ -Verteilung mit 2k – 2 Freiheitsgraden. Hierbei sind Bi die Zahl der 1-Bit Läufe und Ci die Zahl der 0-Bit Läufe für i = 1, 2, ... , n. Ergänzung zu (iv): Herleitung der Formel für ei = n−i+3 2i + 2 (0 ≤ i < n) Man betrachte eine Bitkette der Länge n, wobei die Erzeugung eines 1–Bit oder eines 0–Bit ein unabhängiges Ereignis der Wahrscheinlichkeit 1/2 sei. Man wähle i mit 0 ≤ i < n. Ein 1-Bit-Lauf der Länge i wird beschrieben durch das Muster: 011 ... 10 i-mal Die Wahrscheinlichkeit des Auftretens dieses Musters an einer gültigen Position innerhalb der betrachteten Bitkette –(i+2) ist 2 . Daraus ergibt sich ei zu –(i+2) ei = 2 * Zahl gültiger Positionen –(i+1) * Zahl der Randpositionen + 2 –(i+2) –(i+1) = 2 * (n – (i + 1)) + 2 * 2 –(i+2) = (n – i + 3) * 2 en = –n 2 q.e.d. Aus FIPS PUB 140-1 (11/01/1994) Bemerkung: FIPS PUB 140-1 steht für Federal Information Processing Standards Publication 140-1. Test für Generatoren von Zufallszahlen, Testobjekt ist jeweils eine Bitkette der Länge 20000. (i) Monobittest: Der Test gilt als bestanden, falls 9645 < Zahl der 1-Bit < 10346 (ii) Pokertest: Unterteile die Bitkette in 5000 nichtüberlappende 4-Bit Abschnitte. Bestimme die Häufigkeit f (i) (0 ≤ i ≤ 15) für jedes 4-Bit-Musters; berechne χ2 gemäß: 15 16 2 2 ∗ ∑ ( f ( i ) ) − 5000 χ = 5000 i = 0 Der Test gilt als bestanden, falls 1.03 < χ2 < 57.4 (iii) Lauftest: Sei Bi die Zahl der 1-Bit Läufe der Länge i (0<i<6), sei B6 die Zahl der 1-Bit Läufe der Länge > 5, sei Ci die Zahl der 0-Bit Läufe der Länge i (0<i<6), sei C6 die Zahl der 0-Bit Läufe der Länge > 5. Der Test gilt als bestanden, falls sämtliche B- und CWerte innerhalb folgender Grenzen liegen. Lauflänge 1 2 3 4 5 6 untere Grenze obere Grenze 2267 2733 1079 1421 502 748 223 402 90 223 90 223 Ferner darf kein Lauf einer Länge größer als 33 existieren. (iv) Wiederholungstest: Produziert ein Zufallszahlengenerator Bitblöcke der Länge n, wobei n > 15 ist, dann dürfen nie zwei aufeinanderfolgende Bitblöcke gleich sein; ist die Produktionslänge l ≤ 15, dann sind für diesen Test jeweils n aufeinanderfolgend produzierte Bits zu einem Block der Länge n, wobei n > 15 zu wählen ist, zusammenzufassen. Vernams Verschlüsselungsalgorithmus: Sei N eine Bitkette, die eine Nachricht repräsentiert, sei Z eine zufällige Bitkette, sei ⊗ die exklusive OderOperation für Bitketten, dann Verschlüsselte Nachricht VS = N ⊗ Z, Entschlüsselte Nachricht N = VS ⊗ Z. Bemerkung: Die Güte der Verschlüsselung wird bestimmt von der Güte der Bitkette Z, ist Z "wahrhaft zufällig", dann ist dies Verschlüsselungsverfahren sicher. Beispiel: Nachricht = "Zeit" Nachricht als Bitkette: 01011010011001010110100101110100 Zufällige Bitkette: 11011000101100011110000101110001 Verschlüsselte Nachricht: 10000010110101001000100000000101 Entschlüsselte Nachricht: 01011010011001010110100101110100 Probabilistischer Primzahltest: Satz von Fermat: p prim ==> ∀a (0 < a < p) a p–1 ≡ 1 (mod p) 66 Beispiele: 2 ≡ 1 mod 67 340 ≡ 1 mod 341, 341 ist nicht prim 2 340 3 ≡ 56 mod 341 Bemerkung: Man nennt eine Zahl n eine Carmichaelsche Zahl, falls für alle a, die teilerfremd zu n sind, gilt: n-1 a ≡ 1 (mod n). Satz: Sei p prim und sei 0 < x < p, dann gilt x = 1 und x = p–1 sind die einzigen Lösungen von 2 x ≡ 1 (mod p) Beweis: ==> ==> 2 x ≡ 1 (mod p) (x–1) * (x+1) ≡ 0 (mod p) p | x–1 oder p | x+1. Millers Test: Sei n ungerade, n > 1, wähle b ( 0 < b < n), k sei k := n–1, r := b mod n Falls r ≠ 1 ==> n nicht prim Wiederhole k := k / 2 k r := b mod n bis (k ungerade) oder (r ≠ 1 und r ≠ n–1) r ≠ (1 oder n–1) ==> n nicht prim Beispiele: n = 25, b = 7 24 7 12 7 6 7 3 7 ≡ ≡ ≡ ≡ 1 1 1 18 (mod 25) (mod 25) (mod 25) (mod 25) n = 341, b = 2 340 2 ≡ 1 (mod 341) 170 ≡ 1 (mod 341) 2 85 2 ≡ 1 (mod 341) Bemerkung: Die Wahrscheinlichkeit, daß die Nichtprimheit einer ungeraden Zahl n durch einen Millertest nicht entdeckt wird, ist kleiner als 1/4. Buffons Nadelexperiment zur Bestimmung von π: Gegeben sei eine Schar paralleler Linien im Abstand a. Man werfe mehrmals eine Nadel der Länge l (l ≤ a) auf diese Schar und zähle, wie oft die Nadel eine Linie schneidet. Bild 1: a x ϕ Zur Beschreibung der Lage einer Nadel verwende man die Koordinaten des Nadelmittelpunkts und den Winkel ϕ zwischen Nadel und den parallelen Linien. Die Nadel schneidet eine Linie, falls für den kleinsten Abstand x des Nadelmittelpunktes zu einer Linie gilt: x ≤ (l / 2) * sin (ϕ). Bild 2: f (x) = (l / 2) * sin (ϕ) a/2 0 π Die Wahrscheinlichkeit P, daß eine geworfene Nadel eine Linie schneidet, läßt sich als Quotient zweier Flächen berechnen, der Fläche F unterhalb von f und der Rechteckfläche R. Es gilt: π F = ∫ 0 l ∗ sin( ϕ) dϕ = l 2 R = π∗a/2 Damit P = l ∗ 2 / (a ∗ π) oder π = 2 ∗ l / (a ∗ P) Im Jahre 1901 berichtete Lazzarini, daß er π mittels Nadelwurfs zu 3.1415929 bestimmt habe. Er gab an, daß er 3408 Experimente durchführte, wovon 1808 erfolgreich waren. Bei einem Verhältnis l / a = 5 / 6 erhielt er: π ≈ 2 ∗ 5 ∗ 3408 2 ∗ 5 ∗16 ∗ 213 315 = = = 3.1415929 6 ∗1808 2 ∗ 3 ∗ 16 ∗ 113 113 Ein Experiment mit dem Generator von Park und Miller ergibt: Versuche Versuche Versuche Versuche Versuche = = = = = 1000, 5000, 10000, 15000, 20000, Treffer Treffer Treffer Treffer Treffer = = = = = 312, 1585, 3212, 4851, 6416, π π π π π = = = = = 3.22061 3.14169 3.14416 3.1348 3.14639