The previous post explained why the number of trailing zeros in *n*! is

and that the sum is not really infinite because all the terms with index *i* larger than log_{5} *n* are zero. Here ⌊*x*⌋ is the floor of *x*, the largest integer no greater than *x*.

The post gave the example of *n* = 8675309 and computed that the number of trailing zeros is 2168823 using the Python code

sum(floor(8675309/5**i) for i in range(1, 10))

Now suppose you wanted to calculate this by hand. You would want to be more clever than the code above. Instead of dividing *n* by 5, and then by 25, and then by 125 etc. you’d save time by first computing

⌊8675309/5⌋ = 1735061,

then computing

⌊1735061/5⌋ = 347012,

and so forth.

Is this calculation justified? We implicitly assumed that, for example,

⌊*n*/25⌋ = ⌊⌊*n*/5⌋ /5⌋.

This seems reasonable, so reasonable that we might not think to check it, but calculations with floor and ceiling functions can be tricky.

There’s a theorem from Concrete Mathematics that can help us.

Let

f(x) be any continuous, monotonically increasing function with the property that wheneverf(x) is an integer,xis an integer. Then⌊

f(x) ⌋ =⌊f(⌊x⌋) ⌋and

⌈

f(x) ⌉ =⌈f(⌈x⌉) ⌉.

Note that the requirements on *f* compose. That is, if a function *f* satisfies the hypothesis of the theorem, so do the compositions *f*∘*f* and *f*∘*f*∘*f* etc. This means we can apply the theorem above iteratively to conclude

⌊ *f*(*f*(*x*)) ⌋ =⌊ *f* (⌊*f*(⌊*x*⌋)⌋) ⌋

and

⌈*f*( *f*(*x*)) ⌉ =⌈ *f *(⌈*f*(⌈*x*⌉)⌉) ⌉

and similarly for higher compositions.

The hand calculation above is justified by applying the iterated theorem to the function *f*(*x*) = *x*/5.