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 [latex]a+b+c=2020[/latex] y [latex]2^a + 2^b + 2^c[/latex] es un cuadrado perfecto.
Definir la función
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,
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
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