Divisores propios maximales
Se dice que a es un divisor propio maximal de un número b si a es un divisor de b distinto de b y no existe ningún número c tal que a < c < b, a es un divisor de c y c es un divisor de b. Por ejemplo, 15 es un divisor propio maximal de 30, pero 5 no lo es.
Definir las funciones
divisoresPropiosMaximales :: Integer -> [Integer] nDivisoresPropiosMaximales :: Integer -> Integer
tales que
- (divisoresPropiosMaximales x) es la lista de los divisores propios maximales de x. Por ejemplo,
divisoresPropiosMaximales 30 == [6,10,15] divisoresPropiosMaximales 420 == [60,84,140,210] divisoresPropiosMaximales 7 == [1] length (divisoresPropiosMaximales (product [1..3*10^4])) == 3245
- (nDivisoresPropiosMaximales x) es el número de divisores propios maximales de x. Por ejemplo,
nDivisoresPropiosMaximales 30 == 3 nDivisoresPropiosMaximales 420 == 4 nDivisoresPropiosMaximales 7 == 1 nDivisoresPropiosMaximales (product [1..3*10^4]) == 3245
Grado exponencial
Números primos de Pierpont
Un número primo de Pierpont es un número primo de la forma \(2^{u}3^{v}+1\), para u y v enteros no negativos.
Definir la sucesión
primosPierpont :: [Integer]
tal que sus elementos son los números primos de Pierpont. Por ejemplo,
λ> take 20 primosPierpont [2,3,5,7,13,17,19,37,73,97,109,163,193,257,433,487,577,769,1153,1297] λ> primosPierpont !! 49 8503057
Intercambio de la primera y última columna de una matriz
Las matrices se pueden representar mediante listas de listas. Por ejemplo, la matriz
8 9 7 6 4 7 6 5 3 2 1 8
se puede representar por la lista
[[8,9,7,6],[4,7,6,5],[3,2,1,8]]
Definir la función
intercambia :: [[a]] -> [[a]]
tal que (intercambia xss) es la matriz obtenida intercambiando la primera y la última columna de xss. Por ejemplo,
λ> intercambia [[8,9,7,6],[4,7,6,5],[3,2,1,8]] [[6,9,7,8],[5,7,6,4],[8,2,1,3]]
Superación de límites
Una sucesión de puntuaciones se puede representar mediante una lista de números. Por ejemplo, [7,5,9,9,4,5,4,2,5,9,12,1]. En la lista anterior, los puntos en donde se alcanzan un nuevo máximo son 7, 9 y 12 (porque son mayores que todos sus anteriores) y en donde se alcanzan un nuevo mínimo son 7, 5, 4, 2 y 1 (porque son menores que todos sus anteriores). Por tanto, el máximo se ha superado 2 veces y el mínimo 4 veces.
Definir las funciones
nuevosMaximos :: [Int] -> [Int] nuevosMinimos :: [Int] -> [Int] nRupturas :: [Int] -> (Int,Int)
tales que
- (nuevosMaximos xs) es la lista de los nuevos máximos de xs. Por ejemplo,
nuevosMaximos [7,5,9,9,4,5,4,2,5,9,12,1] == [7,9,12]
- (nuevosMinimos xs) es la lista de los nuevos mínimos de xs. Por ejemplo,
nuevosMinimos [7,5,9,9,4,5,4,2,5,9,12,1] == [7,5,4,2,1]
- (nRupturas xs) es el par formado por el número de veces que se supera el máximo y el número de veces que se supera el mínimo en xs. Por ejemplo,
nRupturas [7,5,9,9,4,5,4,2,5,9,12,1] == (2,4)
Expresiones aritméticas generales
Las expresiones aritméticas. generales se contruyen con las sumas generales (sumatorios) y productos generales (productorios). Su tipo es
data Expresion = N Int | S [Expresion] | P [Expresion] deriving Show
Por ejemplo, la expresión
(2·(1 + 2 + 1)·(2 + 3)) + 1
se representa por
S [P [N 2, S [N 1, N 2, N 1], S [N 2, N 3]], N 1]
Definir la función
valor :: Expresion -> Int
tal que (valor e) es el valor de la expresión e. Por ejemplo,
λ> valor (S [P [N 2, S [N 1, N 2, N 1], S [N 2, N 3]], N 1]) 41
Entre dos conjuntos
Se dice que un x número se encuentra entre dos conjuntos xs e ys si x es divisible por todos los elementos de xs y todos los elementos de zs son divisibles por x. Por ejemplo, 12 se encuentra entre los conjuntos {2, 6} y {24, 36}.
Definir la función
entreDosConjuntos :: [Int] -> [Int] -> [Int]
tal que (entreDosConjuntos xs ys) es la lista de elementos entre xs e ys (se supone que xs e ys son listas no vacías de números enteros positivos). Por ejemplo,
entreDosConjuntos [2,6] [24,36] == [6,12] entreDosConjuntos [2,4] [32,16,96] == [4,8,16]
Otros ejemplos
λ> (xs,a) = ([1..15],product xs) λ> length (entreDosConjuntos5 xs [a,2*a..10*a]) 270 λ> (xs,a) = ([1..16],product xs) λ> length (entreDosConjuntos5 xs [a,2*a..10*a]) 360
Árbol de computación de Fibonacci
La sucesión de Fibonacci es
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,...
cuyos dos primeros términos son 0 y 1 y los restantentes se obtienen sumando los dos anteriores.
El árbol de computación de su 5º término es
5
/ \
/ \
/ \
/ \
/ \
3 2
/ \ / \
/ \ 1 1
2 1 / \
/ \ / \ 1 0
1 1 1 0
/ \
1 0
que, usando los árboles definidos por
data Arbol = H Int | N Int Arbol Arbol deriving (Eq, Show)
se puede representar por
N 5 (N 3 (N 2 (N 1 (H 1) (H 0)) (H 1)) (N 1 (H 1) (H 0))) (N 2 (N 1 (H 1) (H 0)) (H 1))
Definir las funciones
arbolFib :: Int -> Arbol nElementosArbolFib :: Int -> Int
tales que
- (arbolFib n) es el árbol de computación del n-ésimo término de la sucesión de Fibonacci. Por ejemplo,
λ> arbolFib 5 N 5 (N 3 (N 2 (N 1 (H 1) (H 0)) (H 1)) (N 1 (H 1) (H 0))) (N 2 (N 1 (H 1) (H 0)) (H 1)) λ> arbolFib 6 N 8 (N 5 (N 3 (N 2 (N 1 (H 1) (H 0)) (H 1)) (N 1 (H 1) (H 0))) (N 2 (N 1 (H 1) (H 0)) (H 1))) (N 3 (N 2 (N 1 (H 1) (H 0)) (H 1)) (N 1 (H 1) (H 0)))
- (nElementosArbolFib n) es el número de elementos en el árbol de computación del n-ésimo término de la sucesión de Fibonacci. Por ejemplo,
nElementosArbolFib 5 == 15 nElementosArbolFib 6 == 25 nElementosArbolFib 30 == 2692537
Menor contenedor de primos
El n-ésimo menor contenenedor de primos es el menor número que contiene como subcadenas los primeros n primos. Por ejemplo, el 6º menor contenedor de primos es 113257 ya que es el menor que contiene como subcadenas los 6 primeros primos (2, 3, 5, 7, 11 y 13).
Definir la función
menorContenedor :: Int -> Int
tal que (menorContenedor n) es el n-ésimo menor contenenedor de primos. Por ejemplo,
menorContenedor 1 == 2 menorContenedor 2 == 23 menorContenedor 3 == 235 menorContenedor 4 == 2357 menorContenedor 5 == 112357 menorContenedor 6 == 113257