La función de Smarandache
La función de Smarandache, también conocida como la función de Kempner, es la función que asigna a cada número entero positivo n el menor número cuyo factorial es divisible por n y se representa por S(n). Por ejemplo, el número 8 no divide a 1!, 2!, 3!, pero sí divide 4!; por tanto, S(8) = 4.
Definir las funciones
1 2 |
smarandache :: Integer -> Integer graficaSmarandache :: Integer -> IO () |
tales que
- (smarandache n) es el menor número cuyo factorial es divisible por n. Por ejemplo,
1 2 3 |
smarandache 8 == 4 smarandache 10 == 5 smarandache 16 == 6 |
- (graficaSmarandache n) dibuja la gráfica de los n primeros términos de la sucesión de Smarandache. Por ejemplo, (graficaSmarandache 100) dibuja
(graficaSmarandache 500) dibuja
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import Data.List (genericLength) import Graphics.Gnuplot.Simple smarandache :: Integer -> Integer smarandache x = head [n | (n,y) <- zip [0..] factoriales , y `mod` x == 0] -- factoriales es la lista de los factoriales. Por ejemplo, -- λ> take 12 factoriales -- [1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800] factoriales :: [Integer] factoriales = 1 : scanl1 (*) [1..] graficaSmarandache :: Integer -> IO () graficaSmarandache n = plotList [Key Nothing , PNG ("La_funcion_de_Smarandache_" ++ show n ++ ".png") ] (map smarandache [1..n]) |
La elección de la cota para el vector puede apreciarse representando la siguiente gráfica (aunque convendría probar que se cumple siempre):
Si tenemos la factorización de n (para lo cual no se conoce algoritmo eficiente), puede calcularse el smarandache de forma eficiente, pues podemos obtener un índice para cada primo y potencia de la factorización para el mínimo factorial que lo contiene (ese primo con esa potencia).
Inspirado en tu solución, he creado otra que pongo en mensaje aparte.
Una solución mucho más optimizada:
En Maxima: