Representación binaria de los números de Carol
Un número de Carol es un número entero de la forma \(4^n-2^{n+1}-1\) o, equivalentemente, \((2^n-1)^2-2\). Los primeros números de Carol son -1, 7, 47, 223, 959, 3967, 16127, 65023, 261119, 1046527.
Definir las funciones
carol :: Integer -> Integer carolBinario :: Integer -> Integer
tales que
- (carol n) es el n-ésimo número de Carol. Por ejemplo,
carol 3 == 47 carol 4 == 223 carol 25 == 1125899839733759
- (carolBinario n) es la representación binaria del n-ésimo número de Carol. Por ejemplo,
carolBinario 3 == 101111 carolBinario 4 == 11011111 carolBinario 5 == 1110111111
Comprobar con QuickCheck que, para n > 2, la representación binaria del n-ésimo número de Carol es el número formado por n-2 veces el dígito 1, seguido por un 0 y a continuación n+1 veces el dígito 1.
Soluciones
import Test.QuickCheck carol :: Integer -> Integer carol n = x^2 - 2 where x = 2^n - 1 carolBinario :: Integer -> Integer carolBinario = binario . carol -- (binario x) es el número binario correspondiente al número decimal -- x. Por ejemplo, -- binario 223 == 11011111 binario :: Integer -> Integer binario = digitosAnumero . reverse . int2bin -- (int2bin x) es el número binario (representado como la lista -- invertida de sus dígitos) correspondiente al número decimal -- x. Por ejemplo, -- int2bin 223 == [1,1,1,1,1,0,1,1] int2bin :: Integer -> [Integer] int2bin n | n < 2 = [n] | otherwise = n `mod` 2 : int2bin (n `div` 2) -- (digitosAnumero xs) es el número cuya lista de dígitos es xs. Por -- ejemplo, -- digitosAnumero [3,2,5] == 325 digitosAnumero :: [Integer] -> Integer digitosAnumero xs = read (concatMap show xs) -- En la definición anterior se pueden eliminar el argumento digitosAnumero2 :: [Integer] -> Integer digitosAnumero2 = read . (concatMap show) -- La propiedad es prop_carol :: Integer -> Property prop_carol n = n > 2 ==> carolBinario n == carolBinario2 n where carolBinario2 n = digitosAnumero ((replicate (m-2) 1) ++ [0] ++ (replicate (m+1) 1)) where m = fromIntegral n -- La comprobación es -- λ> quickCheck prop_carol -- +++ OK, passed 100 tests.
Referencias
- Carol number por Shashank Mishra en GeeksforGeeks.