# Summen von natürlichen Zahlen

1. Die ersten hundert natürlichen Zahlen
2. Summen von Quadrat- und Kubikzahlen
3. Summen höherer Potenzen

Diese Präsentation führt Sie – ausgehend von einer berühmten Anekdote – in die Verwendung des Summenzeichens ein und zeigt exemplarisch, wie die spielerische Beschäftigung mit Spezialfällen zu allgemeinen Erkenntnissen führen kann.

## 1. Die ersten hundert natürlichen Zahlen

Carl Friedrich Gauß wurde 1786 in der Volksschule als Beschäftigung die Aufgabe gestellt, die Zahlen von 1 bis 100 zu addieren. Gauß hat diese Aufgabe mit einem einfachen Trick in kürzester Zeit gelöst.

Heute können wir natürlich den Computer solche Summen berechen lassen. Der schafft das auch auf die „Ochsentour“ in praktisch nicht wahrnehmbarer Zeit. Dieser Komfort kann uns aber leider auch von der Entwicklung einer effizienten Lösung abhalten, ohne die auch der schnellste Computer scheitert, wenn wir z.B. nicht die Summe von 1 bis 100 sondern bis 10100 benötigen.

### Das Summenzeichen

Die gesuchte Summe ist

1+2+3+\ldots+100
Mit dem Summensymbol (großer griechischer Buchstabe Sigma) lässt sich das kürzer so schreiben:
\sum_{i=1}^{100} i
Damit werden für i der Reihe nach alle Werte vom Anfangswert 1 bis zum Endwert 100 eingesetzt und aufsummiert.

Statt der Laufvariablen i kann rechts auch ein beliebiger Term stehen, der jeweils in Abhängigkeit von i berechnet wird:

\sum_{i=n_0}^{n_1} f(i)

Die Bedeutung einer solchen Summe könnte man in mathGUIde allgemein so definieren:

    def sigma(n0, n1, f):
        sum = 0         # anfangs leere Summe
        i = n0          # i auf Startwert setzen
        while i <= n1:  # solange i den Endwert nicht überschreitet...
            sum += f(i) # ...die Summe um f(i) erhöhen
            i += 1      # ...und i um eins erhöhen
        return sum

Ins Eingabefenster kopieren und ausführen.

Wieso kommt in der Parameterliste der Funktion `sigma` die Variable i nicht vor? Das hat einen guten Grund: i dient ja nur als Hilfsvariable für das Durchzählen der in die Summe einzusetzenden Werte. Man könnte dafür auch eine beliebige andere Variable nehmen, ohne den Wert der Summe zu verändern. In der Implementierung haben wir dafür eine lokale Variable `i` verwendet.

In unserem Beispiel ist f(i) = i, n0 = 1 und n1 = 100.
Damit können wir die gesuchte Summe so berechnen:

    def f(i):
        return i
    sigma(1, 100, f)

Ins Eingabefenster kopieren und ausführen.

Mit Hilfe des Python-Schlüsselworts `lambda` kann man sich die Definition einer benannten Funktion sparen und direkt eine anonyme Funktion einsetzen:

    sigma(1, 100, lambda i:i)

Ins Eingabefenster kopieren und ausführen.

### Kleine Übungen zum Summenzeichen

Bitte prüfen Sie Ihr Verständnis des Summenzeichens an den folgenden Beispielen:

\sum_{i=2}^4 {i^2} \quad \quad \sum_{k=-1}^1 {k^4} \quad \quad \sum_{i=1}^{10} 3 \quad \quad \sum_{i=1}^{0} (i+5) \quad \quad

Bevor Sie mathGUIde die Lösungen anzeigen lassen, versuchen Sie es bitte erst selbst!
Als Gedächtnisstütze können Sie die Definition der Funktion `sigma` noch einmal ins Eingabefenster kopieren.

    sigma( 2,  4, lambda i: i^2)
    sigma(-1,  1, lambda k: k^4)
    sigma( 1, 10, lambda i: 3)
    sigma( 1,  0, lambda i: i+5)

Ins Eingabefenster kopieren und ausführen.

### Die Gauß'sche Lösung des Problems

Natürlich hat Gauß nicht alle 100 Zahlen einzeln addiert, sondern sich folgendes überlegt:
Schreibt man die Summe einmal vorwärts und einmal rückwärts,

\begin{eqnarray} & 1 & + & 2 & + & 3 & + & \ldots & + &98 & + & 99 & + & 100 \\ = & 100 & + & 99 & + & 98 & + & \ldots & + & 3 & + & 2 & + & 1 \end{eqnarray}
Die Summe von 1 bis 5 lässt sich zweimal in einem 5·6-Rechteck unterbringen.

so ergeben die übereinanderstehenden Zahlen jeweils 101.
Die doppelte Summe ist also 100·101 = 10100 und damit die einfache Summe 5050.

Für allgemeinere Summen von 1 bis n ergibt sich ebenso:

2 \sum_{i=1}^n i = n(n+1)
und damit:
\sum_{i=1}^n i = {{n(n+1)} \over 2}

Zur Belohnung für unser Nachdenken rechnet mathGUIde uns jetzt mal eben die Summe der natürlichen Zahlen bis 10100 aus. Der Operator `//` steht für ganzzahlige Division:

    n = 10^100
    print(n*(n+1) // 2)

Ins Eingabefenster kopieren und ausführen.

Fortsetzung: Summen von Quadratzahlen