Períodos de Fibonacci
Los primeros términos de la sucesión de Fibonacci son
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
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
0,1,1,2,0,2,2,1
Definir las funciones
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,
λ> 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,
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,
λ> 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
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)