Praktische Informatik I – Der Imperative Kern Mathematiknachhilfe
Prof. Dr. Stefan Edelkamp
Institut für Künstliche Intelligenz
Technologie-Zentrum für Informatik und Informationstechnik (TZI) Am Fallturm 1, 28359 Bremen
+49-(0)421-218-64007 www.tzi.de/~edelkamp
Outline
1 Unter- und Oberstufenmathematik
2 Quadratwurzel
3 Erweitern und Kürzen
4 Pascals Dreieck
5 Primfaktorzerlegung
6 Gauß-Elimination
In dieser Unterrichtseinheit soll der Nutzen der Rekursion für die Bewältigung von praktisch relevanten Aufgabenstellungen mit informatischen Mitteln deutlich werden.
Ausgehend von der Sekundarstufen-Mathematik wird das schnelle Auswählen und Sortieren von Zahlen in Sequenzen besprochen.
Sie lernen
das Heron-Verfahren zur Quadratwurzelberechnung, den Euklidische Algorithmus zur Bestimmung des größten gemeinsamen Teiler,
das Pascal-Dreieck für die allgemeine Binomische Formel, ein Verfahren zur eindeutigen Primfaktorzerlegung, sowie das Gauß’sche Eliminationsverfahren zur Lösung von linearen Gleichungssystemen
Outline
1 Unter- und Oberstufenmathematik
2 Quadratwurzel
3 Erweitern und Kürzen
4 Pascals Dreieck
5 Primfaktorzerlegung
6 Gauß-Elimination
Heron-Verfahren
Programm 1 berechnet die (abgerundete)Quadratwurzel
Wir nehmen ein Rechteck, bei dem die eine Kante Längeahat, für das man√
asucht. Die zweite Kantenlänge ist 1. Das Verfahren nähert sich iterativ einem Quadrat mit derselben Fläche an.
Das Verfahren fußt auf demBanach’schen Fixpunktsatz
Programm 1:Iterative Wurzelberechnung.
public classQuiz {
public intmethod(inti) {
inta=i;
intb= 1;
while(a−b> 1) { a= (a+b) / 2;
b=i/a;
}
return(a+b) / 2;
} }
Outline
1 Unter- und Oberstufenmathematik
2 Quadratwurzel
3 Erweitern und Kürzen
4 Pascals Dreieck
5 Primfaktorzerlegung
6 Gauß-Elimination
Der Euklidische Algorithmus
Die rekursive Berechnung desgrößten gemeinsamen Teilers(engl.
greatest common divisor) funktioniert wie folgt:
Wenna mod b=0 gilt, dann istgcd(a,b) =b, sonst ist ggT(a,b) =gcd(b,a mod b).
InvarianzZweite Zahl ist kleiner als die erste Zahl
modRest bei der ganzzahligen Division, wobei der Rest der Division mit Resta mod bin Java durcha%bdargestellt wird.
DerEuklid’sche Algorithmusist ein Paradebeispiel für ein effizientes rekursives Verfahren: In jedem zweiten Schritt wird eine Eingabezahl mindestens halbiert.
Daskleinste gemeinsame Vielfache (kgV)(engl. least common multiplier) vonaundbergibt sich dann aus dem Produktabder beiden Zahlen, geteilt durch ihren größten gemeinsamen Teiler.
Bruchrechnen
Das Programm 2 berechnet die Summe von zwei Brüchen inklusive demErweiternder Brüche auf den Hauptnenner, sowie dem
automatischenKürzendes Resultats.
Programm 2:Bruchrechnen mit Kürzen.
public classFractional {
public intgcd(inta,intb) { returna== 0 ?b:gcd(b%a,a);
}
public intlcm(inta,intb) { returna∗b/gcd(a,b);
}
public voidcompute(inta,intb,intc,intd) {
System.out.println("(a/b)−>("+(a/gcd(a,b))+"/"+(b/gcd(a,b))+")");
System.out.println("(c/d)−>("+(c/gcd(c,d))+"/"+(d/gcd(c,d))+")");
intk=lcm(b,d);
ints=a∗k/b+c∗k/d;
System.out.println("sum = ("+(s/gcd(s,k))+"/"+(k/gcd(s,k))+")");
} }
Outline
1 Unter- und Oberstufenmathematik
2 Quadratwurzel
3 Erweitern und Kürzen
4 Pascals Dreieck
5 Primfaktorzerlegung
6 Gauß-Elimination
Binomische Formel
DerBinomialkoeffizient kn
= k!(n−k!)n! ist wichtig u.a. für die Darstellung von(a+b)n=Pn
k=0 n k
akbn−k.
ImLottoist ein Sechser bekanntlicherweise mit einer Wahrscheinlichkeit von 1/ 496
zu finden.
Es ist nicht schwer, eine rekursive Beschreibung der Funktion
c(n,k) = n
k
= n!
(n−k)!·k! = n(n−1)!
k(n−k)!(k −1)! = n
kc(n−1,k−1)
mitc(n,0) =1 herzuleiten.
Mit dem Programm 3 wird einPascal-Dreieckausgegeben; es gibt in Zeilendie Werte nk
für allek =0, . . . ,ndar.
Programm 3:Die rekursive Berechnung des Pascal’schen Dreiecks.
public classBinomial {
private intchoose(intn,intk) {
return(k== 0) ? 1 : (n∗choose(n−1,k−1)) /k;
}
public voidtriangle(intm) { intn,k;
for(n=0;n<m;n++) { for(k=0;k<=n;k++) {
System.out.print("("+m+","+k+")="+choose(n,k));
}
System.out.println();
} } }
Outline
1 Unter- und Oberstufenmathematik
2 Quadratwurzel
3 Erweitern und Kürzen
4 Pascals Dreieck
5 Primfaktorzerlegung
6 Gauß-Elimination
Eindeutige Zerlegung in Primteiler
Die Zerlegung einer Zahl in ihrePrimfaktorennicht nur für die Berechnung des ggTs und des kgVs wichtig: Sie ist (bei Sortierung) eineeindeutigeDarstellung.
Programm 4 ist eine rekursive Beschreibung, die nach und nach alle Primfaktoren einer Zahl abspaltet.
Programm 4: Die rekursive Berechnung der Primfaktorzerlegung.
public classPrimeFactor {
public voidfactor(intn) {// prime factorization of n inti=2;// start with first prime factor
while((i<n) && (n%i!= 0))i++;// find next factor System.out.println(i);// print found factor if(i<n)factor(n/i);// call with reduced term }
}
Outline
1 Unter- und Oberstufenmathematik
2 Quadratwurzel
3 Erweitern und Kürzen
4 Pascals Dreieck
5 Primfaktorzerlegung
6 Gauß-Elimination
Lösung von Gleichungssystemen
DasGauß’sche Eliminationsverfahrenzur Lösung vonlinearen
GleichungssystemenAx =bbei gegebener eindeutiger Lösbarkeit ist nützlich . . .
. . . wenn auch numerisch nicht unbedingt stabil: Hier bietet sich die exakte Berechnung der Lösung über die Menge derBruchzahlenan.
Das Programm 5-6 geht grob wie folgt vor: Es bringt die Gleichungen in Standardform und stellt die Koeffizientenmatrix auf.
Startpunkt isti =1.
Das Verfahren
1 Falls in deri-ten Zeile die Zahl in deri-ten Spalte 0 ist, wird diese Zeile mit einer Zeile unterhalb ausgetauscht, bei der in deri-ten Spalte eine Zahl steht. Falls keine solche Zeile existiert, ist das Gleichungssystem nicht eindeutig oder auch gar nicht lösbar.
Danach wird diei-te Zeile durch die Zahl, in ihreri-ten Spalte geteilt. Das Diagonalelement wird dadurch 1.
2 Nun wird zu allen anderen Zeilenjmitj6=iein geeignetes Vielfaches der Zeileisubtrahuiert, so daß die Zahl in deri-ten Spalte derj-ten Zeile 0 wird. Danach darf in deri-ten Spalte nur noch in deri-ten Zeile eine 1 stehen, sonst stehen nur noch Nullen in dieser Spalte.
3 Fallsi <n, wirdi um eins erhöht und gehe zurück zu Schritt 1.
Die Lösung steht in der letzten Spalte.
Programm 5:Ein Löser für lineare Gleichungssysteme.
public classGauss {
static final intDIM= 4;
doubleM[][] = {
{1.0, 2.0,−1.0,−2.0}, {1.0, 3.0,−1.0,−2.0},{2.0, 1.0, 1.0, 1.0}, {3.0, 1.0, 2.0, 1.0}};
doubleV[] = {−6.0,−4.0, 11.0, 15.0};
doubleS[] =new double[DIM];
/∗∗
∗Constructor for objects of class Gauss
∗/
publicGauss() { if(solve(M,V)) {
for(intk=DIM−1;k>=0;k−−) { S[k] =V[k];
for(inti=(k+1);i<DIM;i++)S[k]−= (M[k][i]∗S[i]);
S[k] =S[k] /M[k][k];
}
System.out.println("Solution:");
for(inti=0;i<DIM;i++) System.out.print(" "+S[i]);
System.out.println();
}
Programm 6:Ein Löser für lineare Gleichungssysteme.
public booleansolve(doubleM[][],doubleV[]) { for(intk=0;k<DIM−1;k++) {
doublemax=M[k][k] > 0 ?M[k][k] :−M[k][k];
intm=k;
for(inti=k+1;i<DIM;i++) {
doubleabs=M[i][k] > 0 ?M[i][k] :−M[i][k];
if(max<abs) {max=M[i][k];m=i; } }
if(m!=k) {
for(inti=k;i<DIM;i++) {doublet=M[k][i];M[k][i] =M[m][i];M[m][i] =t; } doublet=V[k];V[k] =V[m];V[m] =t;
}
if(M[k][k] == 0)return false;
for(intj=(k+1);j<DIM;j++) { doublef=−M[j][k] /M[k][k];
for(inti=k;i<DIM;i++)M[j][i] =M[j][i] +f∗M[k][i];
V[j] =V[j] +f∗V[k];
} }
return true;
} }