Kapitel 2 Ein Grundbaukasten für die Mathematik In diesem Abschnitt sammeln wir einige Grundbausteine, die in der Mathematik oft Verwendung finden. Dieser Teil kann als Nachschlagewerk angesehen werden, in dem bei Bedarf nach Definitionen und Eigenschaften mathematis− cher Grundobjekte gesucht werden kann. Wir werden allerdings dieses Grun− drüstzeug nicht im vorhinein auf Lager legen, sondern nur bei Bedarf hier nachschlagen. 2.1 Quantoren, Mengen, Tupel Quantoren, Mengen und Tupel sind die grundlegendsten Bestandteile der mathematischen Sprache. Wir verweisen auf die Grundvorlesungen úLineare Algebraø und úAnalysisø für eine Einführung dieser Objekte und werden hier nicht weiter ins Detail gehen. 2.2 Funktionen Schon in der ersten Übersicht über Fragestellungen, die in der algorithmischen Mathematik von Interesse sein könnten (siehe Kapitel úBegriffsbildungø), war oft von Funktionen die Rede. Was sind nun Funktionen? 54 Kapitel 2: Ein Grundbaukasten für die Mathematik 2.2.1 Funktionen von einer Variablen Eine Zuordnung f , die jedem Objekt eines Grundbereichs A genau ein Objekt eines Zielbereichs B zuordnet, nenne ich eine (einstellige) Funktion von A nach B. Wir führen dafür die Schreibweise f A ® B ein. Das durch die Funktion f dem Objekt x zugeordnete Objekt wird úFunktionswert von xø genannt und mit f @xD bezeichnet. Eine Funktion kann eine úBlackboxø sein, die für jeden Input x einen Output f @xD liefert, ohne dass úvon aussenø ersichtlich ist, wie der Funk− tionswert f @xD ermittelt wird. Oft ist es aber so, dass mittels eines Terms tx die Zuordnungsvorschrift bekannt ist, die jedem x den Funktionswert f @xD zuordnet. In diesem Fall schreibt man dafür gerne die Funktion in Termdarstellung f A® B x # tx oder in Fällen, wo der Grund| und Zielbereich nicht von Interesse sind, f x # tx Oft schreiben wir dafür auch f @xD := tx Einen konkreten Funktionswert f @aD kann ich aus der Termdarstellung ermitteln, indem ich im Term tx jedes freie Auftreten von x durch a ersetze, wir schreiben dafür tx®a . Oft will ich auch einfach von einer Funktion sprechen, die jedem x das durch den Term tx beschriebene Objekt zuordnet, ohne dass die Funktion selbst einen Namen zu tragen braucht. Ich kann dafür x # tx schreiben. Eine andere gebräuchliche Schreibweise ist die sogenannte Λ|Notation, in der ich eine derartige Funktion mit Λ tx (oder oft auch Λ x.tx ) bezeichne. Oft wird aber x schlampigerweise von Dingen wie der úFunktion x2 ø oder ähnlichen Dingen gesprochen. Dies ist so lange nicht weiter schlimm, wenn eindeutig klar ist, welches Symbol die Funktionsvariable bezeichnet, und wenn im Hinterkopf immer klar ist, dass mit der úFunktion x2 ø die Funktion x # x2 oder Λ x2 gemeint x ist. Wenn ich aber Terme wie z.B. k x + d vor mir habe, dann ist das keineswegs mehr klar, wenn man einmal davon absieht, dass meistens x die Variable ist. Es sollte aber klar sein, dass ein Computerprogramm solche Annahmen keinesfalls treffen kann, und man sich daher in der algorithmischen Umsetzung von Lösung− sideen, bei denen Funktionen involviert sind, einer klaren Ausdrucksweise bedienen muss. Viele Operationen auf Funktionen werden derart erweitert, dass anstelle der gesamten Funktion nur mehr der Funktionsterm bearbeitet wird. Meist bedeutet dies, dass Funktionsanwendung f @aD durch tx®a ersetzt werden muss. Es soll uns dann aber nicht mehr überraschen, wenn diese Operationen zusätzlich die Kapitel 2: Ein Grundbaukasten für die Mathematik 55 uns dann aber nicht mehr überraschen, wenn diese Operationen zusätzlich die Funktionsvariable als einen weiteren Parameter verlangen, da ansonsten die Ersetzung nicht richtig durchgeführt werden kann. Funktionen f N ® D werden auch D|Folgen genannt. Mit der Abkürzung Nk := 8n Î N È n ³ 1 ß n £ k< kann ich Funktionen f Nk ® D dann endliche D|Folgen der Länge k nennen. Im Zusammenhang mit Folgen werden die Funktionswerte f @nD auch gerne als fn angeschrieben und Folgenelemente genannt. Eine endliche Folge f der Länge k kann in der Form eines Tupels X f1 , f2 , ¼, fk \ angegeben werden. Das gesamte Verhalten einer Funktion (losgelöst von der konkreten Zuord− nungsvorschrift) spiegelt sich im Grafen der Funktion wider: Für f A ® B definiere ich Gr1 @ f , AD := 8Xx, f @xD\ È x Î A< In einem streng Mengenlehre|orientierten Aufbau der Mathematik wird jede Funktion mit ihrem Grafen identifiziert! Dieser Zugang wird auch extensional genannt. Extensional betrachtet ist also eine Funktion nichts anderes als eine Menge von Paaren Xx, f @xD\, völlig unabhängig davon, wie der Funktionswert f @xD tatsächlich berechnet wird. Für eine algorithmische Mathematik ist der extensionale Funktionsbegriff aus folgendem Grund nicht so gut geeignet: Seien zum Beispiel A1 und A2 zwei verschiedene Algorithmen zum Berechnen ein und derselben úFunktionø, d.h. für alle x Î A gilt: A1 @xD = A2 @xD. Es gilt dann natürlich Gr1 @A1 , AD = Gr1 @A2 , AD, wodurch in der extensionalen Betrachtungs− weise auch A1 = A2 wäre. Ich will Funktionen, die durch verschiedene Algorith− men realisiert werden, aber nicht miteinander identifizieren! Der Graf einer Funktion eignet sich aber gut zur grafischen Veranschauli− chung einer Funktion. Die Menge von Paaren Xx, f @xD\ kann ich als Wertetabelle (vor allem dann, wenn der Grundbereich nur aus endlich vielen (wenigen) Objekten besteht) oder als Menge von Punkten in einem 2|dimensionalen kartesischen Koordinatensystem darstellen, siehe auch grafische Darstellung in Mathematica im nächsten Kapitel. 2.2.1 Funktionen von einer Variablen in Mathematica bzw. Theorema Funktionsdefinitionen haben in Mathematica die Gestalt f@x_D := x2 - 3 x + 1 f@4D 5 56 Kapitel 2: Ein Grundbaukasten für die Mathematik f@3 4D 11 - 16 f@aD 1 - 3 a + a2 In Theorema verwende ich eine únormaleø Definition: Definition@"f", any@xD, f@xD := x2 - 3 x + 1D Use@Definition@"f"DD Compute@f@4DD H42 - 3 * 4L + 1 UseAlso@Built|in@"Numbers"DD Compute@f@4DD 5 Compute@f@3 4DD -11 16 Compute@f@aDD H1 + a2 L - 3 * a Den Funktionsgrafen einer reellen Funktion (d.h. Grund| und Zielbereich sind Teilmengen von R) visualisiere ich in Mathematica durch den Befehl Plot, siehe auch úAnhang A: Mathematicaø. Plot@f@xD, 8x, -2, 3<D; 5 4 3 2 1 -2 -1 1 -1 Clear@fD 2 3 Kapitel 2: Ein Grundbaukasten für die Mathematik 57 Wenn ich den Grundbereich, also die Menge der zulässigen Eingabewerte, einschränken will, so definiere ich beispielsweise n2 - 3 n + 1 g@n_IntegerD := 2 n2 + 3 g@4D 1 7 g@-4D 29 35 g@3 4D 3 gA E 4 ListPlot@Table@8n, g@nD<, 8n, -30, 30<D, AxesOrigin ® 8-30, 0<, PlotStyle ® [email protected]<D; 1 0.8 0.6 0.4 0.2 -20 -10 0 -0.2 oder n2 - 3 n + 1 h@n_Integer ; n ³ 0D := 2 n2 + 3 h@4D 1 7 h@-4D h@-4D h@3 4D 3 hA E 4 10 20 30 58 Kapitel 2: Ein Grundbaukasten für die Mathematik ListPlot@Table@h@nD, 8n, 0, 30<D, PlotStyle ® [email protected]<D; 0.4 0.3 0.2 0.1 5 10 15 20 25 30 -0.1 -0.2 Clear@g, hD Anmerkung: Den Graf von Funktionen, die nicht die reellen Zahlen als Grund− bereich haben, darf ich nicht als durchgehende Linie darstellen! Daher soll ich Plot nur für reelle Funktionen verwenden. In Theorema: DefinitionA"h", any@nD, with@is|integer@nD ß n ³ 0D, n2 - 3 n + 1 h@nD := E 2 n2 + 3 UseAlso@XDefinition@"h"D, Built|in@"Connectives"D\D Compute@h@4DD 1 7 Compute@h@-4DD h@-4D Compute@h@3 4DD 3 hA E 4 Kapitel 2: Ein Grundbaukasten für die Mathematik 59 2.2.2 Funktionen von mehreren Variablen Oft werden wir aber auch mit Zuordnungen zu tun haben, die jeder Kombination von Objekten der Grundbereiche A1 , ¼, An genau ein Objekt des Zielbereiches B zuordnen. Eine solche Zuordnung nenne ich eine mehrstellige Funktion von A1 , ¼, An nach B. Mittels einer Zuordnungsvorschrift definiere ich derartige Funktionen üblicherweise in der Form f @x1 , ¼, xn D := tx1 ,¼,xn (1) Einen konkreten Funktionswert f @a1 , ¼, an D kann ich berechnen, indem ich im Term tx1 ,¼,xn jedes freie Vorkommen einer Variablen xi durch den entsprech− enden Wert ai ersetze, ich schreibe dafür tx1 ,¼,xn ®a1 ,¼,an . Ich nenne eine Funktion, die von n Eingabeparametern abhängt, auch gerne eine n|stellige Funktion. Den Graf einer n|stelligen Funktion von A1 , ¼, An nach B definiere ich analog zu einstelligen Funktionen als Menge von Tupel der Länge n + 1 Grn @ f , A1 , ¼, An D := :Xx1 , ¼, xn , f @x1 , ¼, xn D\ Ë " i=1,¼,n xi Î Ai > Ich kann eine mehrstellige Funktion aber immer als eine einstellige Funktion betrachten, die jedem Tupel von Objekten aus den Grundbereichen ein Objekt aus dem Zielbereich zuordnet! In dieser Betrachtungsweise sehe ich eine mehrstellige Funktion f von A1 , ¼, An nach B als eine (einstellige) Funktion f C i=1,¼,n Ai ® B Dabei nenne ich C i=1,¼,n Ai := :a È a ist Tupel ß a¤ = n í " i=1,¼,n ai Î Ai > das kartesische Produkt der Mengen A1 , ¼, An . Hier spielt C wieder die Rolle eines Quantors. Der zu C assoziierte Operator ist , anstelle von A A schreibe ich auch A2 und analog für das kartesische Produkt von drei oder mehreren Mengen. C A schreibe ich demnach als An . i=1,¼,n Auch bei mehrstelligen Funktionen ist in vielen Fällen die Abbildung durch eine Zuordnungsvorschrift festgelegt, ich schreibe analog zum Fall einstelliger Funktionen f C i=1,¼,n Ai ®B Xx1 , ¼, xn \ # tx1 ,¼,xn 60 Kapitel 2: Ein Grundbaukasten für die Mathematik oder einfach f Xx1 , ¼, xn \ # tx1 ,¼,xn Konsequenterweise sollten wir derartige Funktionen dann in der Form f @Xx1 , ¼, xn \D := tx1 ,¼,xn (2) definieren, jedoch ist es in der Praxis meist üblich, die Tupelklammern úXø und ú\ø auf der linken Seite der Definition wegzulassen und die Funktion in der Form (1) anzugeben! Ist x ein Tupel der Länge n und f eine Funktion, so steht f @xD für f @Xx1 , ¼, xn \D (Standardfunktionsanwendung!), ähnlich dazu schreibe ich f @xD für f @x1 , ¼, xn D (Funktionsanwendung auf Argument|Tupel). Definition@"Function on argument tuple", any@f, xD, \D := f@x DD f @Xx Wenn ich mich auf einstellige Funktionen einschränke und mehrstellige Funk− tionen als einstellige Funktionen auf Tupel betrachte, dann kann ich auf die |Notation verzichten. Wenn ich konkrete Beispiele rechne, muss ich dann aber die Funktionen in der Form (2) definieren. Wenn ich mir die Freiheit lasse, Funktionen in Rechenbeispielen als mehrstellige Funktionen in der Form (1) zu definieren, so muss ich auf die |Notation in Definitionen zurückgreifen! 2.2.2 Funktionen von mehreren Variablen in Mathematica bzw. Theorema Funktionen in mehreren Variablen definiere ich in Mathematica als f@x_, y_D := Sin@xD Cos@yD Exp@yD; f@3, 2D ã2 Cos@2D Sin@3D [email protected], 2.0D -0.433934 f@X3 + t, 2\D f@X3 + t, 2\D f @X3 + t, 2\D ã2 Cos@2D Sin@3 + tD f @83 + t, 2<D ã2 Cos@2D Sin@3 + tD In Theorema: (Im Unterschied zur Definition in Mathematica oben verwende ich hier einmal die Möglichkeit, den Anwendungsbereich von Rechenoperationen unter den Operatoren explizit anzugeben (Funktor|Notation), siehe genauere Kapitel 2: Ein Grundbaukasten für die Mathematik 61 unter den Operatoren explizit anzugeben (Funktor|Notation), siehe genauere Ausführungen dazu im Kapitel úPolynomeø später! Wir definieren hier eine Funktion f , die zur Berechnung der Funktionswerte die Multiplikation für Maschinenzahlen mit 4 Stellen Genauigkeit aus dem Kapitel úZahlendarstellun− genú verwendet). DefinitionA"f", any@x, yD, f@x, yD := JSin@xD * Cos@yDN * Exp@yDE M@4D M@4D Use@Definition@"f"DD Compute@f@3, 2DD JSin@3D * Cos@2DN * ã2 M@4D M@4D UseAlso@XDefinition@"Machine Numbers"D, Definition@"Function on argument tuple"D, Built|in@"All Semantics"D\D Compute@f@3, 2DD -0.4338000000000000000 ComputeAfAZ3 + t, 2^EE M@4D f@Xt + 3.000000000000000000, 2\D ComputeA f AZ3 + t, 2^EE M@4D -3.075000000000000000 * Sin@t + 3.000000000000000000D Zur Veranschaulichung von mehrstelligen Funktionen verwende ich wieder den Grafen der Funktion. Die Menge von Tupel der Form Xx1 , ¼, xn , f @x1 , ¼, xn D\ (oder XXx1 , ¼, xn \, f @x1 , ¼, xn D\ wenn ich die Objekte aus dem Grundbereich zu Tupeln zusammenfasse, siehe oben) kann ich wieder als Wertetabelle (im Fall, wo alle Grundbereiche nur aus endlich vielen (wenigen) Objekten bestehen) oder als Menge von Punkten in einem Hn + 1L|dimensionalen kartesischen Koordinatensystem darstellen. Wir betra− chten den Fall n = 2 und R (oder Teilmengen davon) als Grundbereiche: es geht also um eine 2|stellige Funktion f von R und R nach R. Die Schreibweise f R2 ® R erweist sich dafür als sehr kompakte Ausdrucksform, egal, ob wir nun die Objekte aus den Grundbereichen zu einem Tupel zusammenfassen oder nicht. Wir verwenden ein 3|dimensionales Koordinatensystem zur grafis− chen Veranschaulichung (für n > 2 muss ich mir mit Projektionen behelfen). Der Funktionsgraf von f ist eine Fläche im 3|dimensionalen Raum, die wir in Mathe− matica mit dem Befehl Plot3D erzeugen können, siehe auch úAnhang A: Mathematicaø. 62 Kapitel 2: Ein Grundbaukasten für die Mathematik Plot3D@f@x, yD, 8x, 0, 2 Π<, 8y, 0, 2.5<, Boxed ® False, PlotPoints ® 40, MeshStyle ® [email protected]; 5 2.5 0 -2.5 -5 0 2.5 2 1.5 1 2 0.5 4 6 0 Eine oft hilfreiche Alternative dazu ist ContourPlot, wodurch ich eine Darstel− lung mit Höhenschichtlinien bekomme: ContourPlot@f@x, yD, 8x, 0, 2 Π<, 8y, 0, 2.5<, PlotPoints ® 40D; 2.5 2 1.5 1 0.5 0 0 1 2 3 4 5 6 Kapitel 2: Ein Grundbaukasten für die Mathematik 63 Die Zusammenfassung der Objekte aus dem Grundbereich zu einem Tupel hat speziell im Fall von Teilmengen des Rn als Grundbereich den Vorteil, dass ich durch die Interpretation von Tupel als Vektoren auf sehr elegente Weise eine geometrische Bedeutung für Operationen auf den Funktionsargumenten zur Verfügung habe. Umgekehrt kann ich das gesamte Arsenal der Vektorrech− nung für Operationen auf den Funktionsargumenten einsetzen! Ein Tupel (Vektor) der Länge 2 entspricht einem Punkt in der Ebene, ein Tupel (Vektor) der Länge 3 entspricht einem Punkt im Raum, ein Tupel (Vektor) der Länge n entspricht einem úPunktø im n|dimensionalen Raum. Auch Addition von Tupel (Vektoren) und Multiplikation von Tupel (Vektor) mit einem Skalar haben eine anschauliche geometrische Deutung. Seien beispielsweise a, v Î R2 , so entspricht a + t v für jedes t Î Reinem Punkt auf der Geraden durch den Punkt a in Richtung v (im Grundbereich). f @a + t vD entspricht demnach úder Funktion f entlang der Geraden a + t v aufgeschnittenø, genauer gesagt: die Funktion Λ f @a + t vD entspricht dem Schnitt der Funktion f im Punkt a entlang der Rich− t tung v! 64 Kapitel 2: Ein Grundbaukasten für die Mathematik CutGraph@f, 83, 1<, 83, 2<, 8x, 0, 2 Π<, 8y, 0, 2.5<, 8t, -0.5, 1<, 8s, -3, 9<, PlotRange ® 8-2, 9<D; 7.5 5 2.5 0 3 2 0 1 2 4 6 0 8 6 4 2 -0.4 -0.2 0.2 0.4 0.6 0.8 1 Kapitel 2: Ein Grundbaukasten für die Mathematik 65 CutGraph@f, 82, 1.75<, 81, 0<, 8x, 0, 2 Π<, 8y, 1.5, 2<, 8t, -2, 4.3<, 8s, -3, 6<D; 2 2 0 -2 1.8 0 2 1.6 4 6 1 0.5 -2 -1 1 -0.5 -1 2 3 4 66 Kapitel 2: Ein Grundbaukasten für die Mathematik CutGraph@f, 85, 0<, 80, 1<, 8x, 0, 2 Π<, 8y, -1, 2<, 8t, -1, 2<, 8s, -2, 4<D; 4 2 2 0 -2 1 0 0 2 4 6 -1 1 0.5 -1 -0.5 0.5 -0.5 -1 -1.5 2.2.2 Organisatorisches 1 1.5 2 Kapitel 2: Ein Grundbaukasten für die Mathematik 67 2.3 Polynome und Polynomfunktionen Objekte wie x + 2 oder x3 + 2 x + 4 sind gemeinhin als Polynome bekannt. Sehr häufig tauchen Polynome in Zusammenhang mit Funktionen auf, wenn etwa von der (Polynom|) Funktion x # x3 + 2 x + 4 gesprochen wird. Wir wollen nun den Begriff des Polynoms etwas genauer beleuchten, da Polynome und Polynomfunktionen eine zentrale Rolle in vielen Bereichen der Mathematik~insbesondere der algorithmischen Mathematik~spielen. Viele Lösungsmethoden beruhen nämlich letztendlich darauf, dass allgemeine Funktionen auf Polynomfunktionen zurückgeführt werden, und dass viele Problemstellungen für Polynomfunktionen (relativ!) einfache Lösungen besitzen. Insbesondere numerische Verfahren begründen sich oft darin, dass allgemeine Funktionen durch úpassendeø Polynomfunktionen angenähert werden, und die exakten Lösungen des úangenäherten Polynomproblemsø als Näherungslösungen des Originalproblems interpretierten werden können. 2.3.1 Polynome Der intuitive Polynombegriff, in dem ein Polynom als ein úAusdruck der Gestaltø a xn + b xn-1 + ¼ betrachtet wird, beginnt schwieriger zu werden, wenn ich Polynome in einem Computer repräsentieren will. In welcher Form soll ich einen solchen Ausdruck abspeichern? Was ist eigentlich die genaue Bedeutung von a xn + b xn-1 + ¼ ? Wie kann ich die gewünschten Rechenoperationen auf diesen Ausdrücken ausführen? Klar, es hängt vom Programmiersystem ab, wie ich solche Ausdrücke abspeichern kann. Verwende ich z.B. Mathematica als Programmierwerkzeug, dann habe ich Datenstrukturen für mathematische Terme zur Verfügung, fein. Verwende ich aber C oder eine ähnlich grundleg− ende Programmiersprache, dann habe ich dort keine derartigen Datenstruk− turen zur Verfügung. Ausserdem muss ich mir vor Augen halten, dass ich vielleicht einmal ein System wie Mathematica implementieren werde. Dazu werde ich aber eine Sprache wie C (oder was immer dann zur Verfügung steht) wählen, und dann muss ich mich darum kümmern, wie ich die Ausdrücke repräsentiere, die ich dem Benutzer zur Verfügung stellen will. Definition 21 (Polynom) Ein Polynom über K ist eine K|Folge, deren Elemente ab einem bestimmten Index allesamt gleich 0 sind. Die einzelnen Elemente der Folge heissen Koeffi− zienten des Polynoms. ã Ein Polynom wird also durch die (unendliche) Folge seiner Koeffizienten repräsentiert. Falls alle Koeffizienten gleich 0 sind, so ist der Grad des Polyn− oms ebenfalls 0. Falls in nicht alle Koeffizienten 0 sind, so gibt es einen 68 Kapitel 2: Ein Grundbaukasten für die Mathematik oms ebenfalls 0. Falls in p nicht alle Koeffizienten 0 sind, so gibt es einen maximalen Index d p eines Koeffizienten verschieden von 0, also pd p ¹ 0 und " p j = 0. In diesem Fall ist d p - 1 der Grad des Polynoms p. Wir repräsen− j>d p tieren die unendliche Koeffizientenfolge von p durch die endliche Folge der Koeffizienten bis einschliesslich zum Index d p , also p = Xp1 , p2 , ¼, pd p \. In dieser Form ist die Darstellung sogar eindeutig, ich nenne das eine kanonische Form. Das vertraute x3 + 2 x + 4 repräsentiere ich daher als unendliche Folge X4, 2, 0, 1, 0, 0, ¼\. Die kanonische Darstellung bis zum höchsten von 0 ver− schiedenen Koeffizienten ist X4, 2, 0, 1\, der Grad dieses Polynoms ist 3. Umgekehrt kann ich X4, 2, 0, 1\ sowohl als x3 + 2 x + 4 als auch als y3 + 2 y + 4 schreiben. In der Theorema|Sprache kann ich diese Definitionen in einer Form ange− ben, sodass ich damit sofort Berechnungen durchführen kann: DefinitionA"Basic Polynomial Operations", any@p, nD, is|polynomial@pD : is|tuple@pD Ü " Hp j = 0L l0 o o j=1,¼, p¤ o o deg@pD := m o y i o o " Hp j = 0Lzz - 1 Ü otherwise æ jjHpi ¹ 0L í o i=1,¼, p¤ j=i+1,¼, p¤ { k n l p Ü n ³ 0 ß n £ deg@pD o n+1 coef@p, nD := m o0 Ü otherwise n canonic@pD := [pi È i=1,¼,deg@pD+1 _ "is|poly" "deg" "coef" "unique" E Das Sprachkonstrukt æ i=1,¼,n Pi steht dabei für úein solches i zwischen 1 und n, für das die Bedingung Pi erfüllt istø. Wir machen uns mit diesen Begriffen einmal vertraut: Use@XBuilt|in@"Tuples"D, Built|in@"Quantifiers"D, Built|in@"Numbers"D, Built|in@"Connectives"D, Definition@"Basic Polynomial Operations"D\D Compute@is|polynomial@X4, 2, 0, 1\DD True Compute@is|polynomial@X0, 1, 0, 0\DD True Compute@deg@X4, 2, 0, 1\DD 3 Compute@deg@X0, 1, 0, 0\DD 1 Kapitel 2: Ein Grundbaukasten für die Mathematik 69 Compute@deg@X0, 0, 0, 0\DD 0 Compute@coef@X4, 2, 0, 1\, -1DD 0 Compute@coef@X4, 2, 0, 1\, 0DD 4 Compute@coef@X4, 2, 0, 1\, 1DD 2 Compute@coef@X4, 2, 0, 1\, 2DD 0 Compute@coef@X4, 2, 0, 1\, 3DD 1 Compute@coef@X4, 2, 0, 1\, 4DD 0 Compute@canonic@X4, 2, 0, 1\DD X4, 2, 0, 1\ Compute@canonic@X4, 2, 0, 1, 0, 0, 0\DD X4, 2, 0, 1\ Compute@canonic@X0, 1, 0, 0\DD X0, 1\ Compute@canonic@X0, 0, 0, 0\DD X0\ Auf den endlichen Folgen, die Polynome repräsentieren, kann ich nun arithme− tische Operationen wie Addition, Subtraktion und Multiplikation definieren. Hier stoße ich auf einen sehr subtilen Punkt in der Computer|Mathematik, genauer gesagt auf einen sehr subtilen Punkt der Mathematik selbst, der aber in der Computer|Mathematik spezielle Aufmerksamkeit verdient! Für die Addition, Subtraktion und Multiplikation von Polynomen möchte ich natürlich gerne die gewohnten Operationszeichen ú+ø, ú−ø und ú*ø verwenden. In den Definitionen werden aber in natürlicher Weise die entsprechenden Operationen auf den Koeffizienten auftreten, die ebenfalls mit ú+ø, ú−ø und ú*ø bezeichnet werden. Wir betrachten einmal die Polynom|Addition: Polynome werden addiert, indem an jeder Position die Koeffizienten addiert werden. Das würde zu einer úDefinitionø der Art 70 Kapitel 2: Ein Grundbaukasten für die Mathematik p + q := [coef@p, iD + coef@q, iD ­ ­ Polynomaddition Koeffizientenaddition È _ i=0,¼,deg@pD+deg@qD führen. Für das úhändischeø Rechnen mit Polynomen ist das OK, weil ich davon ausgehe, dass ein Mathematiker úerkenntø, dass mit dem ú+ø in X4, 2, 0, 1\ + X0, 1\ die Polynomaddition úgemeintø ist, das ú+ø in X4 + 0, 2 + 1, 0 + 0, 1 + 1\ allerdings für die Addition der Koeffizienten (in diesem Fall die Addition auf natürlichen Zahlen) steht. Diese Situation tritt übrigens nicht nur bei Polynomen auf, sondern in allen Situationen in der Mathematik, wo neue Objekte aus schon bestehenden Objekten konstruiert werden und auf den neuen Objekten Rechenoperationen definiert werden. Wie wir ~ im Speziellen in der Algebra ~ sehen werden, ist dies sehr oft der Fall. Beispiele dafür werden sein: Vektoren, Matrizen, rationale Zahlen, rationale Funktionen, Kreuz− produkte, Faktorstrukturen (Äquivalenzklassen), etc. Einem Computer kann ich aber eine solche úDefinitionø nicht zumuten. Es bedarf einiger Überlegungen, wie ein Computer|System zwischen den ver− schiedenen Interpretationen von ú+ø unterscheiden könnte. Nicht einmal einem sorgfältigen Mathematiker kann ich eine solche úDefinitionø unterjubeln, denn auch Definitionen unterliegen Regeln! Es handelt sich im obigen Fall um eine explizite Funktionsdefinition, und eine der Regeln für explizite Funktionsdefini− tionen besagt, dass das Funktionssymbol auf der linken Seite der Definition ein neues Symbol sein muss, das bisher noch nicht als Funktionssymbol vorko− mmt. (Mehr über die Regeln des Definierens erfahren wir übrigens in der Vorlesung úLogik als Arbeitsspracheø, die ich nur empfehlen kann.) Der springende Punkt ist, dass es sich bei der Polynomaddition und der Koeffizientenaddition um zwei völlig verschiedene Operationen handelt, das ú+ø auf der linken Seite kann (und muss) ich somit als neues Funktionssymbol sehen! Es ist rein eine Sache der úelegantenø optischen Erscheinung, dass ich das ú+ø doppelt verwenden will. Ich kann also obiges Problem umgehen, indem ich echt neue Funktionssymbole einführe: DefinitionA"Polynomial Arithmetic", any@p, qD, p Å q := [coef@p, iD + coef@q, iD i=0,¼,deg@pD+deg@qD È _ p q := [coef@p, iD - coef@q, iD i=0,¼,deg@pD+deg@qD È _ p Ä q := [ â coef@p, jD * coef@q, i - jD j=0,¼,i ÄÄÄ ÄÄÄ ÄÄÄ ÄÄÄ Ä E _ i=0,¼,deg@pD+deg@qD Kapitel 2: Ein Grundbaukasten für die Mathematik Das in dieser Definition auftauchende Sprachkonstrukt 71 Ú nenne ich den j=0,¼,i Summationsquantor. Der Summationsquantor ist in vielen Aspekten mit den logischen Quantoren ú"ø und ú$ø verwandt. UseAlso@Definition@"Polynomial Arithmetic"DD Compute@X4, 2, 0, 1\ Å X0, 1\D X4, 3, 0, 1, 0\ Compute@X4, 2, 0, 1\ X0, 1\D X4, 1, 0, 1, 0\ Compute@X4, 2, 0, 1\ Ä X0, 1\D X0, 4, 2, 0, 1\ Compute@X4, 2, 0, 1\ Ä X0, 1, 2, 8\D X0, 4, 10, 36, 17, 2, 8\ Zum Nachrechnen: die letzte Rechnung entspricht der Polynommultiplikation H4 + 2 x + x3 L * Hx + 2 x2 + 8 x3 L = 4 x + 10 x2 + 36 x3 + 17 x4 + 2 x5 + 8 x6 Das funktioniert ja soweit ganz gut. Wenn ich mir aber die Definitionen genau anschaue, ist mir Eines nicht ganz klar: welche Addition ist eigentlich mit dem ú+ø auf der rechten Seite der Funktionsdefinition gemeint? Es stellen sich einige Fragen: è Ist das immer die Addition von natürlichen Zahlen? è Können auch rationale Zahlen als Koeffizienten auftreten? è Wie unterscheiden sich Polynome mit natürlichen Zahlen als Koeffizienten von Polynomen mit rationalen Koeffizienten? è Welche Koeffizientenbereiche können bei Polynomen auftreten? Viele Autoren von Mathematik|Büchern gehen an die Sache so heran: Anstelle von neuen Operationssymbolen wie úÅø, úø und úÄø verwenden sie die schon in Verwendung befindlichen Symbole ú+ø, ú−ø und ú*ø und schreiben den Anwendungsbereich der Operation als Index oder unter dem Symbol. Die Addition auf den natürlichen Zahlen wird dann mit ú+N ø oder ú+ø bezeichnet, N die Addition von rationalen Zahlen mit ú+ø, die Addition von Polynomen mit ú+ø Q P etc. Die Operationssymbole sind somit automatisch unterscheidbar. Vom Standpunkt einer Implementierung in einem Computerprogramm ist das auch völlig klar, weil ja das Programm zum Addieren von natürlichen Zahlen ein ganz anderes ist als jenes, das rationale Zahlen addiert. Für Menschen wird dann die Erleichterung angeboten, dass die zusätzliche Benennung des Anwendungs− bereiches weggelassen werden kann, wenn es úaus dem Zusammenhang klar 72 Kapitel 2: Ein Grundbaukasten für die Mathematik bereiches weggelassen werden kann, wenn es úaus dem Zusammenhang klar istø, welcher Bereich gemeint ist. Unter dieser Vereinbarung schreibe ich dann die Definitionen eines Polynombereiches über den natürlichen Zahlen wie folgt: DefinitionA"Natural Number Polynomial Arithmetic", any@p, q, nD, l o 0 Ü " Jp j = 0N o o N j=1,¼, p¤ o o deg@pD := m o o i y o o æ jjJpi ¹ 0N í " Jp j = 0Nzz - 1 Ü otherwise o i=1,¼, p¤ N N { j=i+1,¼, p¤ k n l o pn+1 Ü n ³ 0 ß n £ deg@pD coef@p, nD := m 0 Ü otherwise o nN p + q := [coef@p, iD + coef@q, iD P N pq := [coef@p, iD coef@q, iD P N Ë _ É _ i=0,¼,deg@pD+deg@qD i=0,¼,deg@pD+deg@qD p * q := [ â coef@p, jD * coef@q, i - jD P N N j=0,¼,i ÄÄÄ ÄÄÄ ÄÄÄ ÄÄÄ ÄÄ E _ i=0,¼,deg@pD+deg@qD (Ich möchte mich an dieser Stelle bewusst nicht um die eindeutige Repräsen− tierung kümmern, daher fehlt die Funktion úcanonicø. Ausserdem sei extra erwähnt, dass auf Effizienz in dieser Implementierung kein Wert gelegt wurde.) Use@XBuilt|in@"Tuples"D, Built|in@"Quantifiers"D, Built|in@"Numbers"D@+, -D, Built|in@"Number Domains"D, Built|in@"Connectives"D, Definition@"Natural Number Polynomial Arithmetic"D\D ComputeAX4, 2, 0, 1\ + X0, 1\E P X4, 3, 0, 1, 0\ ComputeAX4, 2, 0, 1\ X0, 1\E P X4, 1, 0, 1, 0\ In der Wissensbasis ist die Multiplikation für natürliche Zahlen nicht enthalten. Ich probiere einmal, wie die Multiplikation von Polynomen, die ja die Multiplika− tion im Koeffizientenbereich benötigt, darauf reagiert. ComputeAX4, 2, 0, 1\ * X0, 1\E P Z4 * 0, 2 * 0 + 4 * 1, 0 * 0 + 2 * 1 + 4 * 0, N N N N N N 0 * 1 + 1 * 0 + 2 * 0 + 4 * 0, 2 * 0 * 0 + 1 * 1 + 2 * 0 + 4 * 0^ N N N N N N N N Kapitel 2: Ein Grundbaukasten für die Mathematik 73 ComputeAX4, 2, 0, 1\ * X0, 1, 2, 8\E P Z4 * 0, 2 * 0 + 4 * 1, 0 * 0 + 2 * 1 + 4 * 2, 0 * 1 + 1 * 0 + 2 * 2 + 4 * 8, N N N N N N N N N N 0 * 0 + 0 * 2 + 1 * 1 + 2 * 8 + 4 * 0, 0 * 0 + 0 * 1 + 0 * 8 + 1 * 2 + 2 * 0 + 4 * 0, N N N N N N N N N N N 2 * 0 * 0 + 0 * 1 + 0 * 2 + 1 * 8 + 2 * 0 + 4 * 0^ N N N N N N Mit allen Operationen in der Wissensbasis funktioniert alles wieder wie gewohnt! UseAlso@Built|in@"Numbers"DD ComputeAX4, 2, 0, 1\ * X0, 1\E P X0, 4, 2, 0, 1\ ComputeAX4, 2, 0, 1\ * X0, 1, 2, 8\E P X0, 4, 10, 36, 17, 2, 8\ Die Definitionen der Polynomoperationen sind aber nicht willkürlich gewählt. Man könnte beweisen, dass die Operationen eine Menge von angenehmen Eigenschaften erfüllen, wie etwa Kommutativität, Assoziativität, Distributivität, etc. Insgesamt könnte man zeigen, dass die Polynome über einem Koeffizienten− bereich K einen Ring bilden, sofern K ein Ring ist. Noch ein paar praktische Vereinbarungen: Das Polynom x wird also durch X0, 1\ repräsentiert, x2 ist demnach wegen x2 = x * x durch ComputeAX0, 1\ * X0, 1\E P X0, 0, 1\ repräsentiert. Eine Konstante a ist als Polynom geschrieben Xa\. Ich überzeuge mich einmal davon, dass sich Konstante wirklich so verhalten wie ich mir das vorstelle. ComputeAX4\ * JX0, 1\ * X0, 1\NE X0, 0, 4\ P P ComputeAJX4\ * JX0, 1\ * X0, 1\NN + X3\E X3, 0, 4\ P P P Passt. Das Polynom x3 + 2 x + 4 steht für x * x * x + 2 * x + 4, wobei ich die auftre− tenden Konstanten 2 und 4 als konstante Polynome betrachte, somit ComputeAJJX0, 1\ * JX0, 1\ * X0, 1\NN + X2\ * X0, 1\N + X4\E X4, 2, 0, 1\ P P P P P 74 Kapitel 2: Ein Grundbaukasten für die Mathematik Mit diesen Vereinbarungen, also Konstante a als konstante Polynome der Form Xa\ und x als X0, 1\ darzustellen, verhalten sich also die oben abstrakt defini− erten Polynomoperationen genau so, wie wir es von unseren úintuitiv vertrauten Polynomenø her kennen. Die Operationen sind also nicht nur so, dass sie úin irgendeiner Weiseø schöne Eigenschaften erfüllen, nämlich die, einen Ring zu bilden, sie modellieren genau unsere úintuitiv vertrauten Polynomeø. Ich habe also nun ein exaktes Modell für Polynome, das ich auch auf jedem Computer implementieren kann! Die gebräuchliche Bezeichnung für den Polynombereich mit einer úVariablenø x (wobei x das spezielle Polynom X0, 1\ ist) über dem Koeffizientenbereich K ist K@xD, man nennt diese Polynome auch gerne univariat. Ich überlege mir nun noch eine Operation, die ich mit Polynomen gerne ausführen möchte. Ich will anstelle der úVariablen xø einen konkreten Wert in ein Polynom einsetzten, ich nenne die Operation Polynomevaluation. DefinitionA"Polynomial Evaluation", any@p, aD, eval@p, aD := P (Anstelle von Ú â N i=0,¼,deg@pD i=0,¼,n coef@p, iD * ai E N n kann ich normalerweise auch Ú schreiben. Im Zusammen− i=0 hang mit dem Index beim Summenzeichenzeichen muss ich es aber so schreiben, weil ansonsten Mathematica beim Abspeichern des Ausdrucks die Struktur falsch abspeichert ¼ traurig aber wahr!) UseAlso@Definition@"Polynomial Evaluation"DD ComputeAeval@X4, 2, 0, 1\, 3DE P 37 Wenn ich nun Polynome über den rationalen Zahlen definieren will, so verändert sich an der vorherigen Definition nicht viel, das N auf der rechten Seite einer jeden Definition wird durch Q ersetzt: Kapitel 2: Ein Grundbaukasten für die Mathematik 75 DefinitionA"Rational Number Polynomial Arithmetic", any@p, q, nD, l o jijp j = 0zyz o 0 Ü " o o Q{ j=1,¼, p¤ k o deg@pD := m o o ii ij yy y o o " jp j = 0zzzz - 1 Ü otherwise o æ jjjjpi ¹ 0zz í Q{{ Q{ j=i+1,¼, p¤ k n i=1,¼, p¤ kk p Ü n ³ 0 ß n £ deg@pD l o o n+1 coef@p, nD := o m0 Ü otherwise oQ n p + q := [coef@p, iD + coef@q, iD Ë _ É _ p * q := [ â coef@p, jD * coef@q, i - jD ÄÄÄ ÄÄÄ ÄÄÄ ÄÄÄ ÄÄÄ P Q pq := [coef@p, iD coef@q, iD P Q P i=0,¼,deg@pD+deg@qD Q Q j=0,¼,i E i=0,¼,deg@pD+deg@qD _ i=0,¼,deg@pD+deg@qD eval@p, aD := P â Q i=0,¼,deg@pD i coef@p, iD * a Q Use@XBuilt|in@"Tuples"D, Built|in@"Quantifiers"D, Built|in@"Numbers"D, Built|in@"Number Domains"D, Built|in@"Connectives"D, Definition@"Rational Number Polynomial Arithmetic"D\D 4 2 1 1 ComputeA[ , , 0, _ + [0, _E 3 5 3 P 2 4 9 1 [ , , 0, , 0_ 3 10 3 4 2 1 1 ComputeA[ , , 0, _ [0, _E 3 5 3 P 2 4 -1 1 [ , , 0, , 0_ 3 10 3 4 2 1 1 ComputeA[ , , 0, _ * [0, _E 3 5 3 P 2 2 1 1 [0, , , 0, _ 3 5 6 4 ComputeA[ , 3 2 71 [0, , , 45 325 2 1 1 2 8 , 0, _ * [0, , , _E P 5 3 30 13 7 2164 59 2 8 , , , _ 1365 126 39 21 Es gefällt mir nicht sonderlich gut, dass ich jeden Polynombereich extra definieren muss, wo sich doch im Grunde nichts Gravierendes an den Defini− tionen ändert. Als ein in klaren Strukturen denkender Mathematiker sehe ich hier doch ein Muster: Der Bereich der Polynome ist vom jeweils gewählten Koeffizientenbereich abhängig, in den Definitionen kann ich den Koeffizienten− bereich als Parameter betrachten. Ich nenne den Bereich der Polynome daher 76 Kapitel 2: Ein Grundbaukasten für die Mathematik bereich als Parameter betrachten. Ich nenne den Bereich der Polynome daher einen parametrisierten Bereich. Ich habe also anstelle des fixen Polynombere− ichs P einen vom Koeffizientenbereich K abhängigen Bereich P@KD. Mit dem Koeffizientenbereich als Parameter kann ich dann ein für allemal einen parame− trisierten Polynombereich definieren! Wenn ich Polynome über N brauche, setze ich N für den Parameter ein, wenn ich Polynome über Q brauche, dann setze ich Q ein, ich kann in weiterer Folge jeden Bereich, der die erforderlichen Operationen zur Verfügung stellt, als Koeffizientenbereich verwenden. Opera− tionen, die im Koeffizientenbereich ausgeführt werden können müssen, sind in diesem Beispiel: 0, +, −, *. Wenn ich den Polynombereich noch mit weiteren Funktionen erweitern will (z.B. Polynomdivision etc.), brauche ich vielleicht noch zusätzliche Operationen aus dem Koeffizientenbereich. Das mache ich jetzt aber nicht. Solche Definitionen kann ich sehr elegant mit Hilfe eines Funktors bes− chreiben! In einem Funktor kann ich festlegen, auf welche Weise ein neuer Bereich von mathematischen Objekten entsteht. Diese Bereiche können auch, wie wir es im Fall der Polynome benötigen, parametrisiert sein. Von dieser Möglichkeit mache ich Gebrauch, wenn ich beschreiben will, wie ein neuer Bereich aus einem schon bestehenden Bereich gebildet wird. Kapitel 2: Ein Grundbaukasten für die Mathematik 77 DefinitionA"Polynomial Domain", any@KD, P@KD := FunctorAP, any@p, q, n, aD, s = X\ yy i i Î@pD jjJp = Z0^N ë jjis|tuple@pD í p¤ > 0 í " Î @pi D í p p¤ ¹ 0zzzz K K {{ P i=1,¼, p¤ K k k 0 := Z0^ P K 1 := Z1^ P K x := Z0, 1^ K K P l o 1 Ü " Jp j = 0N o o K j=1,¼, p¤ o o index@pD := m o o i y P o o æ jjJpi ¹ 0N í " Jp j = 0Nzz Ü otherwise o i=1,¼, p¤ K K { j=i+1,¼, p¤ k n deg@pD := p¤ - 1 P l o @pD o o pn+1 Ü n ³ 0 í n £ deg P coef @p, nD := m o o P o Ü otherwise o0 nK canonic@pD := [pi P È _ i=1,¼,index@pD P const@aD := Xa\ P p + q := canonicA[coef @p, iD + coef @q, iD P P K P Ë P _E i=0,¼,MaximumBdeg@pD,deg@qDF P pq := canonicA[coef @p, iD coef @q, iD P K P P Ë P _E i=0,¼,MaximumBdeg@pD,deg@qDF P p * q := canonicA[ â coef @p, jD * coef @q, i - jD P P K j=0,¼,i K P P a P× p := canonicA[a * coef @p, iD K P P K Ë _E i=0,¼,deg@pD P ÄÄÄ ÄÄÄ ÄÄÄ ÄÄÄ p a := [coef @p, iD a P _ i=0,¼,deg@pD P eval@p, aD := P EE â K i=0,¼,deg@pD P ÄÄÄ ÄÄÄ ÄÄÄ ÄÄÄ ÄÄ P _E i=0,¼,deg@pD+deg@qD P P P coef @p, iD * a K^ i P K P 78 Kapitel 2: Ein Grundbaukasten für die Mathematik Diese Definition muss so gelesen werden: Für jedes beliebige K (úany@KDø) ist der Bereich P@KD jener Bereich P, in dem für beliebige p, q, n, a (úany@p, q, n, aDø) die Operationen wie folgt definiert sind: 0 := Z0^ H0 im Bereich P ist das Tupel bestehend aus dem Element 0 in KL P K analog für die weiteren Operationen. Die Angabe einer Signatur des Funktors (s = ¼) ersparen wir uns in diesem Beispiel, da die Signatur ohnehin im derzeitigen Stadium keinerlei Funktionalität hat. Prinzipiell wäre die Signatur der Platz, wo ich angeben könnte, welche neuen Operationen der Funktor definiert, welchen Typ diese Operationen haben, etc. Use@XBuilt|in@"Tuples"D, Built|in@"Quantifiers"D, Built|in@"Numbers"D, Built|in@"Number Domains"D, Built|in@"Connectives"D, Definition@"Polynomial Domain"D\D In jedem Polynombereich stelle ich mir eine spezielle Konstante mit dem Namen x (åscxå) zur Verfügung, die als Abkürzung für das spezielle Polynom x (siehe oben) über dem jeweiligen Koeffizientenbereich stehen soll. Es wird in manchen Situationen praktisch sein, diese Konstante x anstelle des speziellen Polynoms X0, 1\ verwenden zu können. ComputeA x E P@ND X0, 1\ ComputeA x + X0, 1, 0, 0, 3\E P@ND P@ND X0, 2, 0, 0, 3\ ComputeAX0, 1\ + X0, 1, 0, 0, 3\E P@ND X0, 2, 0, 0, 3\ 4 2 1 1 ComputeA[ , , 0, _ + [0, _E 3 5 3 P@QD 2 4 9 1 [ , , 0, _ 3 10 3 4 2 1 1 ComputeA[ , , 0, _ P@QD - [0, _E 3 5 3 2 4 1 1 [ , - , 0, _ 3 10 3 Kapitel 2: Ein Grundbaukasten für die Mathematik 79 4 2 1 4 1 2 8 ComputeA[ , , 0, _ * [ , , , _E 3 5 3 P@QD 5 30 13 7 16 82 71 2528 59 2 8 [ , , , , , , _ 15 225 325 1365 126 39 21 4 2 1 ComputeA[ , , 0, _ * X0\E 3 5 3 P@QD X0\ 4 1 2 8 ComputeA7 P@QD × [ , , , _E 5 30 13 7 28 7 14 [ , , , 8_ 5 30 13 4 1 2 8 ComputeA0 P@QD × [ , , , _E 5 30 13 7 X0\ 4 1 2 8 ComputeA[ , , , _ 7E 5 30 13 7 P@QD 4 1 2 8 [ , , , _ 35 210 91 49 4 1 2 8 3 ComputeAevalA[ , , , _, EE P@QD 5 30 13 7 5 25531 22750 úFormalø kann ich nun ein Polynom vom Grad n an einer beliebigen Stelle x evaluieren und erhalte n eval@p, xD = â pi+1 xi P i=0 Diese úformale Schreibweiseø eines Polynoms vom Grad n wird gerne verwendet. 4 1 2 8 ComputeAevalA[ , , , _, xEE P@QD 5 30 13 7 4 1 2 8 + * x + * x2 + * x3 5 30 13 7 Folgende Konstruktion erweitert den oben definierten Polynombereich: 80 Kapitel 2: Ein Grundbaukasten für die Mathematik DefinitionA"Extended Polynomial Domain", any@KD, Poly@KD := FunctorAXG, extends@P@KDD\, any@n, a, pD, s = X\ shift|and|scale@n, aD := [0 G K Ë _[a i=1,¼,n lc@pD := coef Ap, deg@pDE G P@KD P@KD lm@pD := shift|and|scaleAdeg@pD, lc@pDE G G G P@KD rp@pD := p P@KD - lm@pD G G EE Diese Definition muss so gelesen werden: Für jedes beliebige K (úany@KDø) ist der Bereich Poly@KD jener Bereich G, der durch Erweiterung von P@KD entsteht, indem für beliebige n, a, p (úany@n, a, pDø) die Operationen wie folgt definiert sind: lc@pD := coef p, deg@pD G P@KD P@KD analog für die weiteren Operationen. Zusätzlich gilt für jede Operation f : f = f G P@KD HG ist eine Erweiterung von P@KDL. UseAlso@Definition@"Extended Polynomial Domain"DD ComputeAshift|and|scale@3, 2DE Poly@QD X0, 0, 0, 2\ ComputeAX2, 4, 0, 1\ * Poly@QD shift|and|scale@3, 2DE Poly@QD X0, 0, 0, 4, 8, 0, 2\ ComputeAX2, 4, 0, 1\ * Poly@QD shift|and|scale@5, 2DE Poly@QD X0, 0, 0, 0, 0, 4, 8, 0, 2\ 4 2 1 ComputeA lm A[ , , 0, _EE Poly@QD 3 5 3 1 [0, 0, 0, _ 3 4 2 1 ComputeA rp A[ , , 0, _EE 3 5 3 Poly@QD 4 2 [ , _ 3 5 Kapitel 2: Ein Grundbaukasten für die Mathematik 81 1 ComputeA rp A[ _EE Poly@QD 3 X0\ Wie passen nun die Polynome y3 + x - 2 x y2 + 3 x2 + 5 x2 y, an die ich mich auch noch erinnern kann, in dieses Bild? Ein Polynom mit 2 úVariablenø kann ich aber auch als ein univariates Polynom mit Polynom|Koeffizienten sehen: y3 + x - 2 x y2 + 3 x2 + 5 x2 y = y3 + H1 - 2 y2 L x + H3 + 5 yL x2 Der Bereich P@P@QDD ist somit der Polynombereich, in dem die Koeffizienten Polynome über Q sind, also die Polynome über Q mit 2 úVariablenø. Polynome mit mehr als einer Variablen nennen sich auch multivariat. ComputeA coef @XX0, 0, 0, 1\, X1, 0, -2\, X3, 5\\, 0DE P@P@QDD X0, 0, 0, 1\ ComputeA coef @XX0, 0, 0, 1\, X1, 0, -2\, X3, 5\\, 2DE P@P@QDD X3, 5\ ComputeA coef @XX0, 0, 0, 1\, X1, 0, -2\, X3, 5\\, 3DE P@P@QDD X0\ Die 2 úVariablenø sind wieder spezielle Polynome, x = XX0\, X1\\ bzw. y = XX0, 1\\, für einen Polynombereich mit 2 úVariablenø x und y über einem Koeffizienten− bereich K liest man gerne K@x, yD. ComputeA deg @XX0\, X1\\DE P@P@QDD 1 ComputeA deg @XX0, 1\\DE P@P@QDD 0 ComputeA coef @XX0\, X1\\, 1DE P@P@QDD X1\ ComputeA coef @XX0, 1\\, 1DE P@P@QDD X0\ ComputeAXX0\, X1\\ XX0, 1\, X1\\ + P@P@QDD XX0, 1\\E 82 Kapitel 2: Ein Grundbaukasten für die Mathematik ComputeAXX0\, X1\\ P@P@QDD - XX0, 1\\E XX0, -1\, X1\\ ComputeAXX0\, X1\\ * P@P@QDD XX0, 1\\E XX0\, X0, 1\\ ComputeAXX0, 0, 0, 1\, X1, 0, -2\, X3, 5\\ * P@P@QDD 3 1 [X1\, [0, , 1_, [1, 1, __E 2 5 3 [X0, 0, 0, 1\, [1, 0, -2, 0, , 1_, 2 13 1 11 87 2 28 [3, , 1, -2, -1, _, [1, , , 3, - _, [3, 8, , 1__ 2 5 2 10 5 5 Die letzte Multiplikation entspricht der Polynommultiplikation 3 1 Hy3 + H1 - 2 y2 L x + H3 + 5 yL x2 L * J1 + J y + y2 N x + J1 + y + y2 N x2 N 2 5 Polynome vom Grad 0 nenne ich konstante Polynome, Polynome vom Grad 1 nenne ich lineare Polynome, Polynome vom Grad 2 nenne ich quadratische Polynome und Polynome vom Grad 3 nenne ich kubische Polynome. 2.3.2 Polynomfunktionen Eng mit dem Polynombegriff verwandt ist der Begriff der Polynomfunktion. Definition 22 (Polynomfunktion) Sei p ein Polynom über K. Eine Funktion der Gestalt Λ eval@p, xD x P@KD heißt die zu p gehörende Polynomfunktion über K. ã Polynome und Polynomfunktionen sind also 2 Paar Schuhe, wenn sie auch viel miteinander zu tun haben. Nach den Ausführungen im vorangegangenen Kapitel über Polynome sind die Polynomfunktionen also gerade diejenigen, deren Termdarstellung die Form x # â pk+1 xk k=0,¼,n hat. Eine Polynomfunktion über K ist immer eine Funktion von K nach K. Viele interessante Problemstellungen wie z.B. Differenzieren, Integrieren, berechnen von Funktionswerten etc. kann ich für Polynome bzw. für Polynomfunktionen Kapitel 2: Ein Grundbaukasten für die Mathematik 83 von Funktionswerten etc. kann ich für Polynome bzw. für Polynomfunktionen sehr leicht lösen. Es wird daher in vielen Problemstellungen versucht, die allgemeine Problemstellung auf ein Problem für Polynome oder Polynomfunk− tionen zu reduzieren. Zum Berechnen eines konkreten Funktionswertes einer Polynomfunktion muss also das Polynom p ausgewertet werden. Es stellt sich dabei heraus, dass ich beim Auswerten eines Polynoms an einer Stelle a unter Verwendung der Definition viel unnötigen Rechenaufwand betreibe, da ich hintereinander aufsteigende Potenzen von a berechnen muss. Ich brauche aber a j+1 nicht von vorne berechnen, wenn ich vorher a j schon berechnet habe! Ich versuchen daher nun, einen neuen Algorithmus zur Polynom|Evaluation zu entwickeln. Ich werde versuchen, mittels Reduktion durch Rekursion zu einem Lösungsalgorith− mus zu kommen. Die Problemstellung lautet also: Gegeben : p, a, K sodass : p Î P@KD. Eval : Gesucht : y sodass : y= â K i=0,¼,deg@pD coef@p, iD * ai . K Ich wähle nun ein Rekursionsschema. Wie wir schon gesehen haben, können wir verschiedenste Schemata ausprobieren, bei Tupeln bietet sich aber zual− lererst einmal folgendes an: EvalXXp\,a,K\,y Þ EvalXXp0,p\,a,K\, f @p0,a,yD d.h. wir probieren Rekursion über das Tupel p und wir denken uns p durch einen Konstruktor aus dem ersten Element und den restlichen zusammeng− esetzt. Wir versuchen nun, diese Aussage zu beweisen und dabei draufzukom− men, wie f @c, a, yD ausschauen muss. Unter der Voraussetzung EvalXXp\,a,K\,y , d.h. y= â K \D i=0,¼,deg@Xp \, iD * ai coef@Xp K versuchen wir EvalXXp0,p\,a,K\, f @p0,a,yD zu beweisen, d.h. f @p0, a, yD = â K \D i=0,¼,deg@Xp0,p coef@Xp0, p\, iD * ai K = coef@Xp0, p\, 0D * a0 + K K â K \D i=1,¼,deg@Xp0,p coef@Xp0, p\, iD * ai K 84 Kapitel 2: Ein Grundbaukasten für die Mathematik = p0 + K â K \D i=0,¼,deg@Xp = p0 + a * K K â coef@Xp0, p\, i + 1D * ai+1 K K \D i=0,¼,deg@Xp \, iD * ai coef@Xp K = p0 + a * y K K Somit kann ich wählen f @p0, a, yD := p0 + a * y. Weiters gilt natürlich der elemen− tare Fall EvalXXp0\,a,K\,p0 , den wir immer nach endlich vielen rekursiven Reduk− tionen erreichen. Wir haben damit einen rekursiven Polynom|Evaluationsalgorith− mus gefunden! , p0, a, KD, DefinitionA"Recursive Polynomial Evaluation", any@p evalRec@Xp0\, aD := p0 \, aD E evalRec@Xp0, p\, aD := p0 + a * evalRec@Xp P@KD K P@KD K P@KD UseAlso@Definition@"Recursive Polynomial Evaluation"DD 4 1 2 8 3 ComputeAevalRecA[ , , , _, EE P@QD 5 30 13 7 5 25531 22750 Die rekursive Zerlegung endet immer am elementaren Fall eines Tupels mit nur einem Element ~ dem letzten Element des Eingabetupels p, d.h. dem führenden Koeffizienten von p ~ und wir haben nur 1 Konstruktor. Wie wir uns im Kapitel über Rekursion schon überlegt haben, entspricht die rekursive Berechnung von evalRec@Xp0 , ¼, pn \, a, KD damit dem Berechnen von f p0 , a, f p1 , a, ¼ f pn-1 , a, evalRec@Xp KD n \, ¬a, «¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬ ¬¬¬¬¬¬­ ¬¬¬¬¬¬¬¬ ¬¬¬¬¬¬¬ ¬ ¬¬¬ ® pn (3) Diesen Ausdruck berechne ich úvon innen nach außenø, d.h. ich starte mit pn und wende in einer Schleife wiederholt f an, und zwar genau n−mal, d.h. deg@pD−mal. Im Gegensatz zur Rekursion, wo wir in der rekursiven Zerlegung das Tupel p úvon vorne nach hintenø durchlaufen, durchwandern wir in der Schleife das Tupel p úvon hinten nach vorneø. Ein anderer Weg, zur iterativen Version des oben entwickelten rekursiven Algorithmus zu gelangen, ist, den Ausdruck evalRec@p, a, KD für ein konkretes Polynom p zu expandieren. 4 1 2 8 ComputeAevalRecA[ , , , _, aEE P@QD 5 30 13 7 8 yy 4 i 2 i 1 + a * jj + a * jj + * azzzz 13 7 {{ 30 5 k k Kapitel 2: Ein Grundbaukasten für die Mathematik 85 Diese Form entspricht genau der Form (3), und das Auswerten úvon innen nach außenø bringt mich auch zu einer Schleife. In dieser iterativen Form nennt sich das Verfahren zum Evaluieren eines Polynoms Horner|Algorithmus oder Horner|Schema. Horner@p_, a_, K_D := Module@8y = pP-1T, i<, Do@y = y * a + pP-iT, 8i, 2, Length@pD<D; yD 4 1 2 8 3 HornerA[ , , , _, , QE 5 30 13 7 5 25531 22750 Wir haben gesehen, dass das Horner|Schema zum Evaluieren genau jene Methode ist, die unmittelbar aus einer rekursiven Problemreduktion für Tupel resultiert! Zusätzlich zur Effizienzsteigerung bei Verwendung des Horner|Sche− mas ist diese Art der Evaluation auch vom Standpunkt der numerischen Stabil− ität gegenüber der herkömmlichen Methode zu bevorzugen. Für später werde ich aber auch die rekursive Realisierung als Horner Schema zur Verfügung stellen. , p0, a, KD, AlgorithmA"Horner Scheme", any@p evalHorner@Xp0\, aD := p0 \, aDE evalHorner@Xp0, p\, aD := p0 + a * evalHorner@Xp P@KD P@KD K K P@KD UseAlso@Algorithm@"Horner Scheme"DD Übung Implementieren wir sowohl die herkömmliche Polynom|Evaluation als auch das Horner|Schema in Mathematica und experimentieren wir mit Timing und mit dem ComputerArithmetic Package. Übung Beweisen wir die Korrektheit des iterativen Programms úHornerø. Was ist dabei zu beweisen? (Siehe Abschnitt úReduktion durch Iterationø im Kapitel úBegriffs− bildungø). ã Ich werde den Bereich der Polynomfunktionen über K mit P@KD bezeichnen. In P@kD gibt es eine Operation pf, die einem Polynom p die zugehörige Polynom− funktion zuordnet. Die zu p gehörende Polynomfunktion in P@KD erhalte ich also durch pf @pD. Ich definiere die zu p gehörende Polynomfunktion pf @pD, indem P@KD P@KD ich für jedes x aus K den Wert der Funktion an der Stelle x festlege. Der Wert der zu gehörenden Polynomfunktion an einer Stelle (also ) ergibt 86 Kapitel 2: Ein Grundbaukasten für die Mathematik der zu p gehörenden Polynomfunktion an einer Stelle x (also pf @pD@xD) ergibt P@KD sich laut Definition 22 durch Evaluation von p an der Stelle x. Ich werde Funktion− swerte in Zukunft durch Evaluation mittels Horner|Schema ermitteln. Oft wird auch vom Grad einer Polynomfunktion gesprochen. Der Grad der zu p gehörenden Polynomfunktion soll einfach der Grad von p sein. DefinitionA"Polynomial Function Domain", any@KD, P@KD := FunctorAP, any@p, xD, s = X\ pf @pD@xD := evalHorner@p, xD P@KD P degApf @pDE := deg@pD P P P@KD EE UseAlso@ XDefinition@"Polynomial Function Domain"D, Definition@"Polynomial Domain"D\D ComputeA pf @X4, 2, 0, 1\D@3DE P@ND 37 1 ComputeA pf @X4, 2, 0, 1\DA EE 3 P@QD 127 27 1 ComputeAevalAX4, 2, 0, 1\, EE P@QD 3 127 27 ComputeAdegA pf @X4, 2, 0, 1\DEE P@QD P@QD 3 2.3.2 Organisatorisches 2.4 Matrizen Besonders bei der Behandlung von linearen Gleichungssystemen werde ich Matrizen schätzen lernen, aber auch für andere Zwecke, wie z.B. die Repräsen− tierung einer Drehung von Punkten in der Ebene oder im Raum, lassen sich Matrizen vorteilhaft einsetzen. Was sind nun Matrizen? Gemeinhin stelle ich mir unter einer m ´ n|Matrix über D ein rechteckiges Schema Kapitel 2: Ein Grundbaukasten für die Mathematik 87 l ij M1,1 M1,2 ¼ M1,n yz o o zz jj o o o ojjjj M2,1 M2,2 ¼ M2,n zzzz m Zeilen m z jj o o » ¼ » zzzz o jjj » o o z oj M M¬¬¬¬¬¬ ¼ M m,2 m,n¬¬¬¬¬{® n k m,1¬¬¬¬¬¬¬¬ «¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬ ¬­¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬ ¬¬¬¬¬¬¬¬ n Spalten bestehend aus m Zeilen und n Spalten mit Einträgen aus einem Bereich D vor. Eine passende mathematische Modellierung dafür kann ich mit Hilfe von Funk− tionen angeben: Eine m ´ n|Matrix M ist eine Funktion M Nm ´ Nn ® D Xi, j\ # Mi, j Jedem Paar Xi, j\ wird somit ein Funktionswert M@Xi, j\D aus D zugeordnet. Im Zusammengang mit Matrizen schreibe ich anstelle von M@Xi, j\D gerne Mi, j . Ich stelle mir unter Mi, j das Element in der i|ten Zeile und j|ten Spalte im Rechtecks|Schema vor. Ich kann nun auf diesen Objekten arithmetische Operationen wie Addition, Subtraktion, Multiplikationen etc. definieren. Das Resultat z.B. der Addition zweier Matrizen soll wieder eine Matrix sein, also wieder eine Funktion. Ich definiere diese Funktion, indem ich ihren Wert an jeder Stelle des Definitionsbereichs angebe. Bei der Implementierung von Matrizen in einem Computer|System hilft mir diese Sichtweise aber nicht recht weiter, da ich keine Darstellung für solche Funktionen zur Verfügung habe. Eine Möglichkeit ist sicher, die m × n Funktion− swerte Mi, j nach irgendeinem System abzuspeichern, das mir später den Zugriff auf alle Werte Mi, j wieder ermöglicht. In einem System, wo ich arrays zur Verfügung habe, bieten sich diese zum Abspeichern der Werte der Matrix an. Zu einer Modellierung, die sich näher an der Mathematik befindet, komme ich, wenn ich das Rechtecks|Schema zeilenweise oder spaltenweise betrachte. Ich betrachte die gesamte Matrix als endliche Folge von Zeilen (Spalten), die ich als Tupel der Länge m (n) repräsentieren kann. Jede Zeile (Spalte) ist eine endliche D|Folge der Länge n (m), die ich somit wieder als Tupel darstellen kann. Eine Matrix ist demnach ein Tupel von gleichlangen Tupel! Verwende ich Tupel von Zeilen, so ist der Zugriff auf ganze Zeilen sehr einfach, verwende ich hingegen Tupel von Spalten, so ist der Zugriff auf ganze Spalten einer Matrix sehr einfach zu realisieren. Es hängt von der Verwendung ab, welche der beiden Varianten zu bevorzugen ist. Wir werden den Bereich der Matrizen über einem Bereich D wieder mittels eines Funktors definieren, wie wir es schon bei den Polynomen erfolgreich praktiziert haben. Ich werde die Matrix|Operationen nicht alle selbst definieren sondern werde auf die in Mathematica zur Verfügung stehenden Operationen für Matrix|Multiplikation und Matrix|Invertierung und einige andere zurückgre− ifen. Im Hilfsabschnitt úTheorema|Zugriff auf Mathematica Operationenø stehen Hilfsfunktionen zur Verfügung, die vorhandene Mathematica Funktionen auf 88 Kapitel 2: Ein Grundbaukasten für die Mathematik ú ø Hilfsfunktionen zur Verfügung, die vorhandene Mathematica Funktionen auf entsprechende Theorema Objekte anwenden. Durch den bekannten úBuilt|inø |Mechanismus kann ich auf diese Hilfsfunktionen von Theorema aus zugreifen. Built|in@"Matrices"D ·bui@Matrices, ·range@D, True, ·flist@·lf@MD, MD = MatrixDeterminantD, ·lf@MI, MI = MatrixInverseD, ·lf@MM, MM = MatrixMultiplicationD, ·lf@MT, MT = MatrixTransposedDDD Das bedeutet, dass ich durch die Kürzel úMDø, úMIø, úMMø und úMTø zum Zugriff auf die Hilfsfunktionen úMatrixDeterminantø, úMatrixInverseø, úMatrixMulti− plicationø und úMatrixTransposedø verwenden kann. Den Bereich der Matrizen kann ich dann durch folgenden Funktor definieren. IsInfixOperatorSymbol@"="D = True; DefinitionA"Matrices from Mathematica", any@DD, Mat@DD := FunctorAM, any@A, BD, s = X\ ij jj Î@AD jjjjis|tuple@AD í jj M j k " i=1,¼,rows@AD j=1,¼,columns@AD rows@AD := A¤ columns@AD := A1 ¤ IA = BM : M " D His|tuple@Ai D ß H Ai ¤ = A1 ¤LL í yz zz Î @Ai,j Dzzzz zz D z { i=1,¼,rows@AD j=1,¼,columns@AD A + B := [[Ai,j + Bi,j M " i=1,¼, A¤ IAi,j = Bi,j M D Ë _ j=1,¼,columns@AD ÄÄÄ ÄÄÄ ÄÄÄ ÄÄÄ Ä EE _ i=1,¼,rows@AD AB := [[Ai,j B M D i,j É _ j=1,¼,columns@AD ÄÄÄ ÄÄÄ ÄÄÄ ÄÄÄ _ i=1,¼,rows@AD A * B := MM@A, BD M Inverse@AD := MI@AD M T@AD := MT@AD det@AD := MD@AD Auf einige Details sei hingewiesen: Manche Matrix|Operationen verlangen gewisse Bedingungen an die Dimension der beteiligten Matrizen. Die Dimen− sionen der beteiligten Matrizen bei Addition und Subtraktion müssen identisch sein, bei der Multiplikation muss A eine m ´ n und B eine n ´ k|Matrix sein, Inverse und Determinant sind ebenfalls nur im Fall m = n definiert. Ich nehme auf diese Restriktionen in der Definition keine Rücksicht, ich verlange vom Kapitel 2: Ein Grundbaukasten für die Mathematik 89 auf diese Restriktionen in der Definition keine Rücksicht, ich verlange vom Benutzer, dass die entsprechenden Dimensionen passen, andernfalls muss mit Fehlermeldungen oder sonstigen unvorhersehbaren Effekten gerechnet wer− den. Ich könnte mich auch auf die quadratischen Matrizen beschränken, d.h. auf den Fall m = n. In diesem Fall brauche ich obige Dimensionsüberlegungen nicht anzustellen, andererseits müsste ich dann auf die Matrix|Darstellung für lineare Gleichungssysteme verzichten. Das ist es mir nicht wert! Use@XBuilt|in@"All Semantics"D, Built|in@"Matrices"D, Definition@"Matrices from Mathematica"D\D ComputeA Î @XX1, 2\, X3, 4\\DE Mat@QD True ComputeA Î @XX1, 2\, X3, 4, 5\\DE Mat@QD False ComputeA Î @XX1, 2\, X3, 4.1\\DE Mat@QD False ComputeAInverse@XX1, 2\, X3, 4\\DE MatrixShow Mat@QD ij -2 1 jjj 3 -1 k 2 2 yz zzz { 3 -1 ComputeAXX1, 2\, X3, 4\\ * [X-2, 1\, [ , __E MatrixShow Mat@QD 2 2 ij 1 0 yz z j k0 1 { 3 -1 ComputeAXX1, 2\, X3, 4\\ + [X-2, 1\, [ , __E MatrixShow Mat@QD 2 2 ij -1 3 yz jjj 9 7 zzz k 2 2 { 3 -1 ComputeAXX1, 2\, X3, 4\\ Mat@QD - [X-2, 1\, [ , __E MatrixShow 2 2 ij 3 1 yz jjj 3 9 zzz k 2 2 { Compute@det@XX1, 2\, X3, 4\\DD -2 Compute@T@XX1, 2\, X3, 4\\DD MatrixShow 1 3y jij zz k2 4 { 90 Kapitel 2: Ein Grundbaukasten für die Mathematik Für die Definition der Matrix|Multiplikation, der transponierten Matrix, der Determinante und der inversen Matrix sei auf die lineare Algebra verwiesen. Als besonders praktisch erweisen sich Matrizen und Vektoren zum Beschreiben von linearen Gleichungssystemen. Ein lineares Gleichungssystem ist eine Kollektion von Gleichungen der Form a1,1 x1 + a1,2 x2 + a1,3 x3 + ¼ + a1,n xn = b1 a2,1 x1 + a2,2 x2 + a2,3 x3 + ¼ + a2,n xn = b2 » » » am,1 x1 + am,2 x2 + am,3 x3 ¼ » » + ¼ + am,n xn = bm (4) wobei ich die Koeffizienten ai, j und die jeweils rechten Seiten der Gleichungen bi als gegeben betrachte und alle xi derart zu bestimmen sind, dass alle Glei− chungen erfüllt sind. Ich kann nun die Koeffizienten ai, j zu einer m ´ n|Matrix ij a1,1 a1,2 a1,3 jj jj a2,1 a2,2 a2,3 A = jjjj » » jjj » j a a a k m,1 m,2 m,3 ¼ a1,n ¼ a2,n ¼ » ¼ am,n yz zz zz zz, zz zz zz { die gesuchten x j zu einem Spaltenvektor (n ´ 1|Matrix) und die rechten Seiten bi zu einem Spaltenvektor (m ´ 1|Matrix) ij x1 jj jj x2 x = jjj jj » jj k xn yz ij b1 zz jj zz j zz bzw. b = jjj b2 zz jj » zz jj z j { k bm yz zz zz zz zz zz z { zusammenfassen. Die Definition der Matrix|Multiplikation ist nun genau so, dass A × x ein Spaltenvektor ist, dessen Einträge die jeweils linken Seiten des Gleichungssystems (4) sind. Die Gleichung A × x = b ist somit eine Gleichheit von Spaltenvektoren, die als komponentenweise Gleichheit definiert ist. Die i|te Komponente entspricht dabei genau der i|ten Gleichung in (4). Somit bes− chreibt A × x = b genau das lineare Gleichungssystem (4). ComputeAXXa1,1 , a1,2 \, Xa2,1 , a2,2 \\ * XXx1 \, Xx2 \\E MatrixShow Mat@QD ij x1 * a1,1 + x2 * a1,2 j k x1 * a2,1 + x2 * a2,2 yz z { ComputeAXXa1,1 , a1,2 \, Xa2,1 , a2,2 \\ * XXx1 \, Xx2 \\ = XXb1 \, Xb2 \\E Mat@QD Mat@QD x1 * a1,1 + x2 * a1,2 = b1 í x1 * a2,1 + x2 * a2,2 = b2 Q Use@D; IsInfixOperatorSymbol@"="D =. Q Kapitel 2: Ein Grundbaukasten für die Mathematik 91 2.4.1 Vektoren Wir werden uns auch einen einfachen Funktor für die grundlegenden Opera− tionen auf Vektoren zur Verfügung halten: DefinitionA"Vectors", any@DD, Vec@DD := FunctorAV, any@A, B, t, j, nD, s = X\ i Î@AD jjis|tuple@AD í V k A + B := [Ai + Bi V D AB := [Ai B V D i t * A := [t * Ai V D Ë _ É _ i=1,¼, A¤ EE i=1,¼, A¤ Ë _ i=1,¼, A¤ l o1 Ü i = j e j,n := [m o 0 Ü otherwise n 2.4.1 Organisatorisches y Î @Ai Dzz { " i=1,¼, A¤ D ÄÄÄ ÄÄÄ ÄÄÄ i=1,¼,n _