¢¡¤£¦¥¤§© ¤

Werbung
http://www.mpi-sb.mpg.de/~hannah/info5-ws00
IS
UN
R
S
WS 2000/2001
E R SIT
S
Bast, Schömer
SA
IV
A
Grundlagen zu
Datenstrukturen und Algorithmen
A VIE N
Lösungsvorschläge für das 1. Übungsblatt
Letzte Änderung am 23. November 2000
Aufgabe 2 (a) + (b)
integer operator*(integer& a, digit d)
{
int n = a.digits();
integer p = 0;
// Produkt ohne die Überträge
integer c = 0;
// Überträge
int pi = 0;
for (int i = 0; i < n; i++)
{
pi = a[i] * d;
p[i] = pi % B;
c[i+1] = pi / B;
}
return school_add(p,c);
}
Beispiel:
3798 * 6
-------8248
1454
-------22788
<- p
<- c
<- p+c
Aufgabe 3
Pn−1
Pm−1
Sei B ≥ 2, a = i=0
ai B i und b = j=0
b B j . Die k-te Zeile bei Durchführung des SchulmultiP j i
P
k
plikationsalgorithmus
ist
dann
gerade
(
a
B
)b
B
=
B i+k . DurchPAufsummieren erhält
i
k
i
i a i bk
Pm−1 Pn−1
P
P
P
m−1
n−1
n−1
m−1
i+k
man also k=0
= k=0
(bk B k i=0
ai B i ) = ( i=0
ai B i )( j=0
bj B j ) = ab, was
i=0 ai bk B
zu zeigen war.
Aufgabe 4
110100101 : 1001 = 101110
1001
----
10000
1001
---1111
1001
---1100
1001
---111
Der Rest bei der Division ist also (111)2 = (7)10 .
Aufgabe 5
Wir betrachten die Binärdarstellung, d.h. B = 2.
integer school_mod(integer& a, integer& b)
{
/* Sonderfaelle */
if(b==0) {return ERROR;}
// irgend eine Fehlermeldung
if(b>a) {return a;}
if(b==a) {return 0;}
integer
integer
int
int
temp = 0;
result = 0;
lb = b.digits();
lamlb = a.digits() - lb;
/* Die obersten lb-1 Ziffern von a werden in temp gespeichert */
for(int k=0; k<(lb-1); k++) {temp[k] = a[lamlb+1+k];}
/* Division */
for(int i=lamlb; i>=0; i--)
{
/* betrachte naechste Stelle */
result << 1;
temp << 1;
temp[0] = a[i];
if(temp>=b) // man kann b von temp abziehen
{
temp = temp - b;
result[0] = 1;
}
else {result[0]=0;} // man kann b nicht von temp abziehen
}
return temp;
// in temp steht der Rest der Division,
// in result steht das Ergebnis der Division, das
}
// koennte man hier auch weglassen.
Für die Analyse relevant ist die Zeile
temp = temp - b;
Das ist eine Subtraktion von zwei (maximal (lb + 1)-stelligen) Zahlen. Diese kann analog zu
school add durchgeführt werden und benötigt dann (lb + 1) primitive Operationen (d.h. Subtraktionen von einstelligen Zahlen).
Die Schleife hat (lamlb + 1) Durchläufe, d.h. es gibt insgesamt maximal
(lamlb + 1)(lb + 1)
primitive Operationen. Es ist jetzt
lb = k
lamlb = (n + k) − k = n
Also hat man
(n + 1)(k + 1) = O(nk)
primitive Operationen.
Herunterladen