All + All -

Diskrete Strukturen

  • + - Rechnen mit grossen Zahlen
    • Unter grossen Zahlen verstehen wir Zahlen, die - dargestellt zur Basis 2 - nicht mehr in die Register der verfügbarene Rechner passen.
      Aktuell haben Rechner Register mit 32 oder 64 bits, wir meinen also Zahlen, die grösser als  4294967296 bzw. 18446744073709551616 sind.
      Additionen von Zahlen in dieser Grössenordnung ergeben wieder diese Grössenordnung, lassen sich also mit einem Maschinenbefehl erledigen.
      Mutliplikationen können ja leicht die Stellenzahl verdoppeln, für ein korrektes Ergebnis in einem Maschinenbefehl dürfen also die beteiligten Zahlen sogar nur halb so viele Stellen haben.

      Wie wir bei den Primzahlen gesehen haben, kommen grössere Zahlen durchaus vor, und es ist durchaus ein Problem, für sie die Basisoperationen '+', '*' und '/' effizient zu berechnen.

      + - Zahldarstellung

      • + - Man kann jede Zahl zu einer geeigneten Basis (üblicherweise mit p bezeichnet)
        darstellen. Unsere übliches System ist die Darstellung zur
        Basis 10, die dezimale Darstellung:
        a = Σk=0,1,...,∞ ak 10k.
        Für irgendeine natürliche Zahl n sind die ak mit k>n natürlich alle Null.
        Dann nennt man n+1 die Stelligkeit von a.
        Wir schreiben a dann statt als Summe als Reihe der Koeffizienten,
        beginnend mit dem höchsten Index:
        a = anan-1an-2... a0

        • BSP: 123 = 1*102 + 2*101 + 3*100
          a2=1, a1=2, a0=3
          a = 123

          BSP: 123 = 1*26 + 1*25 +1*24 +1*23 +0*22 +1*21 +1*20
          a = (1111011)2

          BSP: 123 = 1*82 + 7*81 +3*80
          a = (173)8

        Die verwendete Basis notieren wir, falls es nicht eindeutig ist in Form einer
        Klammer mit Index: (...)Basis

        + - Für die Berechnung grosser Zahlen wählen wir eine Darstellung zu einer Basis, die der noch handhabbaren Registergrösse (als 2er-Potenz) entspricht, also für 32 Bits die Basis b=2³², etc.

        • BSP: Wenn wir also von einem (hypothetischen) 3-Bit-Rechner ausgehen, wäre die Basis 2³=8 angemessen. Jedes der Produkte in der Summendarstellung im letzen Beispiel wäre also auf der Maschine in einer Operation berechenbar, die Gesamtsumme aber nicht mehr.

      + - Addition

      • In dieser Darstellung können wir zwei grosse Zahlen natürlich addieren (und subtrahieren), indem wir jeweils die jeweils gleichen Koeffizienten summieren.
        Fehlende Koeffizienten werden auf 0 gesetzt, und Überträge, also das verlassen des
        Zahlbereichs, müssen wir berücksichtigen:

        + - Sei x = (xn...x0)b, und y = (ym...y0)b, und sei k:=max(n,m).
        Dann ist z = (x+y) = (zk...z0)b mit
        z0 := (x0 + y0) mod b,
        r0 := (x0 + y0) - ((x0 + y0) mod b) mod 2
        z1 := (x1 + y1+ r0) mod b,
        r1 := (x1 + y1+ r0) - ((x1 + y1+ r0) mod b) mod 2
        ...
        zl := (xl + yl+ rl-1) mod b,
        l ist dabei k oder k+1, je nach Übertrag der höchsten Stelle.

        • BSP:
          x = 123 = (173)8, y = 87 =(127)8, z=x+y
          z0 = (7+3) mod 8 = 2, r0 = 1
          z1 = (7+2+1) mod 8 = 2, r1 = 1
          z2 = (1+1+1) mod 8 = 3, r2 = 0
          x+y = (322)8 = 3*64 + 2*8 +2 = 210

        Die Subtraktion behandelt man analog. Hier fällt sogar der Übertrag weg.

        Insgesamt reichen für Addition und Subtraktion O(max(n,m)) Standardoperationen aus.

      + - Multiplikation

      • Die Muliplikation ist komplizierter.
        Kanonisch würde man die Darstellung von oben verwenden,
        Faktor für Faktor ausmultipizieren und wieder summieren:

        Sei x = (xn...x0)b, und y = (ym...y0)b,
        Dann ist x*y = x*Σk=0,1,...,m yk bk = Σk=0,1,...,m (x*yk*bk).
        Jedes der Produkte x*yk ist wieder eine Summe
        yk * x = ykj=0,1,...,n xj bj = Σj=0,1,...,n (yk*xj*bj).
        Der bei der einfachen Multiplikation entstehende Übertrag von
        rj = floor(yk*xj/b) ist natürlich auch noch geeignet in die Summation aufzunehmen.

        + - Das istl. etwas kompliziert formuliert, das Schema des schriftlichen Multiplizierens:

        • BSP:
          x = 123 = (173)8, y = 87 =(127)8, z=x*y

          173 * 127 
          ------------
          173
           366         14=1*8+6
           1535        21=2*8+5, 49+2=6*8+3, 7+6=1*8+5
          ------------
          24715 
          
          
          (24715)8 = 5+7*8+6*8^2+4*8^3+2*8^4 = 10701 = 123*87 
          

        Insgesamt erfordert also auf diesem Wege die Multiplikation zweier (zur Basis b) n-stelliger Zahlen O(n^2) Operationen

        + - Mit geschickterer Zusammenstellung kann man bessere werte erreichen.
        Das Verfahren von Schönhage und Strassen (1971) benötigt O(n log n log log n) Schritte.

        Die Division lässt sich auf die Multiplikation zurückführen, der Berechnungsaufwand liegt also auch in dieser Grössenordnung.

  • + - FFT
    • Der Algorithmus von Strassen und Schönhage macht sich eine Umwandlung des Problems in einen andere Struktur zunutze, er benutzt die schnelle diskrete Fourier-Transormation.

      Die prinzipielle Idee dabei ist folgende: Man kann eine Funktion, z.B. ein Polynom, durch eine Funktionalgleichung angeben. Viele Funktionen kann man aber auch eindeutig dadurch bestimmen, das man geeignete Paare von Werten und Funktionswerten ("Stützstellen") angibt.
      Insbesondere Polynome vom Grad n sind eindeutig bestimmt, wenn man n solcher Paare angibt.

      Bei der FFT sind die Stützstellen idR Einheitswurzeln.

      Die Eindeutigkeit erlaubt auch eine Rücktransformation der Darstellung in die ursprüngliche Form.

      Nützlich ist das dann, wenn man zu einer schwierigen Operation o auf der Originaldarstellung eine aequivalente. effiziente Operation o' auf der Transformierten findet. Dann kann man
      statt

      Aufgabe ------ o ------- >  Lösung


      folgenden Weg realisieren:
       
      Aufgabe  --transf.-> DFT(Aufgabe) --o'-> DFT(Lösung) --rücktransf.-> Lösung

      Die FFT wird auch sehr erfolgreich in der Signalverarbeitung verwendet.

  • + - Kryptographie
  • + - Rekursionsgleichungen
    • + - In den vergangenen Kapiteln sind uns ja wiederholt induktiive Definitionen begegnet, bei denen die Begriffe ausgehend von Anfangswerten dann durch eine Rekursionsgleichung definiert wurden.
      Für viele Zwecke ist das auch sehr praktisch, etwa bei der algorithmischen Behandlung von Graphen (insbes. Bäumen), bei denen jeder Knoten besuicht werden muss.
      Bei Funktionen dagegen, wo uns eigentlich nur der Funktionswert interessiert, ist es wesentlich effizienter die Rekursionsgleichung aufzulösen und durch eine Funktion zu ersetzen, deren Wert  nicht mehr auf den Vorgängerwerten basiert, sondern nur noch vom Index n und den Anfangswerten abhängt, und natürlich auch keine von n abhängigen Summen oder Produkte (∑., Π) enthält.

      • + - BSP
        • Def: Die Folge fib(n), die definiert ist durch

          1. fib(0) := 0, fib(1) := 1
          2. fib(n) := fib(n-1) + fib(n-2) für alle n>1
          heisst Fibonacci-Folge

          Wenn man die Folge ganz einfach rekursiv nach der Definitionsgleichung programmiert, wächst der Berechungsaufwand enorm nA = n Additionen:
          fib(2) = 1A
          fib(3) = 1A         + 1A = 2A
          fib(4) = 2A + 1A + 1A = 4A
          fib(5) = 4A + 2A + 1A = 7A
          fib(6) = (7+4+1)A = 12A
          fib(7) = 20A, fib(8) = 33A, fib(9)=54A
          fib(10) = 88A, ...

          Genauer betrachtet ist das auch eine Rekursionsgleichung:
          Additionen(fib(0)) = Additionen(fib(1) =0
          Additionen(fib(n)) = Additionen(fib(n-1)) + Additionen(fib(n-2)) + 1

          Berechnet man fib(n) schlauer, indem man die Zwischenergebnisse speichert und nicht immer neu berechnet, benötigt man immer noch (n-1) Additionen für die Berechnung von fib(n), und natürlich mehr, genauer O(n) Zellen Speicherplatz.

      Hat man solch eine nicht-rekursive Definitionsgleichung gefunden,
      spricht man auch von einem geschlossenem Ausdruck und
      von einer Lösung der Rekursionsgleichung.

      Um uns dem Problem, eine Lösung der Rekursionsgleichung zu finden, verallgemeinern und formalisieren wir zunächst, um dann  über Spezialfälle ggf. zum Einzelproblem zu finden.

      Def: Eine Rekursionsgleichung ist eine Gleichung der Form
      f(n) := g(n,f(n-1),f(n-2),...,f(n-k))
      mit Funktionen f: N -> W und g:NxWk->W für eine Wertemenge W.

      + - Damit die Rekursionsgleichung eindeutig bestimmt ist, werden k Anfangswerte benötigt.

      • BSP: Bei fib ist k=2, W=N0, und
        f≡fib, und
        g(n,a,b) = a+b für n>1,
        g(1,a,b) = 1 und g(0,a,b) = 0

      + - Lineare Rekursionsgleichungen

      • Lineare Rekursionsgleichungen stellen eine wichtigen Spezialfall dar, für den in einigen Fällen allgemeine Lösungen angegeben werden können.

        + - Def: Eine Rekusionsgleichung der o.a. Form, bei der g eine lineare Funktion in f ist,
        heisst lineare Rekursionsgleichung k-ter Ordnung.
        Es ist dann
         f(n) = a1f(n-1)+a2f(n-2)+...+ akf(n-k) + b0 für n>k-1,
        mit den Anfangsbedingungen f(i) = bi für i=1,...,k-1.
        Ist b0=0, so heisst die Rekursionsgleichung homogen

        + - Lineare Rekursionsgleichungen 1, Ordnung sind einfach zu lösen

        • + - Homogenen Fall: Ist f(n)=af(n-1), und f(0) gegeben, dann ist
          f(1)=af(0), f(2)=aaf(0), f(3)=aaaf(0), insgesamt f(n) = anf(0)

          • Bew: Induktion.

            BSP: Wenn sich Bakterienkulturen in Nährlösung jede Minute teilen,
            bedeutet das für ihre Anzahl nach n Minuten:
            Anzahl(n) = 2*Anzahl(n-1). Fangen wir mit einem Bakterum an, also f(0) = 1,
            ist Anzahl(n) = 2n.
            Nach 60 Minuten also 1.152.921.504.606.846.976 Stück.

            FrageUnd wenn sie sich nur alle 5 Minuten teilen?

          Inhomogener Fall: Ist f(n)=af(n-1)+b, und f(0) gegeben, dann ist
          f(1)=af(0)+b, f(2)=aaf(0)+ab +b, f(3)=aaaf(0)+aab+ab+b=a3+b(a²+a+1)
          insgesamt:

          + - Satz: Für die inhomogen lineare Rekursionsgleichung
          f(n) = af(n-1)+b mit Anfangswert f(0) ist die geschlossene Form
          für a=1: f(n) = b+nf(0), und
          sonst: f(n) = anf(0) + b(an-1)/(a-1)

          • Bew: Induktion.

            BSP: Wenn eine Bank für 4% Zinsen Geld verleiht, und man immer 6%
            zurückzahlt, ergibt das bei 100 EUR
            Restbetrag(n) = 1,04*Restbetrag(n-1) - 6.
            Mit f(0) = 100 ist Restbetrag(n) = 1,04n*100-6*(1,04n-1)/0,04.
            Restbetrag=0 ergibt sich dann für
            1,04n*100 = 6*(1,04n-1)/0,04.
            Umformen ergibt 3=1,04n, mithin n=log(3)/log(1,04).
            Das ergibt 28,011022757 Rückzahlungen, ehe die Summe abgetragen ist.

        + - Auch für homogene lineare Rekursionsgleichungen 2. Ordnung finden sich noch eine bekannte geschlossene Form.

        • + - Satz: Seien f(0), f(1), a1 und a2 Konstanten, a1 und a2 nicht beide Null,
          und f(n) = a1f(n-1)+a2f(n-2) für n>1
          Seien weiter
          b1 und b2 reelle Lösungen der Gleichung x2-a1x-a2=0.

          Dann gilt für den Fall b1=b2:
           f(n) = (nA+B)b1n, mit
           A=(f(1)-b1*f(0))/b1, und B=f(0)

          und für den Fall b1≠b2:
           f(n)=b1nA-b2nB mit
           A=(f(1)-f(0)b2) / (b1-b2) und B=(f(1)-f(0)b1) / (b1-b2)

          • Bew: Induktion nach n

            + - BSP: Für die Fibonacci-Rekursion ist der Satz anwendbar.
            Wir erhalten f(0)=0, f(1)=1, a1=a2=1.
            Lösungen für x²-x-1=0 sind 1/2 ± √(1/4+1) = (1±√5)/2, also
            A=B=2/((1+√5)-(1-√5))=1/√5, und
            fib(n) = ((1+√5)/2)n* 1/√5 - ((1-√5)/2)n* 1/√5

      + - Rekursive Algorithmen (merge-sort, Baumsuche, ...) teilen ja in der Regel ein Problem in zwei oder mehr gleich grosse Teile. Die Laufzeitanalyse führt dann nicht zu einer linearen Rekursionsgleichung, sondern zu einer Rekursionsgleichung der Form
       Aufwand(n) = 2*Aufwand(n/2)+f(n)
      Über die Größenordnung der Laufzeit dieser Klasse von Funktionen macht der unter dem Namen "Master-Theorem" bekannte Satz Aussagen.

      • Die rekursive Gleichung hat dabei die Form (T steht für den Aufwand, von "Time"):

         T(n) = aT(n/b) + f(n).

        a,b sind Konstanten. Bei jedem Rekursionsschritt wird das Problem in b Teile geteilt,
        und f(n) beschreibt den Aufwand für die Kombination des Teilproblems.

        Die Entwicklung der Kosten hängt dann ganz grundlegend von f(n) ab,
        Das Theorem behandelt drei Fälle je nach Wachtumsverhalten von f(n),
        und in anderen Fällen ist es nicht anwendbar.

        ~ de.wikipedia.org > Wiki > Master-Theorem

        Zur Erinnerung:
        O(g): f wächst höchsten so schnell wie g
        Θ(g): f wächst ähnlich wie g
        Ω(g): f wächst mindestsen so schnell wie g

      + - Erzeugende Funktionen

      • Bislang haben wir Lösungen von Rekursionsgleichungen mehr oder minder geraten, und dann unsere Vermutung bewiesen. Man kann aber auch versuchen, Lösungen von Rekursionsgleichungen konstruktiv zu finden. ein Hilfsmittel dazu sind formale Potzenzreihen und ihre erzeugende Funktionen.

        Zur Schreibweise: Bei Folgen und Reihen wird statt a(n) auch oft an geschrieben.
        Gemeint ist dasselbe:
        Der Wert von a(n) hängt von n ab, a ist also eine Funktion von n.
        Ich habe mich wegen der Lesbarkeit hier für die Funktionsschreibweise entschieden.

        Def. Ein Ausdruck
        A(x) := ∑n≥0a(n)xn
        heisst formale Potenzreihe.
        Die formale Potenzreihe ist die erzeugende Funktion
        zur unendlichen Folge (a(n))n≥0.

        Formal deshalb, weil die Reihen nicht unbedingt überall konvergieren müssen.  
        Für formale Potzenzreihen in diesem Zusammenhang reicht die Konvergenz für sehr kleine Werte von x, weil wir im wesentlichen an den Koeffizienten interessiert sind, und die Werte der Reihen keine grosse Rolle spielt.

        + - Die Idee ist nun. zu einer Rekursionsgleichung eine passende erzeugende Funktion zu finden, diese in die Gleichung einzusetzen und danach aufzulösen, um dann letzlich über einen Koeffizientenvergleich eine nichtrekursive Darstellung der a(n) zu bekommen.
        Das geht allgemein in 6 Schritten.

        • 1. Aufstellen der erzeugenden Funktion A(x) := ∑n≥0a(n)xn

          2. Umformen der rechten Seite, so dass Anfangswerte und Rekursionsgleichung eingesetzt werden können.

          3. Unendliche Summen (meist über Index-shifts) so weiter umformen, dass sie durch A(x) ersetzt werden können.

          4. Auflösen nach A(x). Man erhält A(x) = f(x) mit einer - hoffentlich einfachen - Funktion f.

          5. Umschreiben von f(x) als formale Potenzreihe. Das kann durch Partialbruchzerlegung und Zurückgreifen auf bekannte Potenzreihen geschehen.

          6. Der Koeffizientenvergleich liefert dann eine explizite Darstellung für a(n).

        + - Wir machen das für das sehr einfache BSP a(n) = 2a(n-1), a(0)=1.

        • 1. Aufstellen der erzeugenden Funktion A(x) := ∑n≥0a(n)xn

          2. Umformen der rechten Seite, so dass Anfangswerte
          und Rekursionsgleichung eingesetzt werden können.
          Hier kann man direkt a(n) ersetzen:
          n≥0a(n)xn = a(0) + ∑n≥12a(n-1)xn

          3. Unendliche Summen (meist über Index-shifts) so weiter umformen,
          das sie durch A(x) ersetzt werden können:
          A(x) = 1 + ∑n≥02a(n)xn+1
          = 1 + 2∑n≥0a(n)xn+1
          = 1 + 2x∑n≥0a(n)xn
          = 1 + 2x∑n≥0a(n)xn
          = 1 + 2xA(x)

          4. Auflösen nach A(x):

          A(x) = 1 + 2xA(x)
          A(x)-2xA(x) = 1
          A(x) (1-2x) = 1
          A(x) = 1 / (1-2x)

          5. Umschreiben von f(x) als formale Potenzreihe.
          Bei den bekannten Funktionen mit Potenzreihenentwicklung findet man
          1 / (1-ax) = ∑n≥0anxn für ein festes a, hier a=2:
          A(x) = 1 / (1-2x) = ∑n≥02nxn

          6. Koeffizientenvergleich liefert dann eine explizite Darstellung für a(n):
          A(x) = ∑n≥0a(n)xn = ∑n≥02nxn
          also a(n) = 2n.

        + - Bekannte Potenzreihen findet man viele

        + - Um "passende" Potenzreihen zu finden, kann man zunächst von bekannten Potenzreihen ausgehen, diese verknüpfen und umformen.

        • Addition und Subtraktion erfolgen wie gewohnt Komponentenweise.

          A(x)*B(x) = ∑n≥0a(n)xn * ∑n≥0b(n)xn = ∑n≥0c(n)xn , mit
          c(n) = ∑K=0,...,na(k)b(n-k)
          Die Folge (c(n))n≥0 nennt man auch
          Faltung oder Konvolution der Folgen (a(n))n≥0 und (b(n))n≥0.

          Zu einer Potenzreihe A(x) ist die inverse Potenzreihe B(x) die Reihe, für die
          A(x)*B(X) = 1+0x +0x²+... ergibt, also In der o.g. Produktdarstellung c(0)=1 ist, und c(k)=0 für alle k>1.
          Die Inverse existiert genau dann, wenn a(0)≠0.

          Eine Potenzreihe A(X) = ∑n≥0a(n)xn kann man auch
          formal nach x gliedweise ableiten, er ergibt sich
          A'(X) = ∑n≥1na(n)xn-1 = ∑n≥0(n+1)a(n+1)xn
          Die Ableitung ist also die zugehörige Potenzreihe zur
          Folge a(1), 2a(2), 3a(3), ... , ka(k), ....

          Interessant ist auch eine Verschiebung um m Stellen (nach rechts),
          was bei geeigneter Benennung nur der Multiplikation mit xm entspricht
          a(0)xm+a(1)xm+1+a(2)xm+2+... = xmn≥0a(n)xn

        + - Viele der bekannten erzeugenden Funkionen entstammen der Funktion der geometrischen Reihe. Deren erzeugende Funktion kann man finden, indem man, ausgehend von der Potzenzreihe, die inverse Potenzreihe sucht:   

        • A(x) := ∑n≥0xn.
          Suche B(x) := ∑n≥0b(n)xn mit A(x)B(x) = 1.
          Das liefert b(0)=1, b(1)=-1, und b(k)=0 für k>1, also B(x) = 1-x.
          Damit ergibt sich für A(x) = 1/B(x) = 1 / (1-x)
          die bekannte Funktion der geometrischen Reihe.

          Wählt man hier x=ay, so findet man die Funktion für
          n≥0(ay)n = ∑n≥0anyn = 1 / (1-ay)

          Auch die (formale) Ableitung bringt weitere erzeugende Funktionen:
          A'(x) := ∑n≥1nxn-1 = ∑n≥0(n+1)xn
          = (1 / (1-x))' = 1 / (1-x)²

        + - BSP  a(n) = 3a(n-1) + n, a(0) = 1

        • Schritt 1-3 liefert:
          A(x) = 1 + 3x∑n≥0a(n)xn + ∑n≥0nxn
          = 1 + 3xA(x) + 1/(1-x)2

          Auflösen:
          A(x) = 1 + 3x∑n≥0a(n)xn + ∑n≥0nxn
          = 1 + 3xA(x) + 1/(1-x)2
          liefert
          A(x) = (x²-x+1) / ( (1-3x)(1-x)² )
          also ein Bruch von zwei Polynamen, der Nenner vom Grad 3.

          Direkt Potenzreihen dafür zu finden ist schwierig. Wir machen zunächst eine Partialbruchzerlegung mit folgendem Ansatz:

          A(x) = (x²-x+1) / ( (1-3x)(1-x)² )
          = A / (1-3x) + B / (1-x) + C / (1-x)²
          Auflösen, einsetzen etc. liefert daraus die drei Gleichungen
          A+B+C = 1 (aus x=0)
          C = - 1/2 (aus *(1-x)², x=1)
          A = 7/4 (aus *(1-3x), x=1/3)
          B = -1/4 (aus A+B+C=1)

          Also A(x) = (7/4) / (1-3x) - (1/4) / (1-x) - (1/2) / (1-x)²
          mit den entsprechenden bekannten Potenzreihen
          A(X) = (7/4) ∑n≥03nxn - (1/4) ∑n≥0xn - (1/2) ∑n≥0(n+1)xn
          = ∑n≥0 ( (7/4)3n - 1/4 - (n+1)/2 ) xn
          = ∑n≥0 ( (7/4)3n - n/2 - 3/4 ) xn

          Koeffizientenvergleich: a(n) = (7/4)3n - n/2 - 3/4

        + - BSP Fibonacci-Folge

        • Das ist nun etwas aufwändiger.

          fib(n) = fib(n-1)+fib(n-2), fib(0)=0, fib(1)=1

          A(x) = ∑n≥0fib(n)xn
          = 0 + x + ∑n≥2(fib(n-1)+fib(n-2))xn
          = 0 + x + x∑n≥2fib(n-1)xn-1 + x²∑n≥2fib(n-2)xn-2
          = 0 + x + x∑n≥1fib(n)xn + x²∑n≥0fib(n)xn
          = 0 + x + x(A(x)-fib(0)) + x²A(x)
          = 0 + x + xA(x) + x²A(x)

          Auflösen: A(x) = x / (-x²-x+1)

          Zerlegen in Partialbruch mit Ansatz:
          A(x) = x / (-x²-x+1) = A/(1-ax) + B/(1-bx) liefert
          A+B=0 (aus x=0)
          (1-ax)(1-bx) = 1-x-x² (Hauptnenner, umformen, Koeffizientenvergleich)
          Ab+Ba = -1 (..., Koeffizientenvergleich)

          Lösen ergibt: A=1/√5, B=-1/√5, a=(1+√5)/2, b=(1-√5)/2

          Wir erhalten A(x) = (1/√5)(1/(1-ax)) - (1/√5)/(1/(1-bx))
          = 1/√5 ∑n≥0anxn - 1/√5 ∑n≥0bnxn
          = ∑n≥0(1/√5)(an-bn)xn

          Koeffizientenvergleich liefert
          fib(n) = (1/√5)(an-bn) = (1/√5)((1+√5)/2)n-(1/√5)((1-√5)/2)n

        Den Spezialfall fib hatten wir ja schon bewiesen. Hier sieht man auch. wie man auf die allgemeine Lösung für eine lineare Rekursionsgleichung 2. Ordnung kommt - per Erzeugende Funktion und Ansatz über die Partialbruchzerlegung. Dieser Ansatz funktioniert übrigens auch bei wechselseitiger Rekursion ...

  • + - Algebren
    • + - Algebra: Etwas, worin man rechnen kann
      • + - Wir haben schon viele Algebren benutzt,. ohne uns weiter Gedanken darüber zu machen.
        Der Begriff bezieht sich auf eine grundlegende Formalisierung, die es erst erlaubt, formale Strukturen zu verwenden und nachzuweisen.

        + - Def: Eine (universelle) Algebra ist ein Tupel (S,f_1,...,f_n) aus einer
        nicht leeren Trägermenge S und n Operationen f_1, ... f_n, n>0.
        Eine Operation f ist dabei ein Funktion f: Sm → S.
        und m≥0 die Stelligkeit der Operation f.

        • Wichtig ist die Abgeschlossenheit der Operationen:
          Der Wertebereich ist wieder S

          Nullstellige Operationen sind Konstanten.

          BSP: (N, max) - Die natürlichen Zahlen mit der zweistelligen Operation
          max(a,b) := ( a falls a>b, b sonst)

          (R,+,*) - die reellen Zahlen mit den binären Operationen
          + und * ist eine Algebra, sogar eine recht spezielle Algebra: ein Körper

          Mit einer Grundmenge U ist (Pot(U),∩,∪,c) eine Algebra auf der
          Potenzmenge von U und den Operationen Vereinigung, Schnitt
          und der unären Operation Komplement

          Die Menge B = {t,f} mit dem logischen und- und oder-Operationen
          und der Verneinung bildet die boolesche Algebra (B,∧,∨,¬).

          Die Wörter über einem endlichen Alphabet Σ bilden
          zusammen mit der Konkatenation • , also dem Aneinanderfügen von Wörtern,
          eine Algebra (Σ*,•)

          + - Eine Menge von Begriffen zusammen mit mindestens den Operationen Projektion, Selektion, Kreuzprodukt , Vereinigung, Differenz und Umbenennung bildet eine relationale Algebra, die Grundlage der relationalen Datenbanken.

        + - Einstellige Operationen nennt man auch unäre, zweistellige binäre und dreistellige ternäre Operationen. Zweistellige Operationen werden oft "infix", also wie bei zweistelligen Relationen zsichen die beiden Operanden notiert.

        • Beispiele:
        • x → x²  unär
        • (x,y) → ggT(x,y) binär
        • (x,y,z) → if x then y else z   ternär

        + - Def. Sei (S,f_1,...f_k) eine Algebra, und S' ⊆ S nicht leer.
        sind die Operationen f_1, ... , f_k abgeschlossen auf S', so heisst
        S' Unteralgebra von (S,f_1,...,f_k)

        • BSP: (N0,+) ist eine Unteralgebra von (Z,+)
          ({0,1},*) ist eine Unteralgebra von (Z,*)
          ({0,1},+) ist keine Unteralgebra von (Z,+)

        + - Bei binären Operationen ist eine interessante Frage, ob gewisse Elemente
        sich neutral verhalten, also quasi keine Auswirkungen haben.   

        • + - Def: Gilt für ein Element e in einer Algebra (S,◊) mit einer binären Operation ◊
            e ◊ x = x für alle x∈S, dann heisst e linksneutrales Element.

          • BSP:
            1 auf (N,max),
            ∅ auf (Pot(U),∪)

          Def: Gilt für ein Element e in einer Algebra (S,◊) mit einer binären Operation ◊
            x ◊ e = x für alle x∈S, dann heisst e rechtsneutrales Element.

          + - Satz: Hat in eine Algebra (S, ◊) die Operation ◊
          ein rechtsneutrales Element r und ein linksneutrales Element l,
          so gilt l=r

          • Bew: l = l ◊ r = r

          + - Def: In Fall des Satzes spricht man auch von dem neutralen Element.

          • BSP: Für (Pot(U),∩) ist U ein neutrales Element.

          Man spricht in Analogie zur vertrauten Multiplikation
          statt vom neutralen Element auch von
          Einselement, und schreibt es folgerichtig oft 1 statt e.

          + - Lemma: In einer Algebra (S,◊) hat ◊ höchstens ein neutrales Element

          • Bew: Gäbe es zwei, könnte man eines als rechts. eines als linksneutrales ansehen .... - q.e.d.

          + - Def. Sei (S,◊) eine Algebra mit einen neutralen Element e zu ◊
          Gibt es zu einem Element a aus S
          1. ein b aus S mit b ◊ a = e, so nennt man b Linksinverses zu a
          2. ein b aus S mit a ◊ b = e, so nennt man b Rechtsinverses zu a.
          Gilt sogar a◊b = b◊a = e, heisst b einfach Inverses zu a.

          • Nicht jedes Element muss ein Inverses haben.
            BSP: (N0,+) hat das Neutrale Element 0,
            und nur 0 hat ein Inverses, nämlich wieder 0.

          + - Def: Ein Element 0 mit der Eigenschaft
            0 ◊ a = 0 für alle a aus S heisst linkes Nullelement
          (rechtes Nullelement und Nullelement entsprechend)

          • BSP: Für (Pot(U),∩) ist ∅ ein Nullelement.
    • + - Morphismen
      • Morph kommt aus dem Griechischen und bedeutet Gestalt oder Form. Unter Morphismen versteht man in der Mathematik dann eine Abbildung, die gewisse Strukturen erhält. Dafür müssen die zugrunde gelegten Algebren natürlich einigermassen kompatibel sein.

        Def: Die Signatur eine Algebra (S,f_1,...,f_n) ist die Liste
        der Stelligkeiten der Operationen,
        also für f_1: Sm_1→S, f_2: Sm_2→S, ... , f_n: Sm_n→S
        das Tupel (m_1, m_2, ..., m_n)

        Def: Für zwei Algebren (S,f_1,...,f_k) und (M,g_1,...,g_k) mit gleicher Signatur
        heisst eine Abbildung h: S→M (Algebra-)Homomorphismus, wenn
        folgende Abbildung für alle i kommutiert, d.h. für i=1,...k gilt
        h ⋅ f_i = g_i ⋅ h :

        + -

        • BSP Bezeichnet |w| die Anzahl der Zeichen eines Wortes,
          so ist für ein Alphabet Σ
          h: Σ*N0, h(w):=|w|
          ein Homomorphismus von (Σ*,•) nach (N0,+)
          Die Signatur der Algebren ist jeweils (2).
          Die Länge eines zusammengesetzten Wortes ist die Summe der Teilwörter.

          Solche kommutierenden Abbildungen spielen (u.a. in der mathematischen Algebra) eine wichtige Rolle, Wir hatten das Prinzip der Einbettung ja auch schon so ähnlich aaO benutzt

        + - Satz: Mit den Voraussetzungen der vorigen Definition ist
        (h(S),g_1,...,g_k) eine Unteralgebra von (M,g_1,...,g_k)

        • Bew: Das folgt sofort aus der Abschliessungs-Eigenschaft von h

        + - Def. Ist mit den Benennungen der letzen Definition h bijektiv, so nennt man
        h einen Algebra-Isomorphismus und die beiden Algebren isomorph.

        • (vgl. FFT-Einbettung.)

          BSP: Die boolesche Algebra ({t,f},∧,∨,¬) ist isomorph zur Algebra
          ({1,0},min,max,1-) mit der Operation 1-(x) = 1-x.
          h(t)=1, h(f)=0.

          BSP: Die boolesche Algebra ({t,f},∧,∨,¬) ist auch isomorph zur Algebra
          ({U,∅},∩,∪,c)   (c = Komplement) für eine Universums-Menge U,
          h(t)=U, h(f)=∅.

    • + - Monoide und Gruppen
      • Speziellere Strukturen bekommt man, indem man Axiome - Anforderungen an die Operationen - hinzunimmt.

        Def: Eine binäre Verknüpfung ◊ in der Algebra (S,◊) heisst assoziativ,
        wenn für alle a,b,c aus S gilt ( a ◊ b) ◊ c = a ◊ (b ◊ c)

        + - Satz: Gibt es in einer Algebra (S,◊) mit einer assoziativen Operation ◊
        zu einem Element a ein Linksinverses l und ein Rechtsinverses r,
        so gilt l=r.
        Insbesondere ist das Inverse, sofern es existiert, dann eindeutig bestimmt.

        • Bew:  l = l ◊ e = l ◊ (a ◊ r) = (l ◊ a) ◊ r = e ◊ r = r

        Def: Eine Algebra (S,◊) mit einem assoziativen binären
        Operator ◊ heisst Halbgruppe.

        Def: Eine Halbgruppe (S,◊) mit einem neutralen Element e
        heisst Monoid.

        Def: Ein Monoid (S,◊), für den für jedes a aus S ein Inverses existiert,
        heisst Gruppe.

        + - Eine weitere Operation und ein zusätzliche Forderungen führen zu den Begriffen
        Ring und Körper.

        • Def. (Ring): Ein Ring ist eine Algebra mit zwei binären Verknüfungen (R,+,*), wobei
          (R,+) eine abelschen Gruppe mit neutralem Element 0 ist,
          * assoziativ ist, und
          für alle a,b,c, aus R gilt: a*(b+c) = a*b + a*c und (a+b)*c = a*c + b*c

          Def. (Körper): Ein nicht leerer, kommutativer Ring (R,+,*) mit
          neutralem Element bzg. * (Ring mit 1) ist ein Körper,
          wenn es zu jedem a≠0 ein Inverses bzgl. * gibt.

        + - Def. Eine Halbgruppe (ein Monoid, eine Gruppe) (S,◊) heisst abelsch,
        wenn für alle a,b aus S gilt a ◊ b = b ◊ a

        + - Gruppen.

        • Wir schreiben in diesem Abschnitt fast immer
          '*' für die Operation, 1 für das neutrale Element, a-1 für das Inverse von a,
          und identifizieren die Menge G mit der Gruppe (G,*)

          Für Gruppen lassen sich leicht die üblichen Rechenregeln (z.B. Kürzungsregeln) herleiten, insbesondere ist die binäre Operation der Algebra bei Gruppen bijektiv

          Man kann natürlich ein Elemen aus der Gruppe auch mit sich selbst verknüpfen. Das führt zu

          + - Def (Potenz): Sei G eine Gruppe, und a aus G. Für eine ganze Zahl n≥0
          definieren wir induktiv die n-te Potenz von a mit
          1) a0 = 1
          2) a1 = a
          3) an = a*an-1 für n>1

          • Die üblichen Potenz-Rechenregeln folgen direkt aus der Definition.

          + - Def (Ordnung): Sei g ein Gruppe und a aus G.
          Es ist die Ordnung von a
          ord(a) := min{n∈N: an = 1}, falls so ein n existiert.
          sonst vereinbart man ord(a) := ∞.

          • BSP: G=({0,1,2,3,4,5}, +(mod 6)):
            ord(0) = 1, ord(1) = 6, ord(2) = 3, ord(3)=2, ord(4)= 3, ord(5)=6

          + - Satz: In einer endlichen Gruppe hat jedes Element eine endliche Ordnung

          • Bew: G ist abgeschlossen, also sind die |G|+1 Elemente
            a0, a1, a2, ... a|G| alle in G.
            Mindesten zwei davon müssen also gleich sein, seien das
            oBdA die Potenzen k und l (k-l ist natürlich nicht 0).
            Es ist also ak=al, folgt
            ak-l=ak*a-l=al*a-l=al-l=a0=1,
            also ak-l=1, also ord(a)≤(k-l)

          + - Satz: Sei G eine endliche Gruppe, und a aus G. Für ein k>0 gilt
          ak=1 genau dann. wenn ord(a)|k

          • Bew: einfach nachrechnen

          + - Def. Sei (G,*) eine Gruppe, und H⊆G.
          Ist auch (H.*) eine Gruppe, nennt man H Untergruppe von G

          • BSP: Für eine ganze Zahl n ist
            nZ := {nz | z∈Z}
            (nZ,+) ist eine Untergruppe von (Z,+)

          + - Satz: S(a) := {1,a,a²,...,aord(a)-1} ist die kleinste Untergruppe, die a enthält.

          • Bew: S(a) ist abgeschlossen, und in einer Untergruppe H müssen
            mit a auch alle Potenzen von a sein.
            Jedes Element ak von S(a) hat ein Inverses aord(a)-k

          Gruppe und Untergruppe müssen das gleiche neutrale Element haben.

          + - Satz: Sind H und I Untergruppen einer Gruppe G, so ist auch H∩I eine Untergruppe.

          • Bew (knapp): z.zg. ist im wesentlichen die Abgeschlossenheit, Das ist aber klar, da h*i wegen der Abgeschlossenheit von H und I wieder in H und in I liegen muss.

            Bem: Die Vereinigung von Untergruppe ist i.A. keine Gruppe:
            2Z ∪ 3Z ist bzgl '+' nicht mal abgeschlossen.

          Def: Sei a aus G, und H eine Untergruppe. Dann heisst
          a*H :={ a*h | h∈H } eine linke Nebenklasse von H , und entsprechend
          H*a :={ h*a | h∈H } eine rechte Nebenklasse von H

          Bem: Zwei Nebenklassen sind endweder identisch oder diskunkt

          + - Bem: Die Menge aller Nebenklassen zu einer Untergruppe H bildet eine Partition von G

          • BSP: Für die Gruppe (Z,+) ist (6Z,+) eine Untergruppe,
            mit den Nebenklassen
            0+6Z, 1+6Z, 2+6Z, 3+6Z, 4+6Z, 5+6Z

            Im Fall der ganzen Zahlen bezeichnet man die Nebenklassen
            der o.a. Form auch als Restklassen. Es ist ja für i=0,...,5
            i+6Z = {z∈Z| z = i mod 6 }

          Def: Die Anzahl der verschiedenen Nebenklassen von H in G wird mit
          Index von H bzw. ind(H) bezeichnet..

          Satz (Lagrange) Für endliche Gruppen G und Untergruppen H gilt:
          |G| = |H|*ind((H)

          Insbesondere ist also die Mächtigkeit der Untergruppe ein Teiler der Mächtigkeit der Gruppe.

          + - Korollar: Sei a aus G und G eine endliche Gruppe.
          Dann teilt ord(a)  |G|

          • Bew: S(a) ist eine Untergruppe der Kardinaliät ord(a).
    • + - Als Anregung: