(graficas xs) dibuja la gráfica de las k-ésimas aproximaciones de pi, donde k toma los valores de la lista xs, con las fórmulas de Gregory-Leibniz y de Beeler. Por ejemplo, (graficas [1..25]) dibuja
donde la línea morada corresponde a la aproximación de Gregory-Leibniz y la verde a la de Beeler.
Soluciones
import Graphics.Gnuplot.Simple
-- Definiciones de aproximaPiGL-- ============================-- 1ª definición de aproximaPiGL
aproximaPiGL ::Int->Double
aproximaPiGL n =4*(sum . take n . sumaA . zipWith(/)[1,1..])[1,3..]where sumaA (x:y:xs)= x:(-y):sumaA xs
-- 2ª definición de aproximaPiGL
aproximaPiGL2 ::Int->Double
aproximaPiGL2 n =4*(sum(take n (zipWith(/)(cycle[1,-1])[1,3..])))-- 3ª definición de aproximaPiGL
aproximaPiGL3 ::Int->Double
aproximaPiGL3 n =4*(sum . take n . zipWith(/)(cycle[1,-1]))[1,3..]-- 4ª definición de aproximaPiGL
aproximaPiGL4 ::Int->Double
aproximaPiGL4 n = serieGL !!(n-1)
serieGL ::[Double]
serieGL =scanl1(+)(zipWith(/) numeradores denominadores)where numeradores =cycle[4,-4]
denominadores =[1,3..]-- Definición de aproximaPiBeeler
aproximaPiBeeler ::Int->Double
aproximaPiBeeler n =2* aux (fromIntegral n)1where
aux ::Double->Double->Double
aux n k | n == k =1|otherwise=1+(k/(2*k+1))* aux n (1+k)-- Definición de graficas
graficas ::[Int]->IO()
graficas xs =
plotLists [Key Nothing][[(k,aproximaPiGL k)| k <- xs],
[(k,aproximaPiBeeler k)| k <- xs]]
import Graphics.Gnuplot.Simple
-- Definiciones de aproximaPiGL
-- ============================
-- 1ª definición de aproximaPiGL
aproximaPiGL :: Int -> Double
aproximaPiGL n = 4 * (sum . take n . sumaA . zipWith (/) [1,1..]) [1,3..]
where sumaA (x:y:xs) = x:(-y):sumaA xs
-- 2ª definición de aproximaPiGL
aproximaPiGL2 :: Int -> Double
aproximaPiGL2 n =
4 * (sum (take n (zipWith (/) (cycle [1,-1]) [1,3..])))
-- 3ª definición de aproximaPiGL
aproximaPiGL3 :: Int -> Double
aproximaPiGL3 n =
4 * (sum . take n . zipWith (/) (cycle [1,-1])) [1,3..]
-- 4ª definición de aproximaPiGL
aproximaPiGL4 :: Int -> Double
aproximaPiGL4 n = serieGL !! (n-1)
serieGL :: [Double]
serieGL = scanl1 (+) (zipWith (/) numeradores denominadores)
where numeradores = cycle [4,-4]
denominadores = [1,3..]
-- Definición de aproximaPiBeeler
aproximaPiBeeler :: Int -> Double
aproximaPiBeeler n = 2 * aux (fromIntegral n) 1
where
aux :: Double -> Double -> Double
aux n k | n == k = 1
| otherwise = 1 + (k/(2*k+1)) * aux n (1+k)
-- Definición de graficas
graficas :: [Int] -> IO ()
graficas xs =
plotLists [Key Nothing]
[[(k,aproximaPiGL k) | k <- xs],
[(k,aproximaPiBeeler k) | k <- xs]]
Otras soluciones
Se pueden escribir otras soluciones en los comentarios.
El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
Un número primo distinto de 2 tiene la forma 4k + 1 o 4k + 3. Chebyshev notó en 1853 que la mayoría de las veces hay más números primos de la forma 4k + 3 que números primos de la forma 4k + 1 menores que un número dado. Esto se llama el sesgo de Chebyshev.
distribucionPrimosModulo4 es la lista de las ternas (p,a,b) tales que p es un números primo, a es la cantidad de primos menores o iguales que p congruentes con 1 módulo 4 y b es la cantidad de primos menores o iguales que p congruentes con 3 módulo 4. Por ejemplo,
λ> take 7 distribucionPrimosModulo4
[(2,0,0),(3,0,1),(5,1,1),(7,1,2),(11,1,3),(13,2,3),(17,3,3)]
λ> distribucionPrimosModulo4 !! (5*10^5)
(7368791,249888,250112)
λ> take 7 distribucionPrimosModulo4
[(2,0,0),(3,0,1),(5,1,1),(7,1,2),(11,1,3),(13,2,3),(17,3,3)]
λ> distribucionPrimosModulo4 !! (5*10^5)
(7368791,249888,250112)
empatesRestosModulo4 es la lista de los primos p tales que la cantidad de primos menores o iguales que p congruentes con 1 módulo 4 es igual a la cantidad de primos menores o iguales que p congruentes con 3 módulo 4. Por ejemplo,
mayoria1RestosModulo4 es la lista de los primos p tales que la cantidad de primos menores o iguales que p congruentes con 1 módulo 4 es mayor que la cantidad de primos menores o iguales que p congruentes con 3 módulo 4. Por ejemplo,
(graficaChebyshev n) dibuja la gráfica de los puntos (p,b-a) donde p es uno de los n primeros primos impares, a es la cantidad de primos menores o iguales que p congruentes con 1 módulo 4 y b es la cantidad de primos menores o iguales que p congruentes con 3 módulo 4. Por ejemplo, (graficaChebyshev 5000) dibuja la figura
Soluciones
[schedule expon=’2020-03-30′ expat=»06:00″]
Las soluciones se pueden escribir en los comentarios.
El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
Pensamiento
«El valor de un problema no es tanto el de encontrar la respuesta como el de las ideas e intentos que obliga su resolución.»
Un número entero n es libre de cuadrados si no existe un número primo p tal que p² divide a n; es decir, los factores primos de n son todos distintos.
La función de Möbius μ(n) está definida para todos los enteros positivos como sigue:
μ(n) = 1 si n es libre de cuadrados y tiene un número par de factores primos.
μ(n) = -1 si n es libre de cuadrados y tiene un número impar de factores primos.
μ(n) = 0 si n no es libre de cuadrados.
Sus primeros valores son 1, -1, -1, 0, -1, 1, -1, 0, 0, 1, …
La función de Mertens M(n) está definida para todos los enteros positivos como la suma de μ(k) para 1 ≤ k ≤ n. Sus primeros valores son 1, 0, -1, -1, -2, -1, -2, -2, …
Para todo entero x mayor que 1, el valor absoluto de la función de Mertens en x es menor que la raíz cuadrada de x.
La conjetura fue planteada por Franz Mertens en 1897. Riele Odlyzko, demostraronen 1985 que la conjetura de Mertens deja de ser cierta más o menos a partir de , cifra que luego de algunos refinamientos se redujo a .
(graficaMertens n) dibuja la gráfica de la función de Mertens, la raíz cuadrada y el opuestos de la raíz cuadrada para los n primeros n enteros positivos. Por ejemplo, (graficaMertens 1000) dibuja
se pueden calcular el número pi con la precisión que se desee. Por ejemplo,
λ> import Data.Number.CReal
λ> showCReal 60 pi
"3.141592653589793238462643383279502884197169399375105820974945"
λ> import Data.Number.CReal
λ> showCReal 60 pi
"3.141592653589793238462643383279502884197169399375105820974945"
importa la librería y calcula el número pi con 60 decimales.
La distribución de las diferencias de los dígitos consecutivos para los 18 primeros n dígitos de pi se calcula como sigue: los primeros 18 dígitos de pi son
(graficas ns f) dibuja en el fichero f las gráficas de las distribuciones de las diferencias de los dígitos consecutivos para los primeros n dígitos de pi, para n en ns. Por ejemplo, al evaluar (graficas [100,250..4000] «distribucionDDCpi.png» se escribe en el fichero «distribucionDDCpi.png» la siguiente gráfica
Soluciones
import Data.Number.CReal
import Graphics.Gnuplot.Simple
import Data.Array
-- λ> digitosPi 18-- [3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2,3]
digitosPi ::Int->[Int]
digitosPi n =init[read[c]| c <-(x:xs)]where(x:_:xs)= showCReal n pi-- λ> diferenciasConsecutivos (digitosPi 18)-- [2,-3,3,-4,-4,7,-4,1,2,-2,-3,-1,2,-2,6,1,-1]
diferenciasConsecutivos ::Num a =>[a]->[a]
diferenciasConsecutivos xs =zipWith(-) xs (tail xs)
distribucionDDCpi ::Int->[Int]
distribucionDDCpi =
distribucion . diferenciasConsecutivos . digitosPi
where distribucion xs =
elems (accumArray (+)0(-9,9)(zip xs (repeat1)))
graficas ::[Int]-> FilePath ->IO()
graficas ns f =
plotLists [Key Nothing, PNG f][puntos n | n <- ns]where puntos ::Int->[(Int,Int)]
puntos n =zip[-9..9](distribucionDDCpi n)
import Data.Number.CReal
import Graphics.Gnuplot.Simple
import Data.Array
-- λ> digitosPi 18
-- [3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2,3]
digitosPi :: Int -> [Int]
digitosPi n = init [read [c] | c <- (x:xs)]
where (x:_:xs) = showCReal n pi
-- λ> diferenciasConsecutivos (digitosPi 18)
-- [2,-3,3,-4,-4,7,-4,1,2,-2,-3,-1,2,-2,6,1,-1]
diferenciasConsecutivos :: Num a => [a] -> [a]
diferenciasConsecutivos xs =
zipWith (-) xs (tail xs)
distribucionDDCpi :: Int -> [Int]
distribucionDDCpi =
distribucion . diferenciasConsecutivos . digitosPi
where distribucion xs =
elems (accumArray (+) 0 (-9,9) (zip xs (repeat 1)))
graficas :: [Int] -> FilePath -> IO ()
graficas ns f =
plotLists [Key Nothing, PNG f]
[puntos n | n <- ns]
where puntos :: Int -> [(Int,Int)]
puntos n = zip [-9..9] (distribucionDDCpi n)
Pensamiento
Doy consejo, a fuer de viejo:
nunca sigas mi consejo.
apocalipticos es la lista de los números apocalípticos. Por ejemplo,
take 9 apocalipticos == [157,192,218,220,222,224,226,243,245]
apocalipticos !! 55 == 666
take 9 apocalipticos == [157,192,218,220,222,224,226,243,245]
apocalipticos !! 55 == 666
(mayorNoApocalipticoMenor n) es justo el mayor número no apocalíptico menor que n. Por ejemplo,
mayorNoApocalipticoMenor 40000 == Just 29784
mayorNoApocalipticoMenor 29784 == Just 26667
mayorNoApocalipticoMenor 40000 == Just 29784
mayorNoApocalipticoMenor 29784 == Just 26667
(grafica n) dibuja las gráficas de los n primeros términos de la sucesión de los números apocalípticos junto con los de la sucesión a(n) = 3715+n. Por ejemplo, (grafica 3000) dibuja
y (grafica 30000) dibuja
Nota: Este ejercicio ha sido propuesto por Ángel Ruiz Campos.
Soluciones
import Data.List (isInfixOf, find, genericTake)import Graphics.Gnuplot.Simple
esApocaliptico ::Integer->Bool
esApocaliptico = isInfixOf "666" . show . (2^)
apocalipticos ::[Integer]
apocalipticos =filter esApocaliptico [1..]
mayorNoApocalipticoMenor ::Integer->MaybeInteger
mayorNoApocalipticoMenor n = find (not . esApocaliptico)[n-1,n-2..1]
grafica ::Integer->IO()
grafica n =
plotLists [ Key Nothing
, PNG ("Numeros_apocalipticos_"++show n ++".png")][ genericTake n apocalipticos
, [3715..3715+n-1]]