Least Significant Non-Zero Digit of n!
Let p(k) be the least significant non-zero decimal digit of k! The
first several values of this sequence are
2,6,4,2,2,4,2,8,8,8,6,8,2,8,8,6,8,2,4,4,8,4,6,4,4,8,4,6,8,...
Can we directly determine the kth term for any given k? Also, what
is the asymptotic distribution of the digits? To answer these
questions, let L(k) denote the least significant non-zero decimal
digit of the integer k. Writing n! in the form
n! = (2^a2)(5^a5)(3^a3)(7^a7)...
we can let (n!)' denote this same number divided by its highest
power of 10, i.e.,
(n!)' = (2^(a2-a5))(3^a3)(7^a7)...
Since we've divided out all powers of 10, the least significant
digit of this number is non-zero, as are the least significant digits
of the factors. Thus we have
L(n!) = L((n!)') = L[ L(2^a2 - a5) L(3^a3) L(7^a7) ...]
For any given integer n we can compute the exponent of any prime p
in n! simply by summing the nearest integers to [n/p^j] for j=1,2,..
For example, the exponent of 3 in 89! is given by
a3 = [89/3] + [89/9] + [89/27] + [89/81]
= 29 + 9 + 3 + 1 = 42
Furthermore, the least significant decimal digit of 3^k is cyclical
with the four values {1,3,9,7}, so it's easy to see that L(3^42) = 9.
Likewise, the least significant digits of the sequence p^k, k=1,2,..
for every odd prime ending with the digit 3 or 7 has a period of four,
while those ending with 9 have a period of two, and those ending with
1 have a period of one. Thus, all these periods are divisors of four.
Of course, the least significant digits of 2^k also have a period of
four, i.e., {2,4,8,6}.
Also, as we multiply successive integers to generate n!, we always
have more powers of 2 than of 5, so the value of L(n!) is easily
computed recursively as L(L(n)L((n-1)!)) unless n is a multiple of
5, in which case we need more information. As a result, the values
of L(n!) come in fixed strings of five, as shown below
n
1 5 10 15 20 25 30 35 40 45
L(n!): 1264 22428 88682 88682 44846 44846 88682 22428 22428 66264 ...
Thus, if we know the value of L((5n)!) we automatically know the values
of L((5n+j)!) for j=0,1,2,3,4. However, the pattern of the values
L((5n)!) is not immediately apparent. If we tabulate these values we
find that they too come in fixed strings of five, so we only need to
know L((25n)!) to automatically know L((25n+5j)!) for j=0,1,2,3,4.
Continuing in this way, we can tabulate the values of L((5^t n)!) as
shown below
n
1 5 10 15 20 25 30 35 40 45
L( n!): 1264 22428 88682 88682 44846 44846 88682 22428 22428 66264
L( 5n!): 2884 48226 24668 48226 48226 86442 24668 62884 24668 24668
L( 25n!): 4244 82622 82622 28488 46866 64244 82622 82622 28488 46866
L(125n!): 8824 68824 26648 68824 42286 26648 26648 42286 26648 84462
L(625n!): 6264 22428 88682 88682 44846 44846 88682 22428 22428 66264
etc.
Notice that the pattern of digits for L(625n!) is the same as for
L(n!). In general it appears that the pattern for L((5^j n)!) is the
same as for L((5^(j+4) n)!). In addition, on each level there are
precisely four distinct blocks of 5 sequential digits, one block
beginning with each of the digits 0,2,4,6,8.
From the above tabulations we can extract the essential patterns
for L((5^k n)!)
Look-Up Table for L() Patterns
------------------------------
k mod 4
-------
0 06264 22428 44846 66264 88682
1 02884 24668 48226 62884 86442
2 04244 28488 46866 64244 82622
3 08824 26648 42286 68824 84462
This table represents all we need to determine the value of L(n!) for
any integer n. First we convert n to the base 5, so we have
n = d_0 + d_1*5 + d_2*5^2 + ... + d_h*5^h
Now we enter the above table at the row h (mod 4) in the block whose
first digit is 0 (because the coefficient of 5^(h+1) is zero), and
determine the digit in the (d_h)th position of this block. Let this
digit be denoted by s_h. Then we enter the table at row h-1 (mod 4)
in the block that begins with s_h, and determine the digit in the
(d_(h-1))th position of this block. Let this digit be denote by
s_(h-1). We continue in this way down to s_0, which is the least
significant non-zero digit of n!.
To illustrate, consider the case of the decimal number n=1592. In
the base 5 this is n=22332. Now we enter the above table at row
k=4=0 (mod 4) in the block beginning with 0, which is 06264. The
leading digit of n (in the base 5) is 2, so we check the digit in
position 2 of this block to give L((2*5^4)!) = 2. Then we enter
the table at row k=3 (mod 4) in the block beginning with 2, which
is 26648, to find L((2*5^4 + 2*5^3)!) = 6.
Then in the row k=2 (mod 4), the block beginning with 6 is 64244,
and we find L((2*5^4 + 2*5^3 + 3*5^2)!) = 4. From this we know we're
in the block 48226 in row k=1 (mod 4), so we have L((2*5^4 + 2*5^3 +
3*5^2 + 3*5)!) = 2. Finally, we enter the row k=0 (mod 4) in block
22428 to find the result
L(1592!) = L((2*5^4 + 2*5^3 + 3*5^2 + 3*5 + 2)!) = 4
To streamline this process, let's define an array A(4,5,5) where the
first index signifies the row (0,1,2,3), the second is the block
selector (0,2,4,6,8) in that row, and the third is the digit number
(0,1,2,3,4) in that block. If it's understood that the first index
is to be taken modulo 4, and if we let dj denote the jth digit of the
base-5 representation of n, then the above evaluation be written in
the form
A(4, 0, d4) = s4
A(3, s4, d3) = s3
A(2, s3, d2) = s2
A(1, s2, d1) = s1
A(0, s1, d0) = s0 = L((d4*5^4 + d3*5^3 + d2*5^2 + d1*5 + d0)!)
This shows how we can easily determine the value of L(n!) by means of
k look-ups (in a simple fixed 4x5x5 table) where k is the number of
base-5 digits of n. From this we can also rigorously determine the
distribution of digits, which the table's symmetry seems to imply
must be uniform. Just checking empirically, we find the following
distribution of the values of L(n!) for n from 2 to 10^t with t=4,5,6.
(This excludes n=1 for which L(n!)=1.)
2 4 6 8
------ ------ ------ ------
10^4 2509 2486 2494 2510
10^5 25026 24999 24973 25001
10^6 249993 250013 250040 249953
Naturally a similar analysis can be performed with respect to the
least significant digit of n! in any other base. For example, in
the base 3, we find that the blocks on the even levels are 112 and
221, and the blocks on the odd levels are 122 and 211. With this
information we can construct the function table shown below.
previous current
output digit output
-------- ------- ------
1 0 1
1 1 p+1
1 2 2
2 0 2
2 1 2-p
2 2 1
where "p" denotes the parity of the exponent of 3 for the current
digit. To illustrate, suppose we wish to determine the least
significant non-zero base-3 digit of (139!). The number 139 written
in the base 3 is 12011, so the exponent of 3 for the leading digit
is 4, which has parity 0. Thus the parity string of the exponents
is 01010. Beginning with the most significant digit, 1, and a
"previous output" of 1 (which is always the initial "previous output")
we enter the table in the row 1 1 to find that the output is p+1,
which equals 1 (because the current exponent parity is p=0). Then
we take this output and the next input digit, 2, and enter the table
at the row 1 2 to get the output 2. Then we take this output and
the next input digit, 0, and enter the table in the row 2 0 to find
the output 2. Next we enter at 2 1 to find he output 2-p, and on
this level we have p=1, so the output is 1. Finally we enter the
table at row 1 1 to find the output p+1, and on this level we have
p=0, so the final output is 1.
This process essentially acts as a kind of "filter", taking consecutive
digits from the set {0,1,2} and outputing digits from the set {1,2},
just as the decimal algorithm takes a stream of digits from the set
{0,1,...,9} and outputs a stream of digits from the set {2,4,6,8}.
For the base-3 filter, a continuous stream of "0" input digits will
leave the output unchanged, i.e., it will retain the previous output
value. On the other hand, a continuous stream of "2" input digits
will cause the output to oscillate between 1 and 2 on each step. A
continuous stream of "1" input digits will act like "0" when the
parity is even, and will act like "1" when parity is odd, with the
result being that the output will change state on the odd steps.
Return to MathPages Main Menu