2015 y los números pitagóricos
Un número pitagórico es un número natural cuyo cuadrado se puede escribir como la suma de los cuadrados de dos números naturales no nulos; es decir, el número natural a es pitagórico si existen dos números naturales b y c distintos de cero tales que a² = b²+c². Por ejemplo, 5 es un número pitagórico ya que 5² = 3²+4² y también lo es 2015 ya que 2015² = 1612²+1209².
Definir la sucesión
1 |
pitagoricos :: [Integer] |
cuyos elementos son los números pitagóricos. Por ejemplo,
1 2 |
ghci> take 20 pitagoricos [5,10,13,15,17,20,25,26,29,30,34,35,37,39,40,41,45,50,51,52] |
Calcular la posición de 2015 en la sucesión.
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 38 39 40 41 42 43 44 45 46 |
import Test.QuickCheck -- 1ª definición -- ============= pitagoricos :: [Integer] pitagoricos = [n | n <- [1..], esPitagorico n] -- (esPitagorico n) se verifica si n es pitagórico. Por ejemplo, -- esPitagorico 5 == True -- esPitagorico 6 == False esPitagorico :: Integer -> Bool esPitagorico n = not (null (ternasPitagoricas n)) -- (ternasPitagoricas n) es la lista de las ternas (n,a,b) tales que -- n² = a²+b² con b < a < n. Por ejemplo, -- ghci> ternasPitagoricas 5 -- [(5,4,3)] -- ghci> ternasPitagoricas 2015 -- [(2015,1612,1209),(2015,1736,1023),(2015,1860,775),(2015,1953,496)] ternasPitagoricas :: Integer -> [(Integer,Integer,Integer)] ternasPitagoricas n = [(n,a,b) | a <- [1..n-1], let b2 = n^2-a^2, let b = round (sqrt (fromIntegral b2)), b < a, b^2 == b2] -- 2ª definición -- ============= pitagoricos2 :: [Integer] pitagoricos2 = [round (sqrt (fromIntegral a)) | a <- cuadrados, let xs = takeWhile (< a) cuadrados, any (\b -> a-b `elem` xs) xs] -- cuadrados es la lista de los cuadrados de los números naturales. Por -- ejemplo, -- take 10 cuadrados == [1,4,9,16,25,36,49,64,81,100] cuadrados :: [Integer] cuadrados = [n*n | n <- [1..]] -- El cálculo de la posición de 2015 es -- ghci> length (takeWhile (< 2015) pitagoricos) -- 1195 |
2 Comentarios