Distancias entre primos consecutivos
Los 15 primeros números primos son
1 |
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47 |
Las distancias entre los elementos consecutivos son
1 |
1, 2, 2, 4, 2, 4, 2, 4, 6, 2, 6, 4, 2, 4 |
La distribución de las distancias es
1 |
(1,1), (2,6), (4,5), (6,2) |
(es decir, el 1 aparece una vez, el 2 aparece 6 veces, etc.) La frecuencia de las distancias es
1 |
(1,7.142857), (2,42.857143), (4,35.714287), (6,14.285714) |
(es decir, el 1 aparece el 7.142857%, el 2 el 42.857143% etc.)
Definir las funciones
1 2 3 4 |
cuentaDistancias :: Int -> [(Int,Int)] frecuenciasDistancias :: Int -> [(Int,Float)] graficas :: [Int] -> IO () distanciasMasFrecuentes :: Int -> [Int] |
tales que
- (cuentaDistancias n) es la distribución de distancias entre los n primeros primos consecutivos. Por ejemplo,
1 2 3 4 |
λ> cuentaDistancias 15 [(1,1),(2,6),(4,5),(6,2)] λ> cuentaDistancias 100 [(1,1),(2,25),(4,26),(6,25),(8,7),(10,7),(12,4),(14,3),(18,1)] |
- (frecuenciasDistancias n) es la frecuencia de distancias entre los n primeros primos consecutivos. Por ejemplo,
1 2 3 4 |
λ> frecuenciasDistancias 15 [(1,7.142857),(2,42.857143),(4,35.714287),(6,14.285714)] λ> frecuenciasDistancias 30 [(1,3.4482758),(2,34.482758),(4,34.482758),(6,24.137932),(8,3.4482758)] |
- (graficas ns) dibuja las gráficas de (frecuenciasDistancias k) para k en ns. Por ejemplo,
(graficas [10,20,30])
dibuja
(graficas [1000,2000,3000])
dibuja
y(graficas [100000,200000,300000])
dibuja
- (distanciasMasFrecuentes n) es la lista de las distancias más frecuentes entre los elementos consecutivos de la lista de los n primeros primos. Por ejemplo,
1 2 3 4 5 6 7 |
distanciasMasFrecuentes 15 == [2] distanciasMasFrecuentes 26 == [2,4] distanciasMasFrecuentes 32 == [4] distanciasMasFrecuentes 41 == [2,4,6] distanciasMasFrecuentes 77 == [6] distanciasMasFrecuentes 160 == [4,6] distanciasMasFrecuentes (10^6) == [6] |
Comprobar con QuickCheck si para todo n > 160 se verifica que (distanciasMasFrecuentes n) es [6].
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 |
import Data.Numbers.Primes import qualified Data.Map as M import Graphics.Gnuplot.Simple import Test.QuickCheck cuentaDistancias :: Int -> [(Int,Int)] cuentaDistancias = M.toList . dicDistancias dicDistancias :: Int -> M.Map Int Int dicDistancias n = M.fromListWith (+) (zip (distancias n) (repeat 1)) distancias :: Int -> [Int] distancias n = zipWith (-) (tail xs) xs where xs = take n primes frecuenciasDistancias :: Int -> [(Int,Float)] frecuenciasDistancias n = [(k,(100 * fromIntegral x) / n1) | (k,x) <- cuentaDistancias n] where n1 = fromIntegral (n-1) graficas :: [Int] -> IO () graficas ns = plotLists [Key Nothing] (map frecuenciasDistancias ns) distanciasMasFrecuentes :: Int -> [Int] distanciasMasFrecuentes n = M.keys (M.filter (==m) d) where d = dicDistancias n m = maximum (M.elems d) -- La propiedad es prop_distanciasMasFrecuentes :: Int -> Bool prop_distanciasMasFrecuentes n = distanciasMasFrecuentes (161 + abs n) == [6] |