Sucesión de Rowland
Definir las siguientes sucesiones
1 2 3 |
sucesionA :: [Integer] sucesionB :: [Integer] sucesionRowland :: [Integer] |
tales que
- el término n-ésimo de la sucesionA es a(n) definido por a(1) = 7 y a(n) = a(n-1) + mcd(n, a(n-1)), para n > 1. Por ejemplo,
1 2 |
λ> take 20 sucesionA [7,8,9,10,15,18,19,20,21,22,33,36,37,38,39,40,41,42,43,44] |
- los términos de la sucesionB son las diferencias de los términos consecutivos de la sucesionA. Por ejemplo,
1 2 |
λ> take 30 sucesionB [1,1,1,5,3,1,1,1,1,11,3,1,1,1,1,1,1,1,1,1,1,23,3,1,1,1,1,1,1,1] |
- los términos de la sucesionRowland son los términos de la sucesionB distintos de 1. Por ejemplo,\0
1 2 3 4 |
λ> take 20 sucesionRowland [5,3,11,3,23,3,47,3,5,3,101,3,7,11,3,13,233,3,467,3] λ> sucesionRowland !! 92 15567089 |
Comprobar con QuickCheck que los elementos de la sucesionRowland son números primos.
Nota: Eric S. Rowland demostró en A natural prime-generating recurrence que los elementos de la sucesionRowland son números primos.
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import Data.Numbers.Primes (isPrime) import Test.QuickCheck (Property, (==>), quickCheck) sucesionA :: [Integer] sucesionA = 7 : zipWith (+) sucesionA (zipWith gcd sucesionA [2..]) sucesionB :: [Integer] sucesionB = zipWith (-) (tail sucesionA) sucesionA sucesionRowland :: [Integer] sucesionRowland = filter (> 1) sucesionB -- La propiedad es prop_sucesionRowland :: Int -> Property prop_sucesionRowland n = n >= 0 ==> isPrime (sucesionRowland !! n) -- La comprobación es -- λ> quickCheck prop_sucesionRowland -- +++ OK, passed 100 tests. |
Nuevas soluciones
- En los comentarios se pueden escribir nuevas soluciones.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
7 Comentarios