AuK/Probabilistische Algorithmen SS11/

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
==Übungen==

1. Implementieren Sie einen Generator für Pseudozufallszahlen nach der Kongruenzmethode.




<popup name="Lösung"> <code>

(define c 262144)

(define zufallszahlen
  (lambda (z)
    (let ((a 16807)(b 0))
      (if (eq? z 0) 
          4567
          (modulo (+ (* a (zufallszahlen (- z 1))) b) c)))))</code>

</popup>


2. Erstellen Sie ein probabilistisches Quicksort, welches das Pivotelement zufällig wählt.




<popup name="Lösung">

<code>

(define select-random
  (lambda (ls)
    (let ((len (length ls)))         
      (list-ref ls (random len)))))  


(define quicksort
  (lambda (L)
    (if (null? L) L
    (letrec ((pivot (select-random L))
    (split
    (lambda (piv li return)    
    (cond ((null? li) return)
    ((< (car li) piv)
    (split piv (cdr li) (cons (cons (car li) (car return))
    (cdr return))))
    (else
    (split piv (cdr li) (cons (car return)
    (cons (car li)
    (cdr return)))))))
    ))
    `(,@(quicksort (car (split pivot (cdr L) '(() . ())))) ,pivot
    ,@(quicksort (cdr (split pivot (cdr L) '(() . ())))))
    )
    )
</code>

</popup>



3. Arbeiten Sie mit dem Primzahltest nach Fermat .


3.1. Teste die Zahlen <math>147, 286 , 313</math> ,und <math>353</math>  mit der <math>Basis \ 2</math>


3.2. Teste die Zahlen desweiteren mit <math>Basis \ 3</math>


* <popup name="Lösung"></popup>
 

[http://www.arndt-bruenner.de/mathe/java/rechnergz.htm Rechner für große Zahlen]