0votos

Primos gemelos en Haskell

por josejuan hace 6 años

Puede calcularse "directamente" usando módulos. También nadie se ha fijado que (excepto [3, 5]) el valor medio debe ser múltiplo de 6.

Reto muy sencillo consistente en determinar si dos números son o no primos gemelos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
gemelos n m =                                                 -- 'n' y 'm' son gemelos si 
  if n > m                                                    -- siendo mayor 'n' 
  then gemelos m n                                            -- es gemelo el par 'm' y 'n' 
  else and [                                                  -- o si siendo menor (igual) 'n' 
         m == (n + 2),                                        -- se llevan dos unidades de diferencia 
         n `mod` 2 == 1,                                      -- y 'n' es impar (luego también 'm') 
         (n + 1) `mod` 6 == 0,                                -- y el número de en medio es múltiplo de 6 
         mod' (4 * (1 + product [1..n - 1])) == mod' (z - n)  -- o si se cumple que   4((n-1)!+1) = -n (MOD nm) 
  where z = n * (n + 2) 
        mod' y = mod y z 
 
 
-- NOTA: lo de "directamente" es porque el factorial de un número puede calcularse directamente, aunque numéricamente no es factible y tiene un coste O(n(log n log log n)^2). Es mejor por tanto, usar un test de primalidad sobre 'n' y 'm' (eg. con AKS). 
1 comentario
0votos

Escrito por josejuan hace 6 años

Obviamente no se está controlando el par [3, 5]... :P

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.