Reading about the Stern-Brocot tree, the article gives this example:
using 7/5 as an example, its closest smaller ancestor is 4/3, so its left child is (4 + 7)/(3 + 5) = 11/8, and its closest larger ancestor is 3/2, so its right child is (7 + 3)/(5 + 2) = 10/7.
Getting the left and right children seem clear to me:
- left - mediant of # (7/5) and closest smaller ancestor (4/3)
- right- mediant of # (7/5) and closest larger ancestor (3/2)
But, how can I figure out the closest smaller and larger ancestors of 7/5?
This is not an especially elegant procedure, but it is algorithmic.
Index the levels of the Stern-Brocot tree so that level $n$ has $2^n$ nodes: level $0$ has the root $\frac11$, level $1$ has $\frac12$ and $\frac21$, and so on. Let $T_n$ be the set of rational numbers in $[0,1]$ on level $n$ of the tree, and let $S_n=\bigcup_{k\le n}T_k$; then $S_n\cup\{0\}$ is the Farey sequence of order $F_{n+2}$, where $F_k$ is the $k$-th Fibonacci number. This means that each interior element of $S_n$ is the mediant of its immediate neighbors in $S_n$, so the problem of finding ‘parents’ in the Stern-Brocot tree reduces to finding the neighbors of an interior member of a Farey sequence.
Suppose that $\frac{a}b<\frac{c}d$, and $\frac{a}b$ and $\frac{c}d$ are adjacent in some Farey sequence; it’s well-known that $bc-ad=1$. Thus, if I want to find the left ‘parent’ of $\frac{c}d$ in the Stern-Brocot tree, I need to solve the system
$$\begin{align*} &bc-ad=1\tag{1}\\ &0<b<d\\ &0\le a \end{align*}$$
for $a$ and $b$. Since $c$ and $d$ are relatively prime, the equation $(1)$ has some integer solution $a=a_0,b=b_0$, and the general solution is then
$$\begin{align*} a&=a_0+ck\\ b&=b_0+dk\;, \end{align*}$$
where $k\in\Bbb Z$. Clearly there is at most one $k\in\Bbb Z$ such that $0<b_0+dk<d$, and since $\frac{c}d$ has a left parent, there must be exactly one such $k$. Thus, we may use the extended Euclidean algorithm to compute $a_0$ and $b_0$, set $b=b_0\bmod d$, and use $(1)$ to get $a$. Once we have the left neighbor $\frac{a}b$, we get the right neighbor as $\frac{c-a}{d-b}$.
This takes care of the left half of the Stern-Brocot tree, containing the positive rational numbers not exceeding $1$. The right half is obtained from the left half by reflecting in the vertical centre line and then taking the reciprocal of each rational, so to find the ‘parents’ of a rational greater than $1$ we can find the ‘parents’ of its reciprocal and then take their reciprocals.