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 id="4dede3393b41b">

(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 id="4dede3393b517">

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


(define (quicksort 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">3.1
<math>2^{146}\not \equiv 1\  mod \ 147</math>


<math>2^{285}\not \equiv 1\  mod \ 286</math>

        
<math>2^{312}\equiv 1\ mod   \ 313</math>


<math>2^{350}\not \equiv 1\ mod \ 351</math>

3.2


<math>3^{146} \not \equiv 1\  mod \ 147 </math>   


<math>3^{285}\equiv 1\  mod \ 286 </math>

        
<math>3^{312}\equiv 1\ mod   \ 313</math>

           
<math>3^{350}\not \equiv 1\ mod \ 351</math>


</popup>
 

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