La sequenza di Fibonacci è una sequenza ben nota in cui ogni voce è la somma delle due precedenti e le prime due voci sono 1. Se prendiamo il modulo di ciascun termine da una costante, la sequenza diventerà periodica. Ad esempio, se decidessimo di calcolare la sequenza mod 7, avremmo ottenuto quanto segue:
1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0 1 1 ...
Questo ha un periodo di 16. Una sequenza correlata, chiamata sequenza di Pisano , è definita in modo tale che a(n)
è il periodo della sequenza fibonacci quando calcolato modulo n.
Compito
Dovresti scrivere un programma o una funzione che, una volta dato n
, calcolerà ed emetterà il periodo della mod di sequenza di Fibonacci n
. Questo è l'ennesimo termine nella sequenza di Pisano.
È necessario supportare solo numeri interi sull'intervallo 0 < n < 2^30
Questa è una competizione di code-golf , quindi dovresti mirare a ridurre al minimo le dimensioni del tuo codice sorgente come segnato da byte.
Casi test
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)
può assumere al massimo i n^2
valori mod n
. Pertanto, n
limitato a 2^30
potrebbe finire producendo un periodo fino a 2^60
. Limitare n <= 2^16
darebbe P(n) <= 2^32
.
f(i+2) = f(i+1)+f(i)
, quindi, lo 'stato' di un ciclo macchina nel periodo può essere descritto con una coppia di numeri interi mod n
. Ci sono al massimo n^2
stati, quindi il periodo è al massimo n^2
. Oh! Wikipedia afferma che il periodo è al massimo 6n
. Non importa la mia banalità.