Períodos de Fibonacci
Los primeros términos de la sucesión de Fibonacci son
1 |
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610 |
Al calcular sus restos módulo 3 se obtiene
1 |
0,1,1,2,0,2,2,1, 0,1,1,2,0,2,2,1 |
Se observa que es periódica y su período es
1 |
0,1,1,2,0,2,2,1 |
Definir las funciones
1 2 3 4 |
fibsMod :: Integer -> [Integer] periodoFibMod :: Integer -> [Integer] longPeriodosFibMod :: [Int] graficaLongPeriodosFibMod :: Int -> IO () |
tales que
- (fibsMod n) es la lista de los términos de la sucesión de Fibonacci módulo n. Por ejemplo,
1 2 3 4 |
λ> take 24 (fibsMod 3) [0,1,1,2,0,2,2,1, 0,1,1,2,0,2,2,1, 0,1,1,2,0,2,2,1] λ> take 24 (fibsMod 4) [0,1,1,2,3,1, 0,1,1,2,3,1, 0,1,1,2,3,1, 0,1,1,2,3,1] |
- (periodoFibMod n) es la parte perioica de la sucesión de Fibonacci módulo n. Por ejemplo,
1 2 3 |
periodoFibMod 3 == [0,1,1,2,0,2,2,1] periodoFibMod 4 == [0,1,1,2,3,1] periodoFibMod 7 == [0,1,1,2,3,5,1,6,0,6,6,5,4,2,6,1] |
- longPeriodosFibMod es la sucesión de las longitudes de los períodos de las sucesiones de Fibonacci módulo n, para n > 0. Por ejemplo,
1 2 |
λ> take 20 longPeriodosFibMod [1,3,8,6,20,24,16,12,24,60,10,24,28,48,40,24,36,24,18,60] |
- (graficaLongPeriodosFibMod n) dibuja la gráfica de los n primeros términos de la sucesión longPeriodosFibMod. Por ejemplo, (graficaLongPeriodosFibMod n) dibuja
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import Graphics.Gnuplot.Simple fibsMod :: Integer -> [Integer] fibsMod n = map (`mod` n) fibs -- fibs es la sucesión de Fibonacci. Por ejemplo, -- λ> take 20 fibs -- [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181] fibs :: [Integer] fibs = 0 : 1 : zipWith (+) fibs (tail fibs) periodoFibMod :: Integer -> [Integer] periodoFibMod 1 = [0] periodoFibMod n = 0 : 1 : aux (drop 2 (fibsMod n)) where aux (0:1:xs) = [] aux (a:b:xs) = a : aux (b:xs) longPeriodosFibMod :: [Int] longPeriodosFibMod = [length (periodoFibMod n) | n <- [1..]] -- 2ª definición de longPeriodosFibMod -- =================================== longPeriodosFibMod2 :: [Int] longPeriodosFibMod2 = map longPeriodoFibMod [1..] longPeriodoFibMod :: Integer -> Int longPeriodoFibMod 1 = 1 longPeriodoFibMod n = aux 1 (tail (fibsMod n)) 0 where aux 0 (1 : xs) k = k aux _ (x : xs) k = aux x xs (k + 1) graficaLongPeriodosFibMod :: Int -> IO () graficaLongPeriodosFibMod n = plotList [ Key Nothing , Title ("graficaLongPeriodosFibMod " ++ show n) , PNG ("Periodos_de_Fibonacci " ++ show n ++ ".png")] (take n longPeriodosFibMod) |
Otra definición inspirada en tu idea:
Para que la definición de jaibengue no tenga el mismo problema que la de angruicam1 habría que demostrar que para todo n, la longitud del período no es mayor que n^2+1.
En la definición de angruicam1, al limitar la longitud del vector a 2000 da respuestas erróneas para los números con períodos de más de 2000 elementos. Por ejemplo,
pero debería de dar 2700.
Un intento de definición sin argumentos: