El árbol Stern-Brocot es un árbol binario de fracciones donde cada fracción se adquiere al sumar los numeradores y denominadores de las dos fracciones vecinas en los niveles anteriores.
Se genera comenzando con 0/1
y 1/0
como "fracciones de punto final", y a partir de ahí, iterando colocando una fracción entre cada par de fracciones consecutivas al sumar los numeradores y denominadores de esas fracciones, de la siguiente manera:
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
En cada iteración del árbol Stern-Brocot (la n
iteración th), hay 2^n + 1
elementos en la secuencia, a los que podemos atribuir una fracción de 0/2^n
a 2^n/2^n
. Cada nueva iteración simplemente inserta una fracción "a mitad de camino" entre cada par de fracciones consecutivas.
Esto hace que el árbol Stern-Brocot sea un mapeo uno a uno entre los números racionales positivos y las fracciones binarias entre 0 y 1, lo que también sirve como prueba de que los dos conjuntos tienen la misma cardinalidad.
Su tarea es escribir un programa o función que, dado el numerador y el denominador de un número racional positivo en términos más bajos, determine la fracción binaria que corresponde a la posición de esa fracción en el árbol Stern-Brocot.
A continuación se proporcionan ejemplos de entradas y salidas:
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)
Entradas que no necesita admitir, pero se incluyen como referencia:
0/1 -> 0/1 (0/1 is considered the left number)
1/0 -> 1/1 (1/0 is considered the rightmost number)
El programa más corto en cualquier idioma para lograr este objetivo gana.
1/1 => 1
, 1/2 => 2
, 2/1 => 3
, 1/3 => 4
, etc.). Si el número así generado para un nodo es n
, entonces 2^lg n
(registro binario) es el bit más alto establecido n
, y la fracción binaria deseada es (2*(n - 2^lg n) + 1) / 2^(lg n + 1)
. (Cualquier persona que intente una solución de ensamblador en un conjunto de instrucciones con un bit de conjunto más alto probablemente quiera usar este enfoque).