Relación entre el número e y los números primos en Haskell
En el artículo ¿Qué tiene que ver el número e con los números primos? de Gaussianos se comenta una curiosa relación entre los números primos y el número . Dicha relación se expresa mediante la fórmula
donde
A partir del artículo, he diseñado este ejercicio de Haskell para Informática (del Grado de Matemáticas).
El objetivo del ejercicio es la comprobación de la fórmula anterior.
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
-- --------------------------------------------------------------------- -- Ejercicio 1. Definir la función -- criba :: [Integer] -> [Integer] -- tal que (criba xs) es la lista formada por el primer elemento de xs y -- los restantes elementos de xs que no son múltiplos del primero. Por -- ejemplo, -- criba [2..20] == [2,3,5,7,11,13,17,19] -- --------------------------------------------------------------------- criba :: [Integer] -> [Integer] criba (p:xs) = p : criba [x | x <- xs, x `mod` p /= 0] criba [] = [] -- --------------------------------------------------------------------- -- Ejercicio 2. Definir la constante -- primos :: [Integer] -- tal que primos es la lista de los números primos, obtenida mediante -- la criba de Erastótenes. Por ejemplo, -- take 10 primos == [2,3,5,7,11,13,17,19,23,29] -- --------------------------------------------------------------------- primos :: [Integer] primos = criba [2..] -- --------------------------------------------------------------------- -- Ejercicio 3. Definir la función -- productos :: [Integer] -> [Integer] -- tal que (productos xs) es la lista cuyo elemento i-ésimo es el -- producto de los primeros i elementos de la lista xs. Por ejemplo, -- productos [2,5,3] == [2,10,30] -- --------------------------------------------------------------------- productos :: [Integer] -> [Integer] productos = scanl1 (*) -- --------------------------------------------------------------------- -- Ejercicio 4. Definir la función -- raices :: [Integer] -> [Integer] -> [Double] -- tal que (raices xs ys) es la lista cuyo elemento i-ésimo es la raiz -- n-ésima (donde n es el elemento i-ésimo) de ys del elemento i-ésimo -- de xs. Por ejemplo, -- raices [9,16] [2,4] == [3.0,2.0] -- --------------------------------------------------------------------- raices :: [Integer] -> [Integer] -> [Double] raices xs ys = [raiz x y | (x,y) <- zip xs ys] where raiz x y = (fromIntegral x)**(1/fromIntegral y) -- --------------------------------------------------------------------- -- Ejercicio 5. Definir la constante -- aproximaciones :: [Double] -- tal que aproximaxiones es la lista cuyo elemento n-ésimo es la raiz x -- de y, donde x es el primo n-ésimo e y es el producto de los n -- primeros primos. Por ejemplo, -- *Main> aproximaciones !! 3º -- 2.1465727583654437 -- *Main> (2*3*5*7)**(1/7) -- 2.1465727583654437 -- *Main> take 10 aproximaciones -- [1.4142135623730951, 1.8171205928321397, 1.97435048583482, -- 2.1465727583654437, 2.0220081756858095, 2.2101784152470247, -- 2.166531242132804, 2.331976113436929, 2.3066284202455836, -- 2.179246384231885, 2.3152002502547053, 2.2276652067865403] -- --------------------------------------------------------------------- aproximaciones :: [Double] aproximaciones = raices (productos primos) primos -- --------------------------------------------------------------------- -- Ejercicio 6. Definir la función -- diferencias :: [Double] -- tal que diferencias es la lista de las diferencias entre el número e -- y los elementos de aproximaciones. Por ejemplo, -- *Main> take 9 (drop 100 diferencias) -- [0.16791998034067301, 0.18180048551530215, 0.17842552082790863, -- 0.17507000227890757, 0.15503537816766544, 0.15187848954545435, -- 0.16517883928217003, 0.16189887057697439, 0.15863750404991395] -- --------------------------------------------------------------------- diferencias :: [Double] diferencias = [e - x | x <- aproximaciones] where e = exp 1 -- --------------------------------------------------------------------- -- Ejercicio 7. Conjeturar cuál es el límite de las aproximaciones. -- --------------------------------------------------------------------- -- Solución: El límite de las aproximaciones es el número e. -- --------------------------------------------------------------------- -- Nota. Una demostración de que el límite de las aproximaciones es el -- número e se encuentra en el artículo "¿Qué tiene que ver el número e -- con los números primos?" que se puede leer en -- http://gaussianos.com/¿que-tiene-que-ver-el-numero-e-con-los-numeros-primos -- --------------------------------------------------------------------- |