Representación binaria de los números de Carol
Un número de Carol es un número entero de la forma o, equivalentemente, . Los primeros números de Carol son -1, 7, 47, 223, 959, 3967, 16127, 65023, 261119, 1046527.
Definir las funciones
1 2 |
carol :: Integer -> Integer carolBinario :: Integer -> Integer |
tales que
- (carol n) es el n-ésimo número de Carol. Por ejemplo,
1 2 3 |
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,
1 2 3 |
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
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
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.
- Carol number en la Wikipedia.
5 Comentarios