AuK/Motivation SS12
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Scheme</language>
== Motivation ==
=== Multiplikation großer Zahlen ===
Es gibt eine ''bessere'' Methode zur Multiplikation zweier natürlicher Zahlen als die, die in der Schule gelehrt wird.
Was bedeutet "besser"?
<language>Scheme</language>
<language>Scheme</language>
=== Primitive Basisoperationen ===
Wir gehen davon aus, dass die folgenden beiden Basisoperationen vorhanden sind und jeweils einen ''konstanten Zeitaufwand'' zur Ausführung erfordern.
# Addition dreier Ziffern (sog. Volladdierer) <br/> Resultat: zwei Ziffern, nämlich die Ergebnisziffer ... und der Übertrag ...
# Multiplikation zweier Ziffern <br/> Resultat: zwei Ziffern, nämlich ...
Für die beiden Operationen wird im Folg. die Scheme-Prozedur <tt>prim-op</tt> definiert.
In deren Definition wird die Basis <math>B</math> der Zahlendarstellung durch den Wert der Variablen <tt>basis</tt> angegeben. Für den Fall, dass ein anderes Stellenwertsystem zugrunde liegt, ist diese Angabe anzupassen.
<code id="4f2e6547da2f9">
(define prim-op
(let ((anzahl 0) (basis 10))
(lambda (op x y . c)
(cond
((eqv? op 'add)
(let ((res (+ x y (car c))))
(if (< res basis)
(cons res 0)
(cons (- res basis) 1))))
((eqv? op 'mult)
(let ((res (* x y)))
(cons (remainder res basis)(quotient res basis))))
((eqv? op 'anzahl) anzahl)))))
</code>
Die primitive Addition zweier Ziffern und eines Übertrags liefert ein Paar, dessen erstes Element die Stelle und das zweite den neuen Übertrag darstellt. Beispielsweise soll für <math>7+8+0=15</math>
das Paar <tt>(5 . 1)</tt> zurück gegeben werden.
<run id="4f2e6547da47c">(prim-op 'add 7 8 0)</run>
<run id="4f2e6547da4d3">(prim-op 'add 2 5 1)</run>
<run id="4f2e6547da53d">(prim-op 'add 9 8 1)</run>
Ein weiteres Aufrufbeispiel gilt der Multiplikation <math>9\times 8=72</math>:
<run id="4f2ec22340228">(prim-op 'mult 9 8)</run>
Um die Aufwandsanalyse durch diese Definitionen nicht zu verfälschen, wird nicht die Ausführungszeit von <tt>prim-op</tt>-Aufrufen gestoppt, sondern die ''Gesamtanzahl'' der Aufrufe primitiver Basisperationen ermittelt.
<run id="4f2ec223402c3">(prim-op 'anzahl 'dummy 'dummy)</run>
Es spielt keine Rolle, welche Argumente an zweiter und dritter Stelle verwendet werden.