A sequência de Fibonacci é uma sequência bem conhecida, na qual cada entrada é a soma das duas anteriores e as duas primeiras são 1. Se tomarmos o módulo de cada termo por uma constante, a sequência se tornará periódica. Por exemplo, se decidimos computar a sequência mod 7, obteríamos o seguinte:
1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0 1 1 ...
Tem um período de 16. Uma sequência relacionada, denominada sequência de Pisano , é definida de modo que a(n)
seja o período da sequência de fibonacci quando calculado no módulo n.
Tarefa
Você deve escrever um programa ou função que, quando fornecido n
, calculará e produzirá o período do mod de sequência de Fibonacci n
. Esse é o enésimo termo na sequência de Pisano.
Você deve suportar apenas números inteiros no intervalo 0 < n < 2^30
Como é uma competição de código-golfe , você deve minimizar o tamanho do seu código-fonte, conforme marcado por bytes.
Casos de teste
1 -> 1
2 -> 3
3 -> 8
4 -> 6
5 -> 20
6 -> 24
7 -> 16
8 -> 12
9 -> 24
10 -> 60
11 -> 10
12 -> 24
f(i),f(i+1)
pode levar no máximo n^2
valores mod n
. Assim, n
limitado a 2^30
pode acabar produzindo um período de até 2^60
. Restringir n <= 2^16
daria P(n) <= 2^32
.
f(i+2) = f(i+1)+f(i)
, para que o 'estado' de uma máquina em loop durante o período possa ser descrito com um par de números inteiros mod n
. Existem no máximo n^2
estados, portanto o período é no máximo n^2
. Oh! A Wikipedia afirma que o período é no máximo 6n
. Deixa pra lá minha trivialidade.