Sumas de potencias que son cuadrados perfectos
El 2º problema de la ONEM (Olimpíada Nacional Escolar de Matemática) de Mayo del 2020 dice
Determinar si existen enteros positivos a, b y c, no necesariamente distintos, tales que y es un cuadrado perfecto.
Definir la función
1 |
soluciones :: Integer -> Integer -> [(Integer,Integer,Integer)] |
tales que (soluciones k n) es la lista de las ternas no decrecientes (a,b,c) tales que que a+b+c=n y k^a + k^b + k^c es un cuadrado perfecto. Por ejemplo,
1 2 3 |
soluciones 2 19 == [(2,6,11),(2,7,10),(4,7,8),(5,5,9),(6,6,7)] soluciones 3 19 == [] take 2 (soluciones 2 2020) == [(2,674,1344),(4,674,1342)] |
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 |
soluciones :: Integer -> Integer -> [(Integer,Integer,Integer)] soluciones k n = [(a,b,c) | a <- [1..n `div` 3], b <- [a..n-a], let c = n-a-b, c >= b, esCuadradoPerfecto (k^a + k^b + k^c)] -- (esCuadradoPerfecto x) se verifica si x es un cuadrado perfecto. Por -- ejemplo, -- esCuadradoPerfecto 16 == True -- esCuadradoPerfecto 27 == False esCuadradoPerfecto :: Integer -> Bool esCuadradoPerfecto x = (raizEntera x)^2 == x -- (raizEntera x) es el mayor entero cuyo cuadrado es menor o igual que -- x. Por ejemplo, -- raizEntera 16 == 4 -- raizEntera 27 == 5 raizEntera :: Integer -> Integer raizEntera x = aux (1,x) where aux (a,b) | d == x = c | c == a = c | d < x = aux (c,b) | otherwise = aux (a,c) where c = (a+b) `div` 2 d = c^2 |
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>
La definición esPerfecto es incorrecta. Por ejemplo,
pero 10^64 es un cuadrado perfecto (es el cuadrado de 10^32)
El fallo está en el uso de número decimales. Por ejemplo.