Explizite Berechnung der primitiven pythagoreischen Zahlentripel

Es werden die Eigenschaften von primitiven pythagoreischen Zahlentripeln gezeigt und die Sätze bewiesen, die angeben, wie man alle primitiven pythagoreischen Zahlentripel explizit berechnen kann.

Einordnung des Artikels

Hier werden die Bezeichnungen verwendet, die im Kapitel Der Satz des Pythagoras und pythagoreische Zahlentripel eingeführt wurden.

Voraussetzungen

Dieses Kapitel setzt nur elementare Geometrie- und Algebra-Kenntnisse voraus, die deutlich unterhalb des Abiturniveaus liegen.

Einführung

In Der Satz des Pythagoras und pythagoreische Zahlentripel wurden schon die Fragestellungen im Zusammenhang mit dem Lehrsatz des Pythagoras formuliert, insbesondere:

Die Ausdrucksweise "explizit berechnen" und "Rekursionsformel" bedarf vielleicht einer näheren Erklärung; dazu diene der Vergleich mit der geometrischen Folge.

Die Folge von Zahlen

1, 1/2, 1/4, 1/8, 1/16, 1/32, ...

lässt sich explizit berechnen, nämlich mit der Formel:

an = 2-n, n = 0, 1, 2, 3, ...

Man muss sich nur den Wert von n vorgeben – das ist die Stelle, an der ein Folgenglied steht, wenn man mit 0 zu zählen beginnt, – und in die Formel einsetzen.

Die Folge kann aber auch rekursiv berechnet werden – dazu muss man sich den Startwert 1 vorgeben und benötigt eine Formel, wie aus einem Folgenglied das nächste Folgenglied berechnet wird:

a0 = 1, an+1 = an/2, n = 0, 1, 2, 3, ...

In diesem Kapitel werden:

Im folgenden Kapitel wird untersucht, ob sich die pythagoreischen Zahlentripel rekursiv berechnen lassen.

Man sollte sich dazu klar machen, dass die Vorgehensweise, wie in Der Satz des Pythagoras und pythagoreische Zahlentripel die pythagoreischen Zahlentripel berechnet wurden, von einem systematischen Standpunkt aus nicht zufriedenstellend ist – das Verfahren gleicht eher "Versuch und Irrtum": Man gibt sich für a und b alle möglichen Kombinationen von ganzen Zahlen vor und berechnet a2 + b2. Ist dies eine Quadratzahl, hat man ein pythagoreisches Zahlentripel gefunden. Das zugehörige primitive pythagoreische Zahlentripel muss man erst mühsam bestimmen, indem man die Primfaktoren von a, b und c sucht.

Um die ersten – etwa 100 – primitiven pythagoreischen Zahlentripel zu finden, mag das Verfahren geeignet sein, nicht aber, wenn man beliebig viele sucht.

Explizite Berechnung der primitiven pythagoreischen Zahlentripel

Punkte mit rationalen Koordinaten auf dem Einheitskreis

Um die explizite Berechnung der pythagoreischen Zahlentripel vorzubereiten, wird ein Zusammenhang zwischen pythagoreischen Zahlentripeln und Punkten mit rationalen Koordinaten auf dem Einheitskreis hergestellt.

Abbildung 1 zeigt den Einheitskreis und ein rechtwinkliges Dreieck (hellblau, teilweise verdeckt, mit Seitenlängen a, b und c), dessen Kathete a parallel zur x-Achse verläuft und ein Eckpunkt im Ursprung liegt. Wird das Dreieck um den Faktor c gestaucht, entsteht ein rechtwinkliges Dreieck mit Hypothenuse 1 (orange eingezeichnet). Das heißt ein Eckpunkt liegt auf dem Einheitskreis (rot eingezeichnet) und besitzt die Koordinaten (a/c, b/c). Diese Tatsache ist noch nicht bemerkenswert, denn diese Konstruktion kann mit jedem rechtwinkligen Dreieck durchgeführt werden (je nach Länge von c muss eine Stauchung oder Streckung durchgeführt werden).

Bemerkenswert ist diese Vorgehensweise erst, wenn (a, b, c) ein pythagoreisches Zahlentripel bilden. Denn jetzt sind a, b, c natürliche Zahlen und somit sind beide Koordinaten a/c und b/c des Punktes auf dem Einheitskreis rationale Zahlen.

Abbildung 1: Der Einheitskreis und ein rechtwinkliges Dreieck mit Seitenlängen a, b und c (hellblau). Wird das dazu ähnliche Dreieck betrachtet, das um den Faktor c gestaucht wurde (orange), so liegt ein Eckpunkt auf dem Einheitskreis.Abbildung 1: Der Einheitskreis und ein rechtwinkliges Dreieck mit Seitenlängen a, b und c (hellblau). Wird das dazu ähnliche Dreieck betrachtet, das um den Faktor c gestaucht wurde (orange), so liegt ein Eckpunkt auf dem Einheitskreis.

Gegenbeispiel:

Geht man vom rechtwinkligen, gleichschenkligen Dreieck aus (also a = b, c = a · √2), so erhält man mit obiger Vorgehensweise einen Punkt auf dem Einheitskreis mit irrationalen Koordinaten, nämlich den Punkt (1/√2, 1/√2); dies ist der Schnittpunkt des Einheitskreises mit der Winkelhalbierenden. Hierbei spielt es keine Rolle, ob a ganzzahlig ist oder nicht.

♦ ♦ ♦

Dieses Gegenbeispiel soll zeigen, dass Punkte mit zwei rationalen Koordinaten auf dem Einheitskreis eher die Ausnahme und nicht der typische Fall sind.

Man kann die in Abbildung 1 gezeigte Konstruktion auch folgendermaßen interpretieren:

Jedes pythagoreische Zahlentripel erzeugt einen Punkt auf dem Einheitskreis mit rationalen Koordinaten. Ähnliche pythagoreische Zahlentripel erzeugen allerdings den identischen Punkt auf dem Einheitskreis (die zugehörigen Dreiecke gehen ja nur durch Streckung auseinander hervor). Dagegen erzeugen unterschiedliche primitive pythagoreische Zahlentripel unterschiedliche Punkte auf dem Einheitskreis. Man kann daher jedem primitiven pythagoreischen Zahlentripel eindeutig einen Punkt auf dem Einheitskreis mit rationalen Koordinaten zuordnen.

Umgekehrt kann man auch zu einem Punkt (p, q) auf dem Einheitskreis mit rationalen Koordinaten ein primitives pythagoreisches Zahlentripel finden. Denn dass der Punkt auf dem Einheitskreis liegt, bedeutet:

p2 + q2 = 1.

Und dass p und q rational sind bedeutet, dass sich beide Zahlen als Quotient von ganzen Zahlen darstellen lassen:

p= i/j, q = k/l.

Man multipliziert jetzt diese Brüche so lange mit ganzen Zahlen, bis beide Zahlen ganzzahlig, aber noch teilerfremd sind; der dazu benötigte Faktor entspricht dem Streckungsfaktor aus Abbildung 1.

Beispiel:

Der Punkt (p, q) = (5/13, 12/13) liegt auf dem Einheitskreis, da

p2 + q2 = (25 + 144) / 169 = 1.

Der Streckungsfaktor ist hier gleich 13 und führt auf das primitive pythagoreische Zahlentripel (5, 12, 13).

♦ ♦ ♦

Interessant ist jetzt die Frage, ob man alle primitiven pythagoreischen Zahlentripel dadurch erhält, indem man alle Punkte auf dem Einheitskreis mit rationalen Koordinaten bestimmt und das zugehörige primitive pythagoreische Zahlentripel berechnet.

Heuristische Überlegung: Auffinden einer Formel zur expliziten Berechnung der primitiven pythagoreischen Zahlentripel

Um einen Hinweis zu bekommen, wie eine Formel aussehen könnte, die alle primitiven pythagoreischen Zahlentripel berechnet, geht man zunächst von einem pythagoreischen Zahlentripel (a, b, c) aus, das einen Punkt (a/c, b/c) auf dem Einheitskreis mit rationalen Koordinaten erzeugt. Der Einfachheit halber setzt man

a/c = p und b/c = q

und es gilt Gleichung 1 in Abbildung 2. Gleichung 1 kann nun zu Gleichung 3 umgeformt werden. Da p und q rationale Zahlen sind, gilt dies auch für die linke und rechte Seite von Gleichung 3. Dann gibt es aber teilerfremde natürliche Zahlen i und j, durch die sich die linke und rechte Seite von Gleichung 3 ausdrücken lassen (siehe Gleichung 5).

Gleichung 5 kann man jetzt wie 2 Gleichungen mit den 2 Unbekannten p und q lesen, die nach p und q aufgelöst werden. Man erhält Gleichung 6.

Abbildung 2: Heuristische Überlegung für die Herleitung einer Formel zur Berechnung von primitiven pythagoreischen Zahlentripeln.Abbildung 2: Heuristische Überlegung für die Herleitung einer Formel zur Berechnung von primitiven pythagoreischen Zahlentripeln.

Aufgabe:

Führen Sie die Umformungen durch, die von Gleichung 5 zu Gleichung 6 führen.

♦ ♦ ♦

Man mache sich an dieser Stelle nochmal die bisherige Vorgehensweise das eigentliche Ziel der Untersuchung klar:

Streng genommen ist mit diesen Überlegungen noch nichts gewonnen; die Hoffnung ist aber:

  1. Dass sich der unbekannte Streckungsfaktor r in Gleichung 9 leicht berechnen lässt.
  2. Dass man ein Kriterium angeben kann, für welche Zahlen i und j ein primitives pythagoreisches Zahlentripel entsteht.
  3. Dass man für eine gewisse Menge von Zahlen i und j alle primitiven pythagoreischen Zahlentripel berechnen kann.

Im folgenden Abschnitt wird gezeigt, dass diese heuristischen Überlegungen tatsächlich zu den gesuchten Aussagen führen.

Die Bedeutung des unbekannten Streckungsfaktors r ist an dieser Stelle noch schwer zu verstehen; sobald die entsprechenden Sätze formuliert sind, wird seine Bedeutung klarer werden. Es wird dann auch eine Aufgabe formuliert, die zeigen wird, dass es in Formel 9 zwei Möglichkeiten für die Wahl von r gibt, die zu den gesuchten Sätzen führen.

Formel zur expliziten Berechnung der primitiven pythagoreischen Zahlentripel und Formulierung der Sätze

Jetzt werden die Sätze formuliert, die sich aus obigen Überlegungen – mit einigen zusätzlichen Argumenten – herleiten lassen.

Satz 1 (Berechnung von pythagoreischen Zahlentripeln): Sind j und i natürliche Zahlen mit j > i, i = 1, 2, ..., dann definiert

a = j2 - i2, b = 2ji, c = j2 + i2

ein pythagoreisches Zahlentripel.

Beachte: Der Satz 1 behauptet nicht, dass durch die Formeln ein primitives pythagoreisches Zahlentripel erzeugt wird. Diese Verschärfung liefert der folgende Satz.

Satz 2 (Berechnung von primitiven pythagoreischen Zahlentripeln): Sind j und i natürliche Zahlen mit

dann definiert

a = j2 - i2, b = 2ji, c = j2 + i2

ein primitives pythagoreisches Zahlentripel.

Beachte: Mit Satz 2 ist immer noch nicht gesagt, dass man über die Formeln tatsächlich alle primitiven pythagoreischen Zahlentripel finden kann. Diese Aussage macht erst der folgende Satz.

Satz 3 (Berechnung aller primitiven pythagoreischen Zahlentripel): Ist (a, b, c) ein primitives pythagoreisches Zahlentripel, dann gibt es natürliche Zahlen j und i, so dass sich a, b, c durch folgende Formeln berechnen lassen:

a = j2 - i2, b = 2ji, c = j2 + i2.

Dabei sind j und i natürliche Zahlen mit

Beweis von Satz 1: Sind i und j natürliche Zahlen, dann sind auch i*j, i2, j2, j2 - i2 und j2 + i2 natürliche Zahlen; ein negative Zahl kann nicht entstehen, da j > i. Somit sind a, b und c natürliche Zahlen.

Es ist nur noch zu zeigen, dass sie den Satz des Pythagoras erfüllen:

a2 + b2 = (j2 - i2)2 + (2ji)2 = j4 + i4 - 2i2j2 + (2ji)2 = j4 + i4 + 2i2j2 = (j2 + i2)2 = c2.

♦ ♦ ♦

Man beachte: für den Beweis, dass a, b und c den Satz des Pythagoras erfüllen, wurde nicht verwendet, dass i und j natürliche Zahlen sind. Das heißt man kann in die Formeln zur Berechnung von a, b und c beliebige Zahlen i und j einsetzen und erhält immer die Seitenlängen eines rechtwinkligen Dreiecks - ganzzahlig werden die Seitenlängen mit Sicherheit, wenn ganzzahlige i und j verwendet werden.

Satz 1 war nach den Vorüberlegungen oben der ganz einfache Teil. Bevor die beiden schwierigen Sätze bewiesen werden, sollen einige Eigenschaften der Zahlen (a, b, c) und i, j untersucht werden, wenn sie über obige Formeln zusammenhängen.

Die Gitter-Koordinaten eines pythagoreischen Zahlentripels

Die Gleichungen 4 und 5 in Abbildung 2 wirken eher etwas befremdlich – im Folgenden wird ein neues Koordinatensystem eingeführt, das helfen soll, diese Gleichungen besser zu verstehen.

Zunächst soll eine andere Möglichkeit gezeigt werden, wie man Punkte mit rationalen Koordinaten auf dem Einheitskreis findet; die Vorgehensweise oben wirkte eher wie ein Zirkelschluss, da man von einem pythagoreischen Zahlentripel ausgeht, um eine Formel zu finden, wie es berechnet wird.

In Abbildung 3 kann man leicht erkennen, dass die linke Seite von Gleichung 5 mit der Steigung m der eingezeichneten Gerade (blau) übereinstimmt. Man kann sich nun überlegen: Geht man immer vom Punkt (-1|0) aus (rot eingezeichnet in Abbildung 3) und bildet Geraden mit rationaler Steigung, so erhält man als Schnittpunkt zwischen der Gerade und dem Einheitskreis einen Punkt mit rationalen Koordinaten (in Abbildung 3 der Punkt (p, q)). Setzt man die Steigung m gleich dem Quotienten i/j, mit natürlichen Zahlen i und j, so erhält man auch Gleichung 5.

Abbildung 3: Hat die Gerade durch den Punkt (-1|0) eine rationale Steigung m, so schneidet sie den Einheitskreis in einem Punkt mit rationalen Koordinaten.Abbildung 3: Hat die Gerade durch den Punkt (-1|0) eine rationale Steigung m, so schneidet sie den Einheitskreis in einem Punkt mit rationalen Koordinaten.

Aufgabe:

Wie kann man in Abbildung 3 die Gleichung (1 - p)/q = m erkennen?

♦ ♦ ♦

Möchte man jetzt alle möglichen rationalen Steigungen m bilden, so lässt man die Zahlen i und j durch alle natürlichen Zahlen laufen. (Hilfreich ist dies, wenn beim Durchlaufen aller rationalen Steigungen m auch alle Punkte auf dem Einheitskreis mit rationalen Koordinaten erzeugt werden.) Dabei kann aber i < j gesetzt werden, da für i > j die Steigung m größer wird als 1 und die Gerade den Einheitskreis nicht mehr im ersten Quadraten schneidet. Auch der Schnittpunkt mit m = 1 ist irrelevant, da er zu keinem pythagoreischen Zahlentripel führt.

Die Zahlenpaare (j, i) in der zweidimensionalen Ebene kann man als Punkte eines Gitters auffassen. Und die oben formulierten Sätze zeigen, wie wichtig der Zusammenhang zwischen diesen Gitter-Punkten und den pythagoreischen Zahlentripeln ist.

Abbildung 4 zeigt ein neues Koordinatensystem mit den Achsen j und i, in dem die relevanten Gitter-Punkte (j, i) eingezeichnet sind; sie werden zu einer Menge G zusammengefasst (Abbildung 4 rechts). Die Wahl der Achsen spielt eigentlich keine Rolle; später wird aber das Gitter geometrisch interpretiert, was leichter fallen wird, wenn j nach rechts angetragen wird.

Abbildung 4: Gitter G für die möglichen Kombinationen von natürlichen Zahlen i und j. Die grau eingezeichneten Punkte auf der Winkelhalbierenden führen nicht zu pythagoreischen Zahlentripeln. Rot sind alle Kombinationen mit j &gt; i eingezeichnet.Abbildung 4: Gitter G für die möglichen Kombinationen von natürlichen Zahlen i und j. Die grau eingezeichneten Punkte auf der Winkelhalbierenden führen nicht zu pythagoreischen Zahlentripeln. Rot sind alle Kombinationen mit j > i eingezeichnet.

Setzt man nun die im Abschnitt Formel zur expliziten Berechnung der primitiven pythagoreischen Zahlentripel formulierten Sätze als gegeben voraus, so sind in Abbildung 4 zu viele Gitter-Punkte eingezeichnet.

Zum Einen kann man alle Gitter-Punkte, die auf einer Ursprungs-Geraden liegen, durch einen Gitter-Punkt ersetzen. In Abbildung 2, Gleichung 5, wird der Quotient i/j gebildet, um eine rationale Zahl zu erzeugen – es reicht daher teilerfremde Kombinationen von i und j zu betrachten. Zum Beispiel besitzen (j, i) = (5, 3), (10, 6), (15, 9) den identischen Wert für i/j = 3/5 und erzeugen in Abbildung 3 jeweils die identische Steigung m = 3/5 und somit den identischen Punkt auf dem Einheitskreis.

Zum Anderen besagt Satz 2, dass man für primitive pythagoreische Zahlentripel eine ungerade und eine gerade Zahl für i und j kombinieren muss. Diese Eigenschaft ist aus den bisherigen heuristischen Überlegungen noch nicht verständlich – sie wird später noch untersucht.

Beachtet man diese Einschränkungen, kann nach den Sätzen jedem primitiven pythagoreischen Zahlentripel (a, b, c) ein Gitter-Punkt (j, i) zugeordnet werden. Diese Zahlen j und i werden im Folgenden als die Gitter-Koordinaten eines primitiven pythagoreischen Zahlentripels bezeichnet.

Abbildung 5: Darstellung der Gitter-Punkte bis zu j=50: primitive pythagoreische Zahlentripel sind rot gekennzeichnet, andere blau. Punkte auf der Winkelhalbierenden sind grau.Abbildung 5: Darstellung der Gitter-Punkte bis zu j = 50: primitive pythagoreische Zahlentripel sind rot gekennzeichnet, andere blau. Punkte auf der Winkelhalbierenden sind grau.

In Abbildung 5 ist das Gitter bis zu j = 50 aufgetragen (j nach rechts, i nach oben); zur besseren Orientierung sind wieder die (irrelevanten) Punkte auf der Winkelhalbierenden i = j dargestellt (grau). Die Gitter-Punkte, die zu einem primitiven pythagoreischen Zahlentripel gehören, sind rot dargestellt, andere Gitter-Punkte sind blau.

Man erhält zum Beispiel primitive pythagoreische Zahlentripel in den Spezialfällen:

Abbildung 6 zeigt die Formeln, mit denen zwischen (a, b, c) und (i, j) umgerechnet werden kann.

Abbildung 6: Formeln zum Umrechnen zwischen Gitter-Koordinaten und den Seitenlängen eines primitiven pythagoreischen Zahlentripels.Abbildung 6: Formeln zum Umrechnen zwischen Gitter-Koordinaten und den Seitenlängen eines primitiven pythagoreischen Zahlentripels.

Aufgabe:

Leiten Sie aus Gleichung 1 die beiden Darstellungen für i und j nach Gleichung 2 und 3 her.

♦ ♦ ♦

Man erkennt an den Gleichungen 2 (oder 3), dass sowohl die primitiven pythagoreischen Zahlentripel als auch die Gitter-Punkte nur ganz spezielle Werte erlauben, da man sonst in Gleichung 2 (oder 3) irrationale Zahlen erhält. Diese speziellen Eigenschaften sollen nun näher untersucht werden.

Eigenschaften der pythagoreischen Zahlentripel

Die Formeln aus den Sätzen oben werden nun verwendet, um pythagoreische Zahlentripel zu berechnen; für die folgende Tabelle wurden j-Werte von 2 bis zu 8 verwendet und i läuft von 1 bis j - 1. Anstelle von TRUE steht in der letzten Spalte primitiv = 1 und anstelle von FALSE steht primitiv = 0.

j i a b c primitiv
2 1 3 4 5 1
3 1 8 6 10 0
3 2 5 12 13 1
4 1 15 8 17 1
4 2 12 16 20 0
4 3 7 24 25 1
5 1 24 10 26 0
5 2 21 20 29 1
5 3 16 30 34 0
5 4 9 40 41 1
6 1 35 12 37 1
6 2 32 24 40 0
6 3 27 36 45 0
6 4 20 48 52 0
6 5 11 60 61 1
7 1 48 14 50 0
7 2 45 28 53 1
7 3 40 42 58 0
7 4 33 56 65 1
7 5 24 70 74 0
7 6 13 84 85 1
8 1 63 16 65 1
8 2 60 32 68 0
8 3 55 48 73 1
8 4 48 64 80 0
8 5 39 80 89 1
8 6 28 96 100 0
8 7 15 112 113 1

Aus der Tabelle lassen sich sofort einige Eigenschaften ablesen, die teilweise an den Formeln schwieriger nachzuvollziehen sind:

  1. Es fehlen einige pythagoreische Zahlentripel wie zum Beispiel (4, 3, 5). In den Formeln zur Berechnung von a, b, c ist aber b = 2ij, also muss b eine gerade Zahl sein. Man sollte die Formeln besser so lesen: in Gitter-Punkt (i, j) erzeugt stets 2 pythagoreische Zahlentripel, die durch Vertauschung von a und b entstehen. Also erzeugt zum Beispiel j = 2, i = 1 die beiden Tripel (3, 4, 5) und (4, 3, 5).
  2. Regelmäßigkeiten bezüglich i und j:
    • Die Tabelle bestätigt folgende Behauptung von Satz 2: Sind i und j beide gerade oder beide ungerade, erhält man nicht-primitive pythagoreische Zahlentripel.
    • Ebenso: Haben i und j einen gemeinsamen Teiler, erhält man ein nicht-primitives pythagoreisches Zahlentripel (siehe zum Beispiel j = 6 und i = 3; die Zahlen sind zwar gerade/ungerade, haben aber den gemeinsamen Teiler 3). Auch hier bestätigt sich Satz 2.
  3. Regelmäßigkeiten bezüglich a und b:
    • Sind beide gerade, haben sie einen gemeinsamen Teiler, also ist das Zahlentripel nicht-primitiv.
    • Bei primitiven pythagoreischen Zahlentripel ist eine Zahl gerade und die andere ungerade.
    • Dass beide ungerade Zahlen sind, kann nicht vorkommen, da b gerade sein muss.
  4. Regelmäßigkeiten bezüglich a und c:
    • in primitiven pythagoreischen Zahlentripeln ist c stets ungerade, ebenso a (Letzteres wurde schon festgestellt).
    • Dagegen gibt es in nicht-primitiven pythagoreischen Zahlentripeln keine offensichtliche Einschränkung für c (Beispiele: (6, 8, 10) und (27, 36, 45)).

Diese Beobachtungen bestätigen allesamt die Behauptungen der Sätze 2 und 3, für einen Beweis reichen sie noch nicht aus.

Einen großen Schritt näher zu diesem Ziel führen folgende Überlegungen:

Abbildung 7: Skizze zum vierten Beweis des Satzes des Pythagoras. Diese Skizze wird jetzt verwendet, um den Zusammenhang zwischen den Seitenlängen a, b, c und den Gitter-Koordinaten (j, i) herzustellen.Abbildung 7: Skizze zum vierten Beweis des Satzes des Pythagoras. Diese Skizze wird jetzt verwendet, um den Zusammenhang zwischen den Seitenlängen a, b, c und den Gitter-Koordinaten (j, i) herzustellen.

Die folgende Tabelle zeigt pythagoreische Zahlentripeln für alle Gitter-Koordinaten bis zu j = 8. Beachtenswert sind die Größen, die zusätzlich zu den Seitenlängen berechnet werden. Anstelle von TRUE steht in der 6. Spalte primitiv = 1 und anstelle von FALSE steht primitiv = 0. Auf den ersten Blick leicht zu übersehen sind Eigenschaften von b und c, wenn sie durch 4 geteilt werden. In den mit b mod 4 und c mod 4 beschrifteten Spalten wird der Rest von b beziehungsweise c bei Division durch 4 angegeben.

j i a b c isPrimitive b mod 4 c mod 4 b2 b2 / 4 (c + a) / 2 (c + a) / 2
2 1 3 4 5 1 0 1 16 4 4 1
3 1 8 6 10 0 2 2 36 9 9 1
3 2 5 12 13 1 0 1 144 36 9 4
4 1 15 8 17 1 0 1 64 16 16 1
4 2 12 16 20 0 0 0 256 64 16 4
4 3 7 24 25 1 0 1 576 144 16 9
5 1 24 10 26 0 2 2 100 25 25 1
5 2 21 20 29 1 0 1 400 100 25 4
5 3 16 30 34 0 2 2 900 225 25 9
5 4 9 40 41 1 0 1 1600 400 25 16
6 1 35 12 37 1 0 1 144 36 36 1
6 2 32 24 40 0 0 0 576 144 36 4
6 3 27 36 45 0 0 1 1296 324 36 9
6 4 20 48 52 0 0 0 2304 576 36 16
6 5 11 60 61 1 0 1 3600 900 36 25
7 1 48 14 50 0 2 2 196 49 49 1
7 2 45 28 53 1 0 1 784 196 49 4
7 3 40 42 58 0 2 2 1764 441 49 9
7 4 33 56 65 1 0 1 3136 784 49 16
7 5 24 70 74 0 2 2 4900 1225 49 25
7 6 13 84 85 1 0 1 7056 1764 49 36
8 1 63 16 65 1 0 1 256 64 64 1
8 2 60 32 68 0 0 0 1024 256 64 4
8 3 55 48 73 1 0 1 2304 576 64 9
8 4 48 64 80 0 0 0 4096 1024 64 16
8 5 39 80 89 1 0 1 6400 1600 64 25
8 6 28 96 100 0 0 0 9216 2304 64 36
8 7 15 112 113 1 0 1 12544 3136 64 49

Die folgende Tabelle zeigt nur die primitiven pythagoreischen Zahlentripeln; jetzt aber bis zur Gitter-Koordinate j = 11.

j i a b c isPrim b mod 4 c mod 4 b2 b2 / 4 (c + a) / 2 (c + a) / 2
2 1 3 4 5 1 0 1 16 4 4 1
3 2 5 12 13 1 0 1 144 36 9 4
4 1 15 8 17 1 0 1 64 16 16 1
4 3 7 24 25 1 0 1 576 144 16 9
5 2 21 20 29 1 0 1 400 100 25 4
5 4 9 40 41 1 0 1 1600 400 25 16
6 1 35 12 37 1 0 1 144 36 36 1
6 5 11 60 61 1 0 1 3600 900 36 25
7 2 45 28 53 1 0 1 784 196 49 4
7 4 33 56 65 1 0 1 3136 784 49 16
7 6 13 84 85 1 0 1 7056 1764 49 36
8 1 63 16 65 1 0 1 256 64 64 1
8 3 55 48 73 1 0 1 2304 576 64 9
8 5 39 80 89 1 0 1 6400 1600 64 25
8 7 15 112 113 1 0 1 12544 3136 64 49
9 2 77 36 85 1 0 1 1296 324 81 4
9 4 65 72 97 1 0 1 5184 1296 81 16
9 8 17 144 145 1 0 1 20736 5184 81 64
10 1 99 20 101 1 0 1 400 100 100 1
10 3 91 60 109 1 0 1 3600 900 100 9
10 7 51 140 149 1 0 1 19600 4900 100 49
10 9 19 180 181 1 0 1 32400 8100 100 81
11 2 117 44 125 1 0 1 1936 484 121 4
11 4 105 88 137 1 0 1 7744 1936 121 16
11 6 85 132 157 1 0 1 17424 4356 121 36
11 8 57 176 185 1 0 1 30976 7744 121 64
11 10 21 220 221 1 0 1 48400 12100 121 100

Man erkennt an den Tabellen:

Formulierung der Hilfssätze

Diese Beobachtungen aus den Tabellen oben werden nun als Hilfssätze formuliert, mit deren Hilfe später Satz 2 und Satz 3 bewiesen werden.

Hilfssatz 1: Für ein primitives pythagoreisches Zahlentripel (a, b, c) gilt:

  1. Eine der Katheten ist eine gerade Zahl und eine ist eine ungerade Zahl (die Kombinationen gerade/gerade und ungerade/ungerade können nicht vorkommen).
  2. Die Hypothenuse c ist ungerade.
  3. Die geradzahlige Kathete ist sogar durch 4 teilbar.

♦ ♦ ♦

Da jetzt bewiesen ist, dass in einem primitiven pythagoreischen Zahlentripel eine Kathete ungerade und eine Kathete gerade (sogar durch 4 teilbar) ist, wird folgende Konvention verwendet:

Hilfssatz 2: Für ein primitives pythagoreisches Zahlentripel (a, b, c) gilt: Die Zahlen (c + a) / 2 und (c - a) / 2 sind teilerfremd.

Hilfssatz 3: Kann eine Quadratzahl q als das Produkt von zwei teilerfremden Zahlen n und m geschrieben werden, q = n · m, dann sind n und m Quadratzahlen.

Beweis der Hilfssätze

Beweis von Hilfssatz 1

Vorausgesetzt ist, dass (a, b, c) ein primitives pythagoreisches Zahlentripel ist, also dass die drei Zahlen a, b und c teilerfremd sind und dass

a2 + b2 = c2 gilt.

Zum ersten Teil der Behauptung: sie wird mit einem Widerspruchs-Beweis gezeigt.

Besonders einfach ist der Fall, wenn a gerade und b gerade. Denn dann sind auch a2 und b2 gerade und somit auch ihre Summe c2. Wenn aber c2 gerade ist und c ganzzahlig, dann muss c gerade sein. Aber dann sind alle drei Zahlen a, b und c gerade, was der Voraussetzung teilerfremd widerspricht.

Schwieriger ist der Fall, wenn a und b ungerade sind. Jetzt sind a2 und b2 ungerade; ihre Summe c2 ist dann gerade. Versucht man jetzt wie im einfachen Fall oben zu argumentieren, kommt man zu keinem Widerspruch.

Aber die Teilbarkeit durch 4 liefert den entscheidenden Hinweis: Wenn c2 gerade ist, muss der Primfaktor 2 mindestens zweimal enthalten sein, somit ist c2 durch 4 teilbar, oder:

c2 mod 4 = 0

Nach der Voraussetzung muss dann auch

a2 mod 4 + b2 mod 4 = 0

Da a2 und b2 beide ungerade sind, muss bei Division durch 4 eine Zahl den Rest 1 ergeben, die andere Zahl den Rest 3. Also zum Beispiel:

a2 mod 4 = 1 und b2 mod 4 = 3 (Vertauschung von a und b liefert nichts Neues).

Da a und b ungerade sind, gibt es geeignete natürliche Zahlen m und n: a = 2m + 1, b = 2n + 1:

Aber das Quadrat einer ungeraden Zahl (hier b) kann nicht b2 mod 4 = 3 erfüllen. Denn in:

(2n + 1)2 = 4n2 + 4n + 1

sind die ersten beiden Summanden durch 4 teilbar und somit gilt:

(2n + 1)2 mod 4 = 1.

Die Annahme, dass a und b ungerade sind, führt somit auch zu einem Widerspruch.

Zum zweiten Teil der Behauptung: "Die Hypothenuse c ist ungerade."

Nach dem ersten Teil ist eine Kathete gerade und eine Kathete ungerade. Dann ist die Summe a2 + b2 ungerade. Da diese Summe mit c2 übereinstimmt, muss c eine ungerade Zahl sein.

Zum dritten Teil der Behauptung: "Die geradzahlige Kathete ist sogar durch 4 teilbar."

Die geradzahlige Kathete werde mit b bezeichnet.

Inzwischen ist bewiesen, dass a und c ungerade sind; sie können also mit geeigneten natürlichen Zahlen n und m dargestellt werden:

a = 2n + 1, c = 2m + 1.

a2 = (2n + 1)2 = 4n2 + 4n + 1 = 4(n2 + n) + 1

Egal ob n gerade oder ungerade ist, die Summe n2 + n ist immer gerade. Daraus folgt aber:

a2 mod 8 = 1.

Dasselbe gilt auch für c2.

Betrachtet man nun den "Satz des Pythagoras modulo 8", so gilt:

b2 mod 8 = (c2 - a2) mod 8 = 0.

Folglich ist b2 durch 8 teilbar. Da in einer Quadratzahl jeder Primfaktor mit gerader Potenz vorkommen muss, ist b2 durch 16 teilbar und somit ist b durch 4 teilbar.

Beweis von Hilfssatz 2

Da a und c ungerade Zahlen sind, sind c + a und c - a gerade Zahlen, folglich sind auch die Brüche (c + a) / 2 und (c - a) / 2 ganze Zahlen. Die Notation ist aber einfacher, wenn c + a und c - a untersucht werden. Anstelle von Hilfssatz 2 wird daher gezeigt:

Für das primitive pythagoreische Zahlentripel (a, b, c) besitzen die Zahlen c + a und c - a nur 2 als gemeinsamen Teiler; kürzt man ihn, sind sie teilerfremd.

Angenommen es gibt einen weiteren gemeinsamen Faktor p, dann gibt es geeignete natürliche Zahlen n und m mit:

np = c + a und mp = c - a.

Addiert man beide Gleichungen, so gilt:

(n + m)p = 2c.

Subtrahiert man die Gleichungen voneinander, so gilt:

(n - m)p = 2a.

Die Gleichungen besagen dann aber, dass entweder p = 2 (was aber ausgeschlossen wurde) oder dass p sowohl Teiler von c und a ist. Auch dies widerspricht der Voraussetzung, somit gilt Hilfssatz 2.

Beweis von Hilfssatz 3

Es ist q eine Quadratzahl, die als Produkt zweier Zahlen n und m geschrieben werden kann, wobei n und m teilerfremd sind.

Zerlegt man die Quadratzahl q in Primfaktoren, so muss jeder Primfaktor eine gerade Potenz besitzen (sonst hat q eine irrationale Wurzel). Diese Zerlegung ist eindeutig (wenn man den irrelevanten Faktor 1 nicht berücksichtigt). Werden jetzt diese Primfaktoren auf die Faktoren n und m verteilt, muss jede Potenz eines Primfaktors als Ganzes entweder in n oder m enthalten sein. Andernfalls wären n und m nicht teilerfremd.

Aber dann enthalten n und m alle ihre Primfaktoren mit geraden Potenzen und sind somit Quadratzahlen.

♦ ♦ ♦

Beispiel:

Die Zahl q = 900 besitzt die Primfaktor-Zerlegung

q = 22 · 32 · 52.

Dann können teilerfremde n und m etwa lauten:

n = 22, m = 32 · 52,

aber nicht:

n = 2 · 3, m = 2 · 3 · 52.

Beweis der Sätze 2 und 3

Die oben formulierten und bewiesenen Hilfssätze sind "jeder für sich genommen" wenig aussagekräftig, da sie nur spezielle Eigenschaften von primitiven pythagoreischen Zahlentripeln beschreiben. Im folgenden Abschnitt wird aber gezeigt, dass sie in die Beweise der Sätze 2 und 3 einfließen und somit zum eigentlichen Ziel dieses Kapitels führen.

Beweis von Satz 2

Satz 2 (Berechnung von primitiven pythagoreischen Zahlentripeln): Sind j und i natürliche Zahlen mit

dann definiert

a = j2 - i2, b = 2ji, c = j2 + i2

ein primitives pythagoreisches Zahlentripel.

Es ist offensichtlich, dass Satz eine Verschärfung von Satz 1 ist. Hier ist also noch zu zeigen, dass unter den gegebenen Voraussetzungen an j und i ein primitives pythagoreisches Zahlentripel entsteht; dass ein pythagoreisches Zahlentripel entsteht, ist schon mit Satz 1 gezeigt. An den Tabellen oben kann man sofort die Gegenbeispiele ablesen, die zeigen, dass eine Verletzung der Voraussetzungen an j und i zu einem nicht-primitiven pythagoreischen Zahlentripel führt.

Es ist zu zeigen, dass die drei oben definierten Zahlen a, b und c teilerfremd sind. Man untersucht zunächst b und c:

Der Beweis erfolgt durch Widerspruch: man nimmt an, dass es eine Zahl p gibt, die sowohl Teiler von b als auch c ist.

Da b das Produkt der 2 und der teilerfremden Zahlen i und j ist, gibt es drei Möglichkeiten:

  1. p = 2,
  2. p ist Teiler von i,
  3. p ist Teiler von j.

Der erste Fall ist sofort auszuschließen, da c die Summe einer geraden und einer ungeraden Zahl ist und somit ungerade ist. Der zweite und dritte Fall beschreiben das identische Problem, weil b und c bezüglich i und j symmetrisch definiert sind; es reicht also, etwa den 2. Fall zu untersuchen.

Wenn p ein Teiler von i ist, dann ist p auch ein Teiler von i2. Da nach Voraussetzung (die Widerspruchs-Annahme) p ein Teiler von c ist, muss p ein Teiler von j2 sein. Aber dann ist p auch Teiler von j. Dies widerspricht aber der Annahme, dass i und j teilerfremd sind.

Somit ist gcd(b, c) = 1. Da aber gcd(a, b, c) = gcd(a, gcd(b, c)) = gcd(a, 1) = 1, sind alle drei Zahlen teilerfremd und (a, b, c) ist ein primitives pythagoreisches Zahlentripel. (Mit gcd wird der größte gemeinsame Teiler (greatest common divisor) bezeichnet.)

Beweis von Satz 3

Satz 3 (Berechnung aller primitiven pythagoreischen Zahlentripel): Ist (a, b, c) ein primitives pythagoreisches Zahlentripel, dann gibt es natürliche Zahlen j und i, so dass sich a, b, c durch folgende Formeln berechnen lassen:

a = j2 - i2, b = 2ji, c = j2 + i2.

Dabei sind j und i natürliche Zahlen mit

Beweis:

Nach Hilfssatz 1 ist eine Kathete ungeradzahlig und eine geradzahlig, Erstere wird mit a bezeichnet, Letztere mit b, wobei b sogar durch 4 teilbar ist. Die Gleichung

a2 + b2 = c2

wird dann umgeformt zu

b2 = c2 - a2 = (c + a) · (c - a).

In der letzten Darstellung sind beide Faktoren geradzahlig (da a und c ungerade); man kann daher die Gleichung durch 4 teilen und die Zahlen (c + a) / 2 und (c - a) / 2 sind nach Hilfssatz 3 (angewendet auf q = b2 / 4) teilerfremde Quadratzahlen.

Das heißt aber, dass es natürliche Zahlen j und i gibt mit folgenden Eigenschaften:

Löst man nun die beiden Gleichungen j = (c + a) / 2, i = (c - a) / 2 nach a und c auf (Summe und Differenz der Gleichungen bilden), erhält man

a = j2 - i2, c = j2 + i2.

♦ ♦ ♦

Man kann Satz 2 und 3 auch folgendermaßen lesen:

Satz 2 gibt die Bedingungen an die Gitter-Koordinaten j, i sowie die Formeln für (a, b, c) vor, nach denen sich primitive pythagoreische Zahlentripel berechnen lassen. Und Satz 3 besagt, dass es umgekehrt zu jedem primitiven pythagoreischen Zahlentripel (a, b, c) Koordinaten j, i mit den Bedingungen aus Satz 2 gibt. Das heißt aber, dass man jedes primitive pythagoreische Zahlentripel (a, b, c) erhält, wenn man in Satz 2 alle erlaubten Gitter-Koordinaten einsetzt. Setzt man nicht-erlaubte Gitter-Koordinaten in Satz 2 ein, erhält man nicht-primitive pythagoreische Zahlentripel.

Geometrische Interpretation von Satz 2 und 3

Bei den Beweisen von Satz 2 und 3 wurde nicht – wie eingangs versprochen – die geometrische Interpretation mitgeliefert. Sie soll jetzt nachgeholt werden, indem versucht wird die Abbildungen 3, 5 und 7 zusammenzuführen.

Bestimmen der Gitter-Koordinaten zu einem gegebenen rechtwinkligen Dreieck

Abbildung 8 zeigt (gelb) ein gegebenes rechtwinkliges Dreieck mit Seitenlängen a, b, c. Zu diesem Dreieck wird – nach der bekannten Konstruktion aus dem vierten Beweis des Satzes des Pythagoras (siehe Abbildung 7) – ein weiteres rechtwinkliges Dreieck mit Hypothenuse 2c und Höhe h gezeichnet.

Der linke Eckpunkt dieses Dreiecks ist grün eingezeichnet; von ihm aus wird eine Gerade (orange) durch den Eckpunkt gezeichnet, an dem sich der rechte Winkel befindet.

Der grüne Punkt links wird jetzt mit dem Koordinaten-Ursprung des Koordinatensystems für die Gitter-Punkte (j, i) identifiziert, wobei die Hypothenuse der Länge 2c parallel zur j-Achse verläuft.

Wenn die Gerade durch die beiden Eckpunkte (orange) zum ersten Mal einen Gitter-Punkt schneidet, hat man die Gitter-Koordinaten (j, i) zum pythagoreischen Zahlentripel (a', b', c') gefunden, wobei das Dreieck mit Seitenlängen a', b', c' zum Ausgangsdreieck ähnlich ist. Dies liegt daran, dass die beiden Dreiecke mit Katheten j und i beziehungsweise c + a und b ähnlich sind (siehe Gleichung rechts in Abbildung 8).

Nimmt man als Ausgangsdreieck ein primitives pythagoreisches Zahlentripel, erhält man sofort díe zugehörigen Gitter-Koordinaten.

Abbildung 8: Konstruktion der Gitter-Koordinaten i und j zu einem gegebenen rechtwinkligen Dreieck.Abbildung 8: Konstruktion der Gitter-Koordinaten i und j zu einem gegebenen rechtwinkligen Dreieck.

Sollte die Gerade keinen Gitter-Punkt schneiden, heißt dies, dass man von einem Dreieck ausgegangen ist, zu dem es kein ähnliches Dreieck mit ganzzahligen Seitenlängen gibt.

Konstruktion des primitiven pythagoreischen Zahlentripels zu gegebenen Gitter-Koordinaten

Etwas schwieriger ist der umgekehrte Fall: Die Gitter-Koordinaten (j, i) sind gegeben und es soll das rechtwinklige Dreieck zu den Seitenlängen (a, b, c) berechnet werden, so dass (a, b, c) ein primitives pythagoreisches Zahlentripel ist.

Die Vorgehensweise ist in Abbildung 9 dargestellt – die Konstruktion zu Abbildung 8 muss umgekehrt werden. Links ist ein Gitter-Punkt (rot) gegeben, der Ursprung im zugehörigen Koordinatensystem ist wieder grün gekennzeichnet. Der Gitter-Punkt definiert ein rechtwinkliges Dreieck mit Katheten j und i.

Dieses Dreieck wird um den Faktor 2j gestreckt; die Katheten-Längen sind jetzt 2j2 und 2ij. Ersteres entspricht nach den Umrechnungsformeln c + a, Letzteres entspricht b.

Das gestreckte Dreieck ist in Abbildung 9 rechts rot eingezeichnet; auch die Katheten-Längen eingetragen.

Die Länge der Hypothenuse des roten Dreiecks ist für das weitere Vorgehen irrelevant; wichtig ist, dass ihre Mittelsenkrechte eingetragen wird. Sie schneidet die Kathete (mit Länge 2j2 = c + a) im Punkt P, der die Kathete in zwei Teile der Länge c und a teilt.

Man kann jetzt das Dreieck mit den Seitenlängen a, b und c einzeichnen (gelb in Abbildung 9).

Abbildung 9: Konstruktion des primitiven pythagoreischen Zahlentripels zu gegebenen Gitter-Koordinaten.Abbildung 9: Konstruktion des primitiven pythagoreischen Zahlentripels zu gegebenen Gitter-Koordinaten.

Aufgabe:

Begründen Sie:

♦ ♦ ♦

Aufgabe:

In Satz 2 sind die Formeln für a, b, c und Bedingungen an die einzusetzenden Zahlen i und j formuliert, die zu primitiven pythagoreischen Zahlentripeln führen.

Zeigen Sie, dass auch die Formeln

a = (j2 - i2) / 2, b = ji, c = (j2 + i2) / 2

zu primitiven pythagoreischen Zahlentripeln führen. Allerdings muss man jetzt die Bedingungen an i und j abändern.

Wie lauten diese neuen Bedingungen an i und j?

♦ ♦ ♦

Anwendung: Approximation der Seiten eines beliebigen rechtwinkligen Dreiecks durch primitive pythagoreische Zahlentripel

Der eindeutige Zusammenhang zwischen den Gitter-Koordinaten (j, i) und dem primitiven pythagoreischen Zahlentripel (a, b, c) über die Formeln

a = j2 - i2, b = 2ji, c = j2 + i2

und den Bedingungen an (j, i)

erlaubt es, eine Fragestellung über rechtwinklige Dreiecke mit ganzzahligen Seitenlängen in eine Fragestellung über Gitter-Punkte zu übersetzen – oder umgekehrt.

Als konkretes Beispiel soll die Approximation eines rechtwinkligen Dreiecks betrachtet werden.

Aufgabenstellung:

Gegeben ist ein rechtwinkliges Dreieck, das nicht zu einem pythagoreischen Zahlentripel ähnlich ist. Hier wird das konkrete Dreieck mit Seitenlängen a' = 1, b' = √3, c' = 2 verwendet.

Gesucht ist eine Folge von primitiven pythagoreischen Zahlentripeln (an, bn, cn), die das gegebene Dreieck in folgendem Sinn approximieren: Das Seitenverhältnis an / bn soll sich a' / b' annähern.

♦ ♦ ♦

Es ist dann zwar keines der Dreiecke mit Seitenlängen an, bn, cn ähnlich zum gegebenen Dreieck; durch die Annäherung eines Seiten-Verhältnisses sollte dies aber in guter Näherung erfüllt sein. Im Sinne der Mathematik ist es wünschenswert, hier einen schärferen Begriff von Approximation festzulegen, um die Vorgehensweise zu zeigen, soll dieser etwas unscharfe Begriff ausreichen.

Die Aufgabenstellung wird nun in ein Problem über Gitter-Koordinaten umformuliert; dabei hilft Abbildung 3.

Das gegebene Dreieck wird zuerst so gestaucht, dass die Eckpunkte wie in Abbildung 3 auf dem Einheitskreis beziehungsweise im Ursprung liegen. Die Koordinaten (p, q) des Punktes auf dem Einheitskreis sind dann:

p = a' / c' = 1/2, q = b' / c' = √3 / 2

Die Gerade durch die Punkte (-1|0) und (p| q) = (0.5 | √3 / 2) besitzt die Steigung

m = q / (1 + p) = √3 / 3 = 1 / √3

und ist irrational. Damit ist aber auch klar, dass diese Gerade niemals einen Gitter-Punkt (aus Abbildung 4 oder 5) schneidet.

Wie man jetzt weiter vorgeht, ist in Abbildung 10 zu sehen. Dazu ist zuerst das Dreieck mit den Seitenlängen p, q und 1 mit dem Einheitskreis eingezeichnet. Der Punkt auf dem Einheitskreis hat eine irrationale y-Koordinate und definiert die Gerade mit Steigung 1 / √3 (blau eingezeichnet.)

Abbildung 10: Vorgehensweise zur Approximation eines gegebenen rechtwinkligen Dreiecks (Erklärung im Text).Abbildung 10: Vorgehensweise zur Approximation eines gegebenen rechtwinkligen Dreiecks (Erklärung im Text).

Man kann versuchen, eine Folge von Gitter-Punkten (jn, in) anzugeben, die der Gerade mit Steigung m möglichst nahe kommen. Rechnet man diese Gitter-Koordinaten in primitive pythagoreische Zahlentripel um, hat man die gesuchten approximierenden Dreiecke.

Man hat somit das Problem, ein gegebenes rechtwinkliges Dreieck durch primitive pythagoreische Zahlentripel zu approximieren, die nahezu ähnlich sind, auf das Problem reduziert, in Abbildung 5 diejenigen roten Punkte zu finden, die einer Gerade mit irrationaler Steigung möglichst nahe kommen.

Wie man Folge der Gitter-Punkte (jn, in) bestimmt, ist in Abbildung 10 rechts angedeutet: Man geht schrittweise in j-Richtung vor und findet oberhalb und unterhalb der Geraden zwei Gitter-Punkte (nur zu Beginn bei j = 2 gibt es nur einen Punkt unterhalb). Einer dieser beiden Punkte erzeugt mit Sicherheit kein primitives pythagoreisches Zahlentripel, da i und j nicht gleichzeitig gerade beziehungsweise ungerade sein dürfen. Bei j = 3 ist dies der Gitter-Punkt (3, 1) (er ist blau eingezeichnet). Für den anderen Punkt muss noch untersucht werden, ob j und i teilerfremd sind. Sind sie nicht teilerfremd, geht man zum nächsten j. In Abbildung 10 sind (3, 2) teilerfremd und der Gitter-Punkt ist rot eingezeichnet. Jetzt kann man den Abstand des Gitter-Punktes zur Geraden berechnen (in i-Richtung), also δ = |i - m*j|. (In Abbildung 10 rot eingezeichnet.)

Mit diesem δ geht man zum nächsten j und untersucht wieder, ob es einen geeigneten i-Wert gibt. Falls der zugehörige Gitter-Punkt näher an der Gerade liegt als δ, hat man eine besser Näherung gefunden und so weiter. In Abbildung 10 sind nur die drei Gitter-Punkte (2, 1), (3, 1) und (3, 2) eingezeichnet (für Letzteren ist auch das zugehörige δ eingetragen); man erkennt, dass von diesen drei Punkten (2, 1) den kleinsten Abstand zur Gerade hat.

Lässt man etwa j bis 100 laufen, erhält man für die beste Approximation:

j = 97, i = 56

a = 6273, b = 10864, c = 12545

Vergleicht man nun die Seiten-Verhältnisse der Dreiecke (mit 5 gültigen Stellen):

gegebenes Dreieck Approximation
a' / b' = 0.57735 a / b = 0.57741
a' / c' = 0.50000 a / c = 0.50004
b' / c' = 0.86603 b / c = 0.86600

Die folgende Tabelle zeigt auch die Zwischenergebnisse, also alle Näherung, die beginnend bei j = 2 berechnet wurden:

j i δ a b c
2 1 0.15470 3 4 5
7 4 0.04145 33 56 65
26 15 0.01111 451 780 901
97 56 0.00298 6273 10864 12545

R-Skripte

Eigenschaften der pythagoreischen Zahlentripeln

Das folgende Skript berechnet zu einem gegebenen Maximalwert max.j alle Kombinationen (j, i) mit j = 2, ..., max.j, i = 1, ..., j-1 die zugehörigen pythagoreischen Zahlentripel gemäß den Formeln

a = j2 - i2, b = 2ji, c = j2 + i2,

die oben in den Sätzen verwendet wurden. Zusätzlich wird ausgegeben, ob das pythagoreische Zahlentripel primitiv ist oder nicht. Da zur Berechnung eine Matrix verwendet wird, werden die logischen Werte automatisch konvertiert; TRUE = 1 und FALSE = 0 .

triplesExplicit <- function(max.j){
  stopifnot(is.numeric(max.j), max.j > 1)
  m <- c()
  for(j in (2:max.j)){
    for(i in (1:(j-1)) ){
      triple <- tripleExplicit(j, i)
      m <- rbind(m, c(j, i, triple, isPrimitive(triple)) )
    }
  }
  return(m)
}

m <- triplesExplicit(8)
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    2    1    3    4    5    1
# [2,]    3    1    8    6   10    0
# [3,]    3    2    5   12   13    1
# [4,]    4    1   15    8   17    1
# [5,]    4    2   12   16   20    0
# [6,]    4    3    7   24   25    1
# [7,]    5    1   24   10   26    0
# [8,]    5    2   21   20   29    1
# [9,]    5    3   16   30   34    0
# [10,]    5    4    9   40   41    1
# [11,]    6    1   35   12   37    1
# [12,]    6    2   32   24   40    0
# [13,]    6    3   27   36   45    0
# [14,]    6    4   20   48   52    0
# [15,]    6    5   11   60   61    1
# [16,]    7    1   48   14   50    0
# [17,]    7    2   45   28   53    1
# [18,]    7    3   40   42   58    0
# [19,]    7    4   33   56   65    1
# [20,]    7    5   24   70   74    0
# [21,]    7    6   13   84   85    1
# [22,]    8    1   63   16   65    1
# [23,]    8    2   60   32   68    0
# [24,]    8    3   55   48   73    1
# [25,]    8    4   48   64   80    0
# [26,]    8    5   39   80   89    1
# [27,]    8    6   28   96  100    0
# [28,]    8    7   15  112  113    1

Zur Erklärung:

Zeile 1: Die Funktion triplesExplicit() erhält als Eingabewert den Maximalwert max.j für j und berechnet als Rückgabewert eine Matrix.

Zeile 2: Bei unsinnigen Eingaben stopt die Funktion.

Zeile 3: Die Matrix wird vorbereitet. Bei den folgenden Schleifendurchläufen wird jeweils eine Zeile mit rbind() hinzugefügt

Zeile 4 und 5: Die Schleifen durchlaufen den relevanten Bereich mit: j = 2, ..., max.j, i = 1, ..., j-1.

Zeile 6: Die Funktion tripleExplicit() implementiert lediglich die Formeln zur Berechnung von (a, b, c); sie liefert dieses Zahlentripel als Vektor mit drei Komponenten.

Zeile 7: Pro Zeile werden 6 Zahlen hinzugefügt: die Koordinaten j und i, die drei Zahlen des Zahlentripels, die Zahl 0 oder 1, die angibt, ob das Zahlentripel primitiv ist oder nicht.

Zeile 13: Die Funktion triplesExplicit() wird mit max.j = 8 aufgerufen: Die Ausgabe war im Theorieteil als Tabelle dargestellt.

Aufgabe:

Implementieren Sie die Funktion tripleExplicit(). Sie erhält die beiden Zahlen i und j als Eingabewerte und gibt das zugehörige pythagoreische Zahlentripel als Vektor zurück.

♦ ♦ ♦

m <- triplesExplicitExtended(max.j = 8, isprimitive = FALSE)
m
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]  [,9] [,10] [,11] [,12]
# [1,]    2    1    3    4    5    1    0    1    16     4     4     1
# [2,]    3    1    8    6   10    0    2    2    36     9     9     1
# [3,]    3    2    5   12   13    1    0    1   144    36     9     4
# [4,]    4    1   15    8   17    1    0    1    64    16    16     1
# [5,]    4    2   12   16   20    0    0    0   256    64    16     4
# [6,]    4    3    7   24   25    1    0    1   576   144    16     9
# [7,]    5    1   24   10   26    0    2    2   100    25    25     1
# [8,]    5    2   21   20   29    1    0    1   400   100    25     4
# [9,]    5    3   16   30   34    0    2    2   900   225    25     9
# [10,]    5    4    9   40   41    1    0    1  1600   400    25    16
# [11,]    6    1   35   12   37    1    0    1   144    36    36     1
# [12,]    6    2   32   24   40    0    0    0   576   144    36     4
# [13,]    6    3   27   36   45    0    0    1  1296   324    36     9
# [14,]    6    4   20   48   52    0    0    0  2304   576    36    16
# [15,]    6    5   11   60   61    1    0    1  3600   900    36    25
# [16,]    7    1   48   14   50    0    2    2   196    49    49     1
# [17,]    7    2   45   28   53    1    0    1   784   196    49     4
# [18,]    7    3   40   42   58    0    2    2  1764   441    49     9
# [19,]    7    4   33   56   65    1    0    1  3136   784    49    16
# [20,]    7    5   24   70   74    0    2    2  4900  1225    49    25
# [21,]    7    6   13   84   85    1    0    1  7056  1764    49    36
# [22,]    8    1   63   16   65    1    0    1   256    64    64     1
# [23,]    8    2   60   32   68    0    0    0  1024   256    64     4
# [24,]    8    3   55   48   73    1    0    1  2304   576    64     9
# [25,]    8    4   48   64   80    0    0    0  4096  1024    64    16
# [26,]    8    5   39   80   89    1    0    1  6400  1600    64    25
# [27,]    8    6   28   96  100    0    0    0  9216  2304    64    36
# [28,]    8    7   15  112  113    1    0    1 12544  3136    64    49

m <- triplesExplicitExtended(max.j = 11, isprimitive = TRUE)
m
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]  [,9] [,10] [,11] [,12]
# [1,]    2    1    3    4    5    1    0    1    16     4     4     1
# [2,]    3    2    5   12   13    1    0    1   144    36     9     4
# [3,]    4    1   15    8   17    1    0    1    64    16    16     1
# [4,]    4    3    7   24   25    1    0    1   576   144    16     9
# [5,]    5    2   21   20   29    1    0    1   400   100    25     4
# [6,]    5    4    9   40   41    1    0    1  1600   400    25    16
# [7,]    6    1   35   12   37    1    0    1   144    36    36     1
# [8,]    6    5   11   60   61    1    0    1  3600   900    36    25
# [9,]    7    2   45   28   53    1    0    1   784   196    49     4
# [10,]    7    4   33   56   65    1    0    1  3136   784    49    16
# [11,]    7    6   13   84   85    1    0    1  7056  1764    49    36
# [12,]    8    1   63   16   65    1    0    1   256    64    64     1
# [13,]    8    3   55   48   73    1    0    1  2304   576    64     9
# [14,]    8    5   39   80   89    1    0    1  6400  1600    64    25
# [15,]    8    7   15  112  113    1    0    1 12544  3136    64    49
# [16,]    9    2   77   36   85    1    0    1  1296   324    81     4
# [17,]    9    4   65   72   97    1    0    1  5184  1296    81    16
# [18,]    9    8   17  144  145    1    0    1 20736  5184    81    64
# [19,]   10    1   99   20  101    1    0    1   400   100   100     1
# [20,]   10    3   91   60  109    1    0    1  3600   900   100     9
# [21,]   10    7   51  140  149    1    0    1 19600  4900   100    49
# [22,]   10    9   19  180  181    1    0    1 32400  8100   100    81
# [23,]   11    2  117   44  125    1    0    1  1936   484   121     4
# [24,]   11    4  105   88  137    1    0    1  7744  1936   121    16
# [25,]   11    6   85  132  157    1    0    1 17424  4356   121    36
# [26,]   11    8   57  176  185    1    0    1 30976  7744   121    64
# [27,]   11   10   21  220  221    1    0    1 48400 12100   121   100

Die Funktion triplesExplicitExtended() berechnet weitere Größen, die triplesExplicit() noch nicht berechnet hat (siehe Abschnitt Eigenschaften der pythagoreischen Zahlentripel).

Aufgabe:

Implementieren Sie die Funktion triplesExplicitExtended() .

Approximation eines rechtwinkligen Dreiecks durch primitive pythagoreische Zahlentripel

Oben wurde im entsprechenden Abschnitt der Algorithmus angedeutet, mit dem man ein gegebenes rechtwinkliges Dreieck mit beliebigen Seitenlängen durch primitive pythagoreische Zahlentripel approximieren kann, so dass sich die Seiten-Verhältnisse annähern.

Das folgende Skript zeigt eine mögliche Realisierung des Vorgehens.

Die Funktion next.i(j, x) untersucht zu gegebenem j und der Geradensteigung x die beiden der Gerade benachbarten Gitter-Punkte. Findet man keinen entsprechenden Wert für i, wird NA zurückgegeben; dies ist der Fall, wenn

Andernfalls wird der geeignete Wert von i zurückgegeben. Ob die Näherung besser ist als frühere Näherungen (kleineres δ), wird hier noch nicht untersucht.

Die Implementierung von next.i(j, x) lautet:

next.i <- function(j, x){
  stopifnot(j > 0, x < 1)
  i <- trunc(x * j)    # i ist der kleinere der beiden möglichen Werte
  if(isEven(j + i)){      # gleiche Parität: verwende i + 1
    i <- i + 1            # ungleiche Parität: verwende i
  }
  if(isCoprime(i, j)) return(i)
  else return(NA)
}

Die Funktion verwendet die beiden Funktionen isEven(n) und isCoprime(i, j) ; sie testen, ob eine Zahl gerade ist beziehungsweise ob zwei Zahlen teilerfremd sind.

Die eigentliche Approximation wird durch die Funktion approximate(j = 2, i = 1, x, max.j = 100) durchgeführt.

approximate <- function(j = 2, i = 1, x, max.j = 100){
  stopifnot(is.wholenumber(j), is.wholenumber(i), x < 1)
  
  m.result <- c()
  delta <- 0.5    # Startwert für delta: 
			  # wird bei jedem Durchlauf geprüft, 
              # ob es kleiner wird und evtl neu gesetzt
  for(k in (2:max.j)){
    i <- next.i(k, x)

    if(is.na(i)) next        # kein i gefunden

    delta.new <- abs(k * x - i)    # Ist i besser als 
							# im letzten Schleifendurchlauf?
    if( delta.new < delta ){
      delta <- delta.new
      m.row <- c(k, i, delta, tripleExplicit(i = i, j = k))
      m.result <- rbind(m.result, m.row)
    }
    else next
  }
  colnames(m.result) <- c("j", "i", "delta", "a", "b", "c")
  row.names(m.result) <- (1:nrow(m.result))
  return(m.result)
}

Die Funktion approximate(j = 2, i = 1, x, max.j = 100) führt die Iteration über j durch (bis zu einem vorgegeben Maximalwert). In der Schleife (hier wird der Index mit k bezeichnet) wird der zugehörige Wert von i von next.i(k, x) angefordert und entschieden, ob er zu einer besseren Näherung führt. Falls ja, wird an die Matrix m.result eine weitere Zeile angehängt.

Den Aufruf von approximate(j = 2, i = 1, x, max.j = 100) zeigt das folgende Skript (die Ergebnisse waren oben als Tabelle dargestellt):

m <- approximate(x = 1 / sqrt(3))
m
#    j  i       delta    a     b     c
# 1  2  1 0.154700538    3     4     5
# 2  7  4 0.041451884   33    56    65
# 3 26 15 0.011106999  451   780   901
# 4 97 56 0.002976111 6273 10864 12545

Aufgaben

Programmier-Aufgabe:

Punkte mit rationalen Koordinaten auf dem Einheitskreis

Berechnen Sie die rationalen Koordinaten der Punkte auf dem Einheitskreis, die von primitiven pythagoreischen Zahlentripeln erzeugt werden. Berechnen Sie diese aus Gitter-Punkten mit j < max.j, wobei Letzteres vorgegeben ist.

Schreiben Sie das Programm so, dass Sie max.j leicht neu setzen können.

Berechnen Sie für benachbarte Punkte auf dem Einheitskreis den maximalen Abstand. Der Abstand soll dazu:

Lässt sich erkennen, wie der maximale Abstand von max.j abhängt?

Bei welchem pythagoreischen Zahlentripel ist der Abstand zu den Nachbarn am Größten?