OFFSET
1,1
COMMENTS
Not the same as A061509: a(n) = A061509(n) for n <= 100; a(101)=2^1*3^0*5^1=10 <> A061509(101)=2^1*3^1=6;
a(n*A011557(k)) = a(n): trailing zeros don't matter;
A001221(a(n)) = A055640(n): number of distinct prime factors of a(n) = number of nonzero digits of n;
a(81312000) = 2^8*3^1*5^3*7^1*11^2*13^0*17^0*19^0 = 81312000, the smallest fixed point, is called the Meertens number.
LINKS
Reinhard Zumkeller, Table of n, a(n) for n = 1..10000
Richard S. Bird, Functional Pearl: Meertens number, Journal of Functional Programming 8 (1), Jan 1998, 83-88.
Wikipedia, Meertens number
MAPLE
a:= n-> `if`(n=0, 1, ithprime(length(n))^irem(n, 10, 'm') *a(m)):
seq(a(n), n=1..110); # Alois P. Heinz, May 04 2011
MATHEMATICA
a[n_] := (p = Prime[Range[Length[d = IntegerDigits[n]]]]; Times @@ (p^d)); Array[a, 50] (* Jean-François Alcover, Jan 09 2016 *)
PROG
(Haskell)
import Data.Char (digitToInt)
import Data.List (findIndices)
a189398 n = product $ zipWith (^) a000040_list (map digitToInt $ show n)
-- Two computations of the Meertens number: the first is brute force,
meertens = map succ $ findIndices (\x -> a189398 x == x) [1..]
-- ... and the second is more efficient, from Bird reference, page 87:
meertens' k = [n | (n, g) <- candidates (0, 1), n == g] where
candidates = concat . map (search pps) . tail . labels ps
ps : pps = map (\p -> iterate (p *) 1) $ take k a000040_list
search [] x = [x]
search (ps:pps) x = x : concat (map (search pps) (labels ps x))
labels ps (n, g) = zip (map (10*n +) [0..9]) (chop $ map (g *) ps)
chop = takeWhile (< 10^k)
-- Time and space required, GHC interpreted, Mac OS X, 2.66 GHz:
-- for >head meertens: (466.87 secs, 254780027728 bytes);
-- for >meertens' 8: ( 0.28 secs, 62027124 bytes).
(PARI) a(n)=my(d=digits(n), p=primes(#d)); prod(i=1, #d, p[i]^d[i]) \\ Charles R Greathouse IV, Aug 19 2014
(Python)
from sympy import prime
from operator import mul
from functools import reduce
def A189398(n):
....return reduce(mul, (prime(i)**int(d) for i, d in enumerate(str(n), start=1)))
# implementation using recursion
def _A189398(n):
....nlen = len(n)
....return _A189398(n[:-1])*prime(nlen)**int(n[-1]) if nlen > 1 else 2**int(n)
def A189398(n):
....return _A189398(str(n))
# Chai Wah Wu, Aug 31 2014
CROSSREFS
KEYWORD
AUTHOR
Reinhard Zumkeller, May 03 2011
STATUS
approved