L' albero Stern-Brocot è un albero binario di frazioni in cui ogni frazione viene acquisita aggiungendo i livelli e i denominatori delle due frazioni confinanti nei livelli sopra.
Viene generato iniziando con 0/1
e 1/0
come "frazioni di endpoint", e da lì, iterando posizionando una frazione tra ciascuna coppia consecutiva di frazioni aggiungendo insieme i numeratori e i denominatori di quelle frazioni, in questo modo:
0. 0/1 1/0
1. 0/1 1/1 1/0
2. 0/1 1/2 1/1 2/1 1/0
3. 0/1 1/3 1/2 2/3 1/1 3/2 2/1 3/1 1/0
4. 0/1 1/4 1/3 2/5 1/2 3/5 2/3 3/4 1/1 4/3 3/2 5/3 2/1 5/2 3/1 4/1 1/0
In ogni iterazione dell'albero Stern-Brocot (la n
iterazione), ci sono 2^n + 1
elementi nella sequenza, a cui possiamo attribuire una frazione da 0/2^n
a 2^n/2^n
. Ogni nuova iterazione inserisce semplicemente una frazione "a metà" tra ciascuna coppia di frazioni consecutive.
Questo rende l'albero Stern-Brocot una mappatura uno-a-uno tra i numeri razionali positivi e le frazioni binarie tra 0 e 1, servendo così come prova che i due insiemi hanno la stessa cardinalità.
Il tuo compito è di scrivere un programma o una funzione che, dato il numeratore e il denominatore di un numero razionale positivo in termini più bassi, determina la frazione binaria che corrisponde alla posizione di quella frazione nell'albero Stern-Brocot.
Di seguito sono riportati esempi di ingressi e uscite:
2/3 -> 3/8 (4th number in iteration 3)
4/7 -> 9/32 (between 1/2 and 3/5 in the chart above)
1/1 -> 1/2 (middle number in the first iteration)
Input che non è necessario supportare, ma sono inclusi come riferimento:
0/1 -> 0/1 (0/1 is considered the left number)
1/0 -> 1/1 (1/0 is considered the rightmost number)
Vince il programma più breve in qualsiasi lingua per raggiungere questo obiettivo.
1/1 => 1
, 1/2 => 2
, 2/1 => 3
, 1/3 => 4
, ecc). Se il numero così generato per un nodo è n
, allora 2^lg n
(registro binario) è il bit più alto impostato n
e la frazione binaria desiderata è (2*(n - 2^lg n) + 1) / 2^(lg n + 1)
. (Chiunque stia tentando una soluzione assemblatore in un set di istruzioni con un bit get-più alto set probabilmente vorrà utilizzare questo approccio).