L' arbre de Stern-Brocot est un arbre binaire de fractions où chaque fraction est acquise en ajoutant les numérateurs et les dénominateurs des deux fractions voisines dans les niveaux ci-dessus.
Il est généré en commençant par 0/1
et en 1/0
tant que "fractions de point final", et à partir de là, en itérant en plaçant une fraction entre chaque paire de fractions consécutives en ajoutant les numérateurs et les dénominateurs de ces fractions, comme ceci:
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
Dans chaque itération de l'arbre Stern-Brocot (la n
ième itération), il y a des 2^n + 1
éléments dans la séquence, auxquels nous pouvons attribuer une fraction de 0/2^n
à 2^n/2^n
. Chaque nouvelle itération insère simplement une fraction "à mi-chemin" entre chaque paire de fractions consécutives.
Cela fait de l'arbre de Stern-Brocot une correspondance biunivoque entre les nombres rationnels positifs et les fractions binaires entre 0 et 1, ce qui sert également de preuve que les deux ensembles ont la même cardinalité.
Votre tâche consiste à écrire un programme ou une fonction qui, étant donné le numérateur et le dénominateur d'un nombre rationnel positif en termes les plus bas, détermine la fraction binaire qui correspond à la position de cette fraction dans l'arbre Stern-Brocot.
Des exemples d'entrées et de sorties sont fournis ci-dessous:
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)
Entrées que vous n'avez pas besoin de prendre en charge, mais qui sont incluses pour référence:
0/1 -> 0/1 (0/1 is considered the left number)
1/0 -> 1/1 (1/0 is considered the rightmost number)
Le programme le plus court dans n'importe quelle langue pour atteindre cet objectif gagne.
1/1 => 1
, 1/2 => 2
, 2/1 => 3
, 1/3 => 4
, etc.). Si le nombre ainsi généré pour un nœud est n
, alors 2^lg n
(journal binaire) est le bit le plus élevé défini n
et la fraction binaire souhaitée est (2*(n - 2^lg n) + 1) / 2^(lg n + 1)
. (Quiconque tente une solution d'assembleur dans un jeu d'instructions avec un bit de jeu le plus élevé voudra probablement utiliser cette approche).