Die Stern-Brocot-Folge (A002487 in OEIS[1]), auch als „diatomische Folge von Stern und Brocot“ oder „Stern-Sequenz“ bekannt, ist eine Folge ganzer Zahlen, die unabhängig vom Mathematiker Gotthold Eisenstein[2] und dem Uhrmacher Achille Brocot[3]
entdeckt und vom Mathematiker Moritz Stern[4] genauer untersucht wurde.
Sie startet mit dem Zahlenpaar s0 = 0 und s1 = 1. Zusätzliche Glieder der Folge ergeben sich, indem fortgesetzt die bisherige Folge kopiert und in der Kopie zwischen je zwei Glieder deren Summe eingefügt wird. Die ersten 33 Glieder der Folge sind
wobei auch die folgende Stufentafel (Beginn der Folge mit s1 und Unterteilung bei den Semikolons „;“) zur besseren Darstellung verschiedener Eigenschaften benutzt wird:
1
1
2
1
3
2
3
1
4
3
5
2
5
3
4
1
5
4
7
3
8
5
7
2
7
5
8
3
7
4
5
1
6
5
9
4
11
7
10
3
11
8
13
5
12
7
9
2
9
7
…
1
7
6
11
5
14
9
13
4
15
11
18
7
17
10
13
3
14
11
…
1
8
7
13
6
17
11
16
5
19
14
23
9
22
13
17
4
19
15
…
1
9
8
15
7
20
13
19
6
23
17
28
11
27
16
21
5
24
19
…
siehe #Eigenschaften der Stufentafel. Die Stern-Brocot-Folge weist einige bemerkenswerte mathematische Besonderheiten auf:
Aufeinander folgende Zahlen der Folge sind einander teilerfremd und jedes mögliche Paar positiver, teilerfremder, ganzer Zahlen kommt genau einmal vor; das erlaubt mit ihr die Menge der rationalen Zahlen abzuzählen, siehe #Abzählung der rationalen Zahlen.
Die Folge zählt ungerade Glieder im Pascal’schen Dreieck, Wege in Graphen oder Darstellungsweisen von Hyperbinärzahlen, siehe #Zähleigenschaften.
Mit der Folge kann die am besten passende Zahnradpaarung für ein bestimmtes Übersetzungsverhältnis gefunden werden, was A. Brocot als erster erkannte,[5] siehe #Stern-Brocot-Baum.
Die größten Glieder in jeder Zeile der Stufentafel bilden die Fibonacci-Folge.
Die Position eines Zahlenpaars (a,b) in der Stufentafel hängt mit der Kettenbruchentwicklung des Bruchs a/b zusammen.
Diese und andere Eigenschaften sowie ihr relativ geringer Bekanntheitsgrad haben Jean-Paul Delahaye veranlasst, die Folge „die verkannte Schwester der Fibonacci-Folge“ zu nennen.[6]
Gotthold Eisenstein veröffentlichte im Februar 1850 eine Arbeit über eine Zahlenreihe,
„welche aus zwei gegebenen Zahlen m und n ohne gemeinschaftlichen Theiler auf die Art entspringt, daß man fortgesetzt zwischen je zwei bereits erhaltene Zahlen ihre Summe schreibt.“
Er konnte einige der #Eigenschaften der Stufentafel angeben und regte M. Stern schon im Januar 1850 dazu an, die Reihe auch zu untersuchen. Stern entsprach 1858 mit seiner Arbeit, wie er schrieb, „leider zu spät, dem Wunsche meines unvergeßlichen Freundes;“[4]:193 Eisenstein starb 1852 im Alter von nur 29 Jahren. Der Aufsatz von Brocot datiert auf das Jahr 1861.[3]
Definition der Stern-Brocot-Folge
Die Stern-Brocot-Folge s0, s1, s2,… ist durch das rekursive Bildungsgesetz
s2n
= sn
s2n+1
= sn + sn+1
mit den Anfangswerten
s0 = 0 und s1 = 1
definiert. Das bedeutet in Worten:
Die Folge beginnt mit null und eins.
Glieder mit einer geraden Nummer sind gleich dem Glied mit der halben Nummer und
Glieder mit einer ungeraden Nummer sind gleich der Summe der Glieder mit der halben Nummer ihres Vorgängers und Nachfolgers. Anders ausgedrückt zerlegt man die ungerade Nummer in zwei Teile, die so eng benachbart sind wie überhaupt möglich: eine Zahl und die daran anschließende Zahl. Das Folgenglied ist dann die Summe der Glieder mit diesen Teilnummern.[6]:64 Dieses Gesetz ähnelt dem der Fibonacci-Folge.
Das Bildungsgesetz für die Glieder an ungeraden Stellen kann wegen s2n = sn umgeformt werden in
s2n+1 = sn + sn+1 = s2n + s2(n+1) = s2n + s2n+2
Das entspricht dem eingangs angegebenen Rezept, aus dem Zahlenpaar (0,1) zusätzliche Glieder zu generieren, indem fortgesetzt die bisherige Folge kopiert und in der Kopie zwischen je zwei Glieder deren Summe eingefügt wird; M. Stern nannte das die Entwicklung (0,1).[4]:194
Die ersten 100 Glieder der Folge sind:
n
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sn
0
1
1
2
1
3
2
3
1
4
3
5
2
5
3
4
1
5
4
7
n
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
sn
3
8
5
7
2
7
5
8
3
7
4
5
1
6
5
9
4
11
7
10
n
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
sn
3
11
8
13
5
12
7
9
2
9
7
12
5
13
8
11
3
10
7
11
n
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
sn
4
9
5
6
1
7
6
11
5
14
9
13
4
15
11
18
7
17
10
13
n
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
sn
3
14
11
19
8
21
13
18
5
17
12
19
7
16
9
11
2
11
9
16
Eisenstein und M. Stern betrachteten auch die Entwicklung zweier beliebiger natürlicher Zahlen (m,n). Wenn diese nicht teilerfremd sind, dann enthalten alle Glieder der Folge deren größten gemeinsamen Teiler k. Werden alle Glieder der Folge durch k geteilt, entsteht eine Folge mit teilerfremdem m und n, und nur diese brauchen untersucht zu werden. Die Entwicklung mit teilerfremdem m und n ist als Bruchstück in der Entwicklung (0,1) enthalten, denn in dieser kommen alle möglichen Paare teilerfremder Zahlen vor. Allerdings treten in diesen Bruchstücken nicht mehr alle positiven Zahlen auf, sondern nur solche, die als Summe ganzzahliger Vielfache von m und n darstellbar sind.[4]:210
Die Stern-Brocot-Folge wurde auch auf Polynome verallgemeinert.[6]:69
worin die Gaußklammer [·] auf die nächste Ganzzahl abrundet und „mod 2“ den Rest bei der Division durch zwei gibt, also eins bei ungeraden Zahlen und null bei geraden.[6] Für große n erfordert diese Darstellung die Handhabung sehr großer Zahlen; beispielsweise lautet der Binomialkoeffizient.
Die folgenden Methoden basieren auf der mehrfachen Anwendung einer Berechnungsvorschrift:
Nach dem Bildungsgesetz ist sk = sk/2, wenn k gerade, oder sk = s(k-1)/2 + s(k+1)/2, wenn k ungerade ist. Durch fortgesetzte Anwendung dieser Formeln werden alle benötigten Folgenglieder und schließlich sn berechnet. Beispielsweise ist
Die Anzahl der zu berechnenden Glieder wächst mit dem Logarithmus von n.
Aus der Formel für #den nächsten Bruch leitet sich für das auf a, b folgende Glied
c = a + b − 2r
ab, wo r = a − [a/b]·b der Rest bei Division von a durch b ist (sodass a−r durch b teilbar und 0 ≤ r < b ist, [·] ist die Gaußklammer). Das Glied sn ergibt sich aus n−1 maliger Anwendung der Formel auf s0 und s1.
Für n > 1 besteht der Zusammenhang
sn = kn−1sn−1 − sn−2
Darin ist kj die größte ungerade Zahl für die j durch 2(kj−1)/2 teilbar ist.[7][8]
Weitere Formeln können aus den #Zähleigenschaften der Stern-Brocot-Folge abgeleitet werden.
M. Stern[4] entwickelte seine Folge in Reihen, beginnend mit zwei natürlichen Zahlen (m,n), indem er fortgesetzt die Reihe kopierte und in der Kopie zwischen je zwei aufeinanderfolgende Zahlen die Summe derselben einfügte. Dies nannte er Entwicklung (m,n). Die Stern-Brocot-Folge ist die Entwicklung (0,1) und die #Stufentafel entsteht aus der Entwicklung (1,1); die erste Hälfte jeder ihrer Reihen ergibt sich aus der Entwicklung (1,2), die Eisenstein untersuchte. M. Stern definierte:
Die Reihe (m,n), die entwickelt wird, ist die nullte Reihe,
Jede Zahl einer Reihe ist ein Glied der Reihe und eine Gruppe ist eine Anzahl aufeinander folgender Glieder.
Glieder, die aus der Summe ihrer Nachbarn entstanden, heißen Summenglieder, und alle anderen Stammglieder. Die Summenglieder stehen an geraden Stellen und die Stammglieder an ungeraden Stellen jeder Reihe außer der nullten.
φ(n) ist die Eulersche φ-Funktion, d. h. die Anzahl der zu n teilerfremden Zahlen, die kleiner oder gleich n sind.
Die Entwicklung (1,1) beginnt mit
p
p-te Reihe
0
1,
1
1
1,
2,
1
2
1,
3,
2,
3,
1
3
1,
4,
3,
5,
2,
5,
3,
4,
1
4
1,
5,
4,
7,
3,
8,
5,
7,
2,
7,
5,
8,
3,
7,
4,
5,
1
5
1,
6,
5,
9,
4,
11,
7,
10,
3,
11,
8,
13,
5,
12,
7,
9,
2,
9,
7,
12,
5,
13,
8,
11,
3,
10,
7,
11,
4,
9,
5,
6,
1
︙
︙
usw.
᨞
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
…
Δ =
0
1
1
2
1
3
2
3
1
4
3
5
2
5
3
4
1
5
4
7
3
8
5
7
2
7
5
8
3
7
4
5
1
…
Entfernt man in jeder Reihe die endständige Eins, entstehen die Zeilen der eingangs angegebenen #Stufentafel. Die folgenden Eigenschaften der Reihen trug M. Stern zusammen, wenn nicht anders angegeben:
Die Anzahl der Glieder in der p-ten Reihe ist 2p+1.
Die Summe der Glieder in der p-ten Reihe ist 3p+1.
Die Summe der Quotienten zweier aufeinander folgender Glieder in der Reihe ist (3·2p−1)/2.[9]
Die Summe der Kehrwerte der Produkte zweier aufeinander folgender Glieder in der Reihe ist eins.[9]
Übereinander stehende Glieder erzeugen eine Arithmetische Folge und die Differenzen in den Folgen ergeben ihrerseits die Stern-Brocot-Folge, vermerkt in der untersten, blau geschriebenen Zeile obiger Tabelle.
Jede Reihe ist ein Palindrom, dessen Mitte bei Reihen ungerader Länge eine Zwei ist.
Steht in einer Zeile die Gruppe und direkt darunter , dann gilt:
In der vierten Reihe steht beispielsweise 5,4,7 über 6,5,9 in der fünften Reihe, und es stimmt:
Jede Zahl n kommt sooft als Summenglied vor, wie es kleinere Zahlen gibt, die zu ihr teilerfremd sind; diese Anzahl ist φ(n). Eine Primzahl π kommt π−1-mal als Summenglied vor. In Zeile n−1 kommt n zum letzten Mal als Summenglied vor. Ab der n-ten Zeile kommt n in jeder Zeile φ(n) mal als Stammglied vor.
Die Zahl n kommt in Zeile p sooft vor, wie die Zerlegung von n in zwei teilerfremde a, b gelingt, sodass die Summe der Teilnenner des zu a/b gleichen Kettenbruchs nicht größer als p ist. Beispielsweise lässt sich die Zahl fünf viermal in einander teilerfremde Zahlen zerlegen:
Entsprechend kommt fünf vor der dritten Reihe keinmal, in der dritten Reihe zweimal und in allen darauf folgenden Reihen viermal vor.
Die Gruppe (a,b) steht in der Zeile p = k0+k1+…+km−1, wenn a/b gleich ist zum einfachen Kettenbruch (k0;k1,…,km). Beispielsweise ist in der fünften Reihe, die mit 1,6,5,9,4,11 beginnt:
Die Summe der Teilnenner der Kettenbrüche ist hier in allen Fällen sechs, d. h. eins mehr als die Zeilennummer fünf, so wie es sein muss.
Die Gruppe (a,b) kommt in der ersten Hälfte einer Reihe vor, wenn die kleinste positive Zahl c, die mit a multipliziert den Rest 1 bei Division durch a+b ergibt, kleiner als (a+b)/2 ist:
So steht die Gruppe (5,9) in der ersten Hälfte der fünften Reihe, weil 5·3 = 15 ≡ 1 mod 14 und 3 < 14/2 = 7. Die Gruppe (9,5) andererseits liegt in der zweiten Hälfte, weil 9·11 ≡ (-5)·(-3) = 15 ≡ 1 mod 14 und 11 > 7.
Zähleigenschaften
Zusammenhang mit dem Pascal’schen Dreieck
Wenn man das Pascal’sche Dreieck als Stufentafel anordnet (siehe folgende Tabelle), so bildet die Anzahl der ungeraden Zahlen in den aufsteigenden Diagonalen, von denen eine gelb markiert ist, die Stern-Brocot-Folge. Die Fibonacci-Folge findet sich hier ebenfalls, und zwar in der Summe der Zahlen.
1
1
1
1
2
1
1
3
3
1
1
4
6
4
1
1
5
10
10
5
1
1
6
15
20
15
6
…
1
7
21
35
35
21
…
1
8
28
56
70
56
…
1
9
36
84
126
126
…
Die hervorgehobene Diagonale zeigt ein Beispiel. In der ersten Spalte geht man von Zeile n = 9 aus und betrachtet die übrigen Werte der Diagonalen: Die Anzahl der ungeraden Zahlen ist 4 und s9 ist ebenfalls 4; Die Summe auf der Diagonalen ist 1+7+15+10+1 = 34 = f9 in der Fibonacci-Folge.
Die Stern-Brocot-Folge weist folgende bemerkenswerten Beziehungen zur Binärdarstellung von Zahlen auf.
Die Anzahl der alternierenden Folgen aus Einsen und Nullen, die aus der Binärdarstellung von n gebildet werden können, ist gleich sn. Gezählt werden Folgen, die mit einer Eins beginnen und enden und in denen keine zwei Nullen und keine zwei Einsen hintereinander stehen. Eine einzelne Eins zählt hier auch als alternierende Folge. Beispielsweise ist 13 = 11012, woraus sich die fünf alternierenden, mit Unterstreichung markierten Folgen
Die Stelle, an der zwei teilerfremde Zahlen a, b in der Stern-Brocot-Folge hintereinander stehen, kann wie folgt bestimmt werden. Dazu wird der Bruch a/b als Kettenbruch (k0;k1,…,km) mit Teilnennern k0,…,m dargestellt. Der Kettenbruch wird in eine Binärzahl übersetzt mit von links km Einsen, km-1 Nullen, wieder km-2 Einsen usw. Die Binärzahl entspricht der Stelle in der Stern-Brocot-Folge, an der a vor b steht.
Beispielsweise ist
Wenn m ungerade ist, wird der letzte Teilnenner km ersetzt durch km−1 und eine Eins als Teilnenner hinzugefügt, entsprechend :
Konkret steht in Übereinstimmung mit obigen Formeln das Paar (5,1) an der Stelle 31, (5,6) an der Stelle 62, (1,5) an der Stelle 16 und (13,4) = (4·3+1,4) an der Stelle 71.
In der „Hyperbinärdarstellung“[10] einer Zahl n+1 sind neben den Ziffern Null und Eins noch die Zwei zur Darstellung der Zahl erlaubt, was mehrere Arten ihrer Schreibung gestattet; deren Anzahl ist sn. Beispielsweise lässt sich acht auf vier Arten schreiben:[6]
Im binären Baum von Stern und Brocot aus Abb. 2 ist an jedem Knoten die Anzahl der Wege notiert, die von den beiden obersten, rot geschriebenen Einsen abwärts, den Pfeilen folgend, zum Knoten führen.
Im binären Baum steht in den Knoten gleicher Tiefe eine Reihe der #Entwicklung (1,1).
Im Baum in Abb. 3 ist an jedem Knotenpunkt die Anzahl der Wege notiert, die von der obersten Eins abwärts, den Pfeilen folgend, zum Knoten führen. In diesem Baum stehen in den Knoten gleicher Tiefe bis zur Mitte die ersten Folgenglieder der Stern-Brocot-Folge ab s1, eine Eins und dieselben Folgenglieder in umgekehrter Reihenfolge.
Zusammenhänge mit Brüchen
Calkin-Wilf-Baum
Abb. 4: Calkin-Wilf-Baum
Abb. 5: Calkin-Wilf-Spirale
Im Calkin-Wilf-Baum sind die Verhältnisse aufeinander folgender Glieder der Stern-Brocot-Folge in einer Baumstruktur angeordnet, siehe Abb. 4. Sie ist nach Neil Calting und Herbert Wilf benannt, die sie im Jahr 2000 untersucht haben.[10] Indem die Brüche im Baum zeilenweise gelesen werden, haben sie die Eigenschaften:
Der Nenner eines Bruchs ist der Zähler des folgenden; b(n)/b(n+1) wird gefolgt von b(n+1)/b(n+2).
Die b(n), angefangen mit n=0, sind die Anzahl der Möglichkeiten n als Summen von Zweierpotenzen zu schreiben, von denen jede maximal doppelt gezählt wird (Hyperbinärzahlen, siehe auch #Zusammenhang mit der Binärdarstellung von Zahlen).
b(n) und b(n+1) sind einander teilerfremd.
Jede rationale Zahl erscheint nur genau einmal im Baum.
Der Verzweigungspunkt mit dem Bruch i/j hat zwei Äste; der linke führt zum Verzweigungspunkt i/(i+j) und der rechte zu (i+j)/j.
Hier steht in den Zählern und Nennern eine Zeile der #Stufentafel jeweils in richtiger und umgekehrter Reihenfolge. Indem die Zeilen des Baums nacheinander und von links nach rechts gelesen werden, reihen sich die Brüche in gekürzter Form und ohne Doppeltzählungen – der Spirale in Abb. 5 folgend – aneinander. Die Stelle des Bruchs in dieser Aufzählung entspricht der Binärzahl, die entsteht, wenn die im Baum in Abb. 4 rot geschriebenen Nullen und Einsen von der Spitze 0/1 bis zum Bruch aneinander gehängt werden.[12] Beispielsweise bekommt der Bruch 3/5 in der untersten Reihe die Binärzahl 10102 = 10 zugeordnet, was seiner Position in der Abzählung entspricht. Umgekehrt ist die Binärdarstellung der Zahl n auch eine Wegbeschreibung zum n-ten Glied der Abzählungskette. Dazu geht man vom Ursprung bei 0/1 zur nächsten Verzweigung und nimmt bei einer Eins in der nächsten Ziffer der Binärdarstellung den rechten Ast und bei einer Null den linken. Das zehnte Glied wird beispielsweise durch abwechselnde Wahl des rechten, linken, rechten und wieder linken Asts erreicht (beim Ausgangspunkt 0/1 gibt es nur den rechten Ast.)
Werden die Brüche in jeder Zeile nach ihrer Größe geordnet, entsteht der #Stern-Brocot-Baum. Diese Reihenfolge kann auch mit der oben definierten Binärdarstellung hergestellt werden, indem diese umgekehrt und nach dieser umgekehrten Binärdarstellung sortiert wird. In der dritten Zeile stehen beispielsweise 1/3, 3/2, 2/3 und 3/1 an den Stellen 1002, 1012, 1102 bzw. 1112. Umkehrung der Binärdarstellungen liefert 0012, 1012, 0112, 1112 und sortiert 0012, 0112, 1012 und 1112, was den Brüchen 1/3, 2/3, 3/2, und 3/1 entspricht. Das funktioniert auch zeilenübergreifend, wenn die Binärdarstellungen vor dem Sortieren mit führenden Nullen auf gleiche Länge gebracht werden.[11]
Der Grund für diese Eigenschaften ist darin zu suchen, dass die Differenz zwischen benachbarten Brüchen (i+j)/j und i/(i+j) mit der Tiefe der Knoten zunimmt.[11]:85
Der nächste Bruch
Zur Berechnung des nächsten Bruchs im #Calkin-Wilf-Baum gibt es eine einfache Formel. Ist a/b der vorgelegte Bruch, dann lautet der nächste Bruch[6]:69
b/c = 1/(1 + 2[a/b] − a/b)
wo die Gaußklammer [ · ] auf die nächste Ganzzahl abrundet.
Stern-Brocot-Baum
Der Stern-Brocot-Baum ist eine Anordnung aller positiven rationalen Zahlen in Form eines binären Baumes. Er enthält die Brüche aus dem #Calkin-Wilf-Baum in jeder Tiefe nach der Größe sortiert und eignet sich so zur Bestimmung von Näherungsbrüchen für reelle Zahlen.
Der Baum entsteht durch Verbindung der #Summenglieder, die an den geraden Stellen in jeder Zeile stehen, von einer Zeile zur nächsten, und nur die ihnen entsprechenden Brüche werden als solche ausgewertet (nicht so die randständingen , siehe #Programmierung der Optimierung).
Die Summenglieder sind die Medianten der #Stammglieder auf der linken und der rechten Seite (an den ungeraden Stellen jeder Zeile, ein Stammglied ist der direkte Vorfahre, das andere ein weiter oben stehender). In jeder Zeile des Baums stehen die ersten Glieder der Stern-Brocot-Folge in der richtigen Reihenfolge in den Zählern der Brüche und in den Nennern in umgekehrter Reihenfolge. Da der größte Bruch in jeder Zeile linear mit der Zeilennummer wächst, die Anzahl der Glieder jedoch mit der Potenz von zwei, nähern sich die Brüche mit zunehmender Tiefe immer weiter an.
Optimale rationale Näherung für eine reelle Zahl
Brocot suchte zu einer bestimmten reellen Zahl x den besten Näherungsbruch p/q in dem Sinn, dass jede rationale Zahl s/t, die näher als p/q an x liegt, einen größeren Nenner hat: t>q. Die Zahl x markiert man im Baum als senkrechte Linie und setzt den Baum mit Hilfe der beiden links und rechts der Linie nächstgelegenen Stammglieder und des von ihnen eingeschlossenen Summenglieds/Medianten fort, bis eine zufriedenstellende Annäherung erreicht ist.
Für die Zahl 1,7 = 17/10 führt das Vorgehen zu
Rechtes Stammglied
1/0→
1/0➚
2/1→
2/1→
2/1➚
7/4➚
12/7
Summenglied
1,7>1/1➘
1,7<2/1➚
1,7>3/2➘
1,7>5/3➘
1,7<7/4➚
1,7<12/7➚
1,7=17/10
Linkes Stammglied
0/1➘
1/1→
1/1➘
3/2➘
5/3→
5/3→
5/3
Kleinster Abstand
7/10
3/10
1/5
1/30
1/30
1/70
0
Ende des Baums →
Innerhalb des Baumes aus Abb. 6 ist die beste Näherung 1,7 ≈ 5/3 = 1,6 in einem Abstand von 1/30 = 0,03. Sie ist beste Näherungen in dem Sinn, dass jede rationale Zahl, die näher als 1/30 an x liegt, einen größeren Nenner hat, wie zum Beispiel 12/7 im Abstand 1/70. Offenbar nimmt der Abstand von links nach rechts, d. h. mit zunehmender Tiefe, monoton ab. Das Summenglied wird in jeder Spalte mit dem Medianten des rechten und linken Stammglieds verglichen, und dieser Mediant ersetzt das, von x aus gesehen, auf der Seite des Medianten liegende Stammglied, was durch Pfeile angedeutet ist.
Programmierung der Optimierung
Obige Suche lässt sich problemlos in ein Computerprogramm umsetzen, wofür zwei Beispiele angegeben werden.
Die Funktion approximate in folgendem Haskell-Programm generiert die Liste aller besten Näherungen für eine positive reelle Zahl, die als Funktion gegeben ist, welche für jede rationale Zahl angibt, ob sie größer, kleiner oder gleich der gesuchten ist.
Die generierte Liste ist endlich, wenn die gesuchte Zahl rational ist.
Die Python Funktion approximate gibt für eine positive reelle Zahl x den besten Näherungsbruch mit einem Nenner kleiner oder gleich n.
defapproximate(x=1.,n=1000000):"""approximate( x=1., n=1000000 ) Gibt den besten Naeherungsbruch fuer x mit Nenner <= n"""fromfractionsimportFraction(l,m,r)=[[0,1],[1,1],[1,0]]# Stammglieder mit Mediantf=3*[-1]# optimale l, m und rwhilef.count(-1)>0:a=mm=[l[0]+r[0],l[1]+r[1]]# Mediant von l und riff[1]<0andm[1]>n:# maximaler Nenner ueberschrittenf[1]=Fraction(*a)# speichern des optimalen mifm[0]<x*m[1]:# l0/l1 < m0/m1 < x < r0/r1iff[0]<0andm[1]>n:# maximaler Nenner ueberschrittenf[0]=Fraction(*l)# speichern des optimalen ll=melifm[0]>x*m[1]:# l0/l1 < x < m0/m1 < r0/r1iff[2]<0andm[1]>n:# maximaler Nenner ueberschrittenf[2]=Fraction(*r)# speichern des optimalen rr=melse:# m0/m1 == xiff[1]<0:# m noch nicht gespeichertf[1]=Fraction(*m)# speichern des optimalen mbreakreturnsorted([(abs(y-x),y)foryinf])[0][1]# optimales f
Weblinks
Code-Beispiele zur Programmierung der Stern-Brocot-Folge auf Rosettacode.org
↑ abA. Brocot: Berechnung von Zahnrädern durch Annäherung, neue Methode. In: Revue Chronométrique. Band3, 1861, S.186–194 (französisch, eyrolles.com – Originaltitel: Calcul des rouages par approximation, nouvelle méthode.).
↑ abJ. Grimm: Fibonacci-Zahlen und der Stern-Brocot-Baum in Coq. Research Report RR-8654. Hrsg.: INRIA. 2014, S.1–76, arxiv:1011.2823v1 (englisch, researchgate.net [abgerufen am 17. Januar 2022] Originaltitel: Fibonacci numbers and the Stern-Brocot tree in Coq.).