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]  |