Informatik 1 - Mitschriften von Klaas Ole Kürtz
Informatik 1 - Mitschriften von Klaas Ole Kürtz
Informatik 1 - Mitschriften von Klaas Ole Kürtz
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
(define (kleinster-teiler n)<br />
(define (finde-teiler test)<br />
(cond ((> (quadrat test) n) n)<br />
((teilt? test n) test)<br />
(else (finde-teiler (+ test 1)))))<br />
(finde-teiler 2))<br />
(define (teilt? a b) (= (remainder b a) 0))<br />
(define (primzahl n) (= (kleinster-teiler n) n))<br />
• Ergebnis aus Zahlentheorie: kleiner Fermatscher Satz: Wenn n Primzahl<br />
ist, dann 0 < a < n ⇒ a n mod n = a. Falls n also keine Primzahl<br />
ist, dann gibt es gibt es mit großer Wahrscheinlichkeit viele Zahlen<br />
0 < a < n mit a n mod n ≠ a. Teste also a n mod n = a für zufällige<br />
Zahlen a, je mehr positive Tests, um so wahrscheinlicher ist n eine<br />
Primzahl. Schnelle Funktion für Potenz mit Modulo:<br />
(define (potmod b e n)<br />
(cond ((= e 0) 1)<br />
((gerade? e) (remainder (quadrat (potmod b (/ e 2) n)) n))<br />
(else (remainder (* b (potmod b (- e 1) n)) n))))<br />
Zum testen: Wähle Zufallszahl a mit 2 ≦ a ≦ n−1, teste a n mod n = a.<br />
(define (fermat-test n)<br />
(define a (+ 2 (random (- n 2))))<br />
(= (potmod a n n) a))<br />
Dieser Test soll x-mal ausgeführt werden:<br />
(define (fast-prime? n x)<br />
(cond ((= x 0) \#t)<br />
((fermat-test? n) (fast-prime? n (- x 1)))<br />
(else \#f)))<br />
Besonderheit: Probalistische Methode: falls Ergebnis true ist die Zahl sicher<br />
keine Primzahl, andernfalls ist sie wahrscheinlich eine Primzahl - je mehr<br />
Tests, umso höher die Wahrscheinlichkeit.<br />
Argument für probalistische Algorithmen: Auch völlig korrekte Algorithmen<br />
können eventuell falsch sein, es gibt eben ohnehin nur mit einer gewissen<br />
Wahrscheinlichkeit eine richtige Lösung.<br />
16