A árvore Stern-Brocot é uma árvore binária de frações, onde cada fração é adquirida adicionando os numeradores e denominadores das duas frações vizinhas nos níveis acima.
É gerado iniciando com 0/1
e 1/0
como "frações de ponto final" e, a partir daí, iterando colocando uma fração entre cada par consecutivo de frações adicionando os numeradores e denominadores dessas frações, da seguinte forma:
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
Em cada iteração da árvore Stern-Brocot (a n
iteração), existem 2^n + 1
elementos na sequência aos quais podemos atribuir uma fração de 0/2^n
para 2^n/2^n
. Cada nova iteração simplesmente insere uma fração "na metade" entre cada par de frações consecutivas.
Isso faz da árvore de Stern-Brocot um mapeamento individual entre os números racionais positivos e as frações binárias entre 0 e 1, servindo também como prova de que os dois conjuntos têm a mesma cardinalidade.
Sua tarefa é escrever um programa ou função que, dado o numerador e o denominador de um número racional positivo em termos mais baixos, determine a fração binária que corresponde à posição dessa fração na árvore Stern-Brocot.
Exemplos de entradas e saídas são fornecidos abaixo:
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 você não precisa oferecer suporte, mas estão incluídas para referência:
0/1 -> 0/1 (0/1 is considered the left number)
1/0 -> 1/1 (1/0 is considered the rightmost number)
O programa mais curto em qualquer idioma para atingir esse objetivo vence.
1/1 => 1
, 1/2 => 2
, 2/1 => 3
, 1/3 => 4
, etc.). Se o número assim gerado para um nó for n
, então 2^lg n
(log binário) será o bit mais alto configurado n
e a fração binária desejada será (2*(n - 2^lg n) + 1) / 2^(lg n + 1)
. (Qualquer pessoa que tente uma solução de assembler em um conjunto de instruções com um bit de maior valor definido provavelmente desejará usar essa abordagem).