100! The factorial of 100
published: 18 December 2021 / updated 18 December 2021
The factorial function
The factorial function n!
on integers consists in carrying out the multiplication
of all integers between 1 and n. Example, for n=10:
10!
is equivalent to:
1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10
Calculation of 100! by google
Let's see what Google answers when asked for the factorial of 100:
Yes. A number with 164 digits! Just that...
No calculator can replace all the digits of 100! nor elsewhere no factorial on integers that are too large.
Coding in FORTH language
The most trivial way to program the factorial function in FORTH language uses recursion:
\ leave FACT n on the stack : fact ( n -- n!) recursive dup 1 > if dup 1 - fact * else drop 1 endif ;
So, how many 10! ?
10 fact .
display 3628800
Factor reduction
Well! The result ends with 3628800
!
In fact, nothing surprising. There are 10 in the list of factors:
1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10
The second factor 10 is hidden but easy to find:
1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10
We can therefore rewrite our factorization like this:
1 x 3 x 4 x 6 x 7 x 8 x 9 x 100
Let's see the operation:
1 x 3 x 4 x 6 x 7 x 8 x 9
is equal to 36288.
This 36288 value is the result of reducing factors by 10! but removing all the factors equal to 10 or products of factors equal to 10.
10 is itself the result of factors 2 and 5.
Comptage des facteurs 2 et 5
Revenons d'abord sur notre mot fact
. Voyons ses limites avec la version
compilée par gForth. gForth a une pile de données sur 64 bits:
10 fact . 3628800 ok 20 fact . 2432902008176640000 ok 21 fact . -4249290049419214848 ok
Le résultat de 21! devient négatif. C'est le signe que le résultat déborde la précision de 64 bits d'un élément de la pile de données.
Le résultat de 20! est 2432902008176640000 qui peut se réécrire 243290200817664 x 10⁴
Si on compte et supprime tous les facteurs 2 et 5 par paires, on pourrait réduire le nombre de facteurs et voir jusqu'à quelle valeur on peut calculer une factorielle sur ces facteurs réduits.
\ leave FACT n on the stack : fact ( n -- n!) recursive dup 1 > if dup 5 = if drop else dup . dup 1 - fact * then else drop 1 endif ;SQRT(PI)/2 = 0.88622692545... 0.5! = 0.88622692545....