Se dice que un número entero está entre potencias sucesivas de n si x-1 es una potencia n-ésima y x+1 es una potencia (n+1)-ésima; es decir, si existen a y b tales que x-1 es a^n y x+1 es b^(n+1). Por ejemplo,
2 está entre potencias sucesivas de 0, ya que 1 = 1^0 y 3 = 3^1 15 está entre potencias sucesivas de 1, ya que 14 = 14^1 y 16 = 4^2 26 está entre potencias sucesivas de 2, ya que 25 = 5^2 y 27 = 3^3 |
Definir las funciones
entrePotencias :: Integer -> Integer -> Bool pares :: [(Integer,Integer)] paresEntrePotencias :: [(Integer,Integer)] |
tales que
- (entrePotencias n x) se verifica si x está entre potencias sucesivas de n. Por ejemplo,
entrePotencias 0 2 == True entrePotencias 1 15 == True entrePotencias 2 26 == True |
- pares es la lista de los números enteros ordenados por su suma y primer elemento. Por ejemplo,
λ> take 11 pares [(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(0,3),(1,2),(2,1),(3,0),(0,4)] |
- paresEntrePotencias es la lista de los pares (n,x) tales que x está entre potencias sucesivas de n. Por ejemplo,
λ> take 10 paresEntrePotencias [(1,0),(0,2),(1,3),(1,8),(1,15),(1,24),(2,26),(1,35),(1,48),(1,63)] |
Comprobar con QuickCheck que 26 es el único número que está entre potencias sucesivas con exponentes mayor que 1; es decir, que el único par (n,x) tal que x está entre potencias sucesivas de n con n mayor que uno es el (2,26).
Nota: Este ejercicio ha sido propuesto por Rebeca Isabel González Gordillo y está basado en el artículo El número 26 … ¡un número especial! de Amadeo Artacho en MatematicasCercanas.
Soluciones
import Test.QuickCheck entrePotencias :: Integer -> Integer -> Bool entrePotencias n x = esPotencia n (x-1) && esPotencia (n+1) (x+1) -- (esPotencia n x) se verifica si x es una potencia n-ésima. Por -- ejemplo, -- esPotencia 3 27 == True -- esPotencia 3 25 == False esPotencia :: Integer -> Integer -> Bool esPotencia n x = x == r^n where r = ceiling ((fromIntegral x)**(1/fromIntegral n)) pares :: [(Integer,Integer)] pares = [(x,n-x) | n <- [0..], x <- [0..n]] paresEntrePotencias :: [(Integer,Integer)] paresEntrePotencias = [(n,x) | (n,x) <- pares , entrePotencias n x] prop_entrePotencias :: Integer -> Integer -> Property prop_entrePotencias n x = n > 1 ==> entrePotencias n x == ((n,x) == (2,26)) -- La comprobación es -- λ> quickCheck prop_entrePotencias -- +++ OK, passed 100 tests. |
Otras soluciones
- Se pueden escribir otras soluciones en los comentarios.
- El código se debe escribir entre una línea con <pre lang=”haskell”> y otra con </pre>
Pensamiento
“El verdadero objetivo de la ciencia es el honor de la mente humana.”
Una solución de “Entre dos potencias sucesivas”