Le dernier chiffre non nul de n! [Python]

Tout entier {n\ge1} s’écrit de façon unique {n=10^p(10q+r)}, avec {p,q\in\mathbb N} et {r\in\{1,\ldots,9\}}. On note {f(n)=r} son dernier chiffre non nul. Par exemple {f(1357)=f(135700)=7}. On cherche une méthode de calcul de {f(n!)}. Les questions [P] utilisent Python.

1. [P] Programmer f(n) pour {n\ge1}. Cette question n’est pas indispensable pour la suite.

2. Soient {n,n'\ge1}, avec {f(n)\ne5} et {f(n')\ne5}. Montrer que {f(nn')\equiv f(n)f(n')\pmod{10}} et {f(nn')\ne5}.

3. Soit {P(X)=(X+1)(X+2)(X+3)(X+4)}. Factoriser {P(X)-24} dans {\mathbb R[X]} et montrer que {P(5k)\equiv24\pmod{1000}} pour {k\in\mathbb N}.

On pose désormais {\mu_k=P(5k)/2}. On a {\mu_k\equiv12\pmod{500}}, donc {f(\mu_k)=2}.

4. [P] Écrire mu(k) et vérifier que mu(10) vaut {3795012}.

5. Écrivons {n=5q_n+r_n}, avec {0\le r_n\le4}. Montrer que {n!=10^{q_n}q_n!u_n}, où
{u_n=\prod_{j=1}^{r_n}(5q_n+j)\prod_{k=0}^{q_n-1}\mu_k}Un produit vide vaut {1}. En déduire {f(n!)=f(q_n!u_n)}.

6. En déduire {f(n!)\ne5} pour tout {n}, puis {f(n!)\equiv f(q_n!)f(u_n)\pmod{10}}. Observer que {f(u_n)\equiv u_n\pmod{10}}.

7. Pour {n\ge5}, montrer que {u_{n+20}\equiv6u_n\pmod{10}}, en écrivant {n+20=5(q_n+4)+r_n}.

8. Montrer plus précisément que {u_{n+20}\equiv u_n\pmod{10}} pour {n\ge5}. En déduire la périodicité de {f(u_n)}.

9. [P] Écrire umod10(n) calculant {f(u_n)} et vérifier que les valeurs pour {5\le n\le24} sont [2,2,4,2,8,4,4,8,4,6,8,8,6,8,2,6,6,2,6,4].

10. [P] Écrire chiffre(n) renvoyant le dernier chiffre non nul de {n!}, sans utiliser factorial, avec des calculs de congruences et sans former de grands entiers.