Le 28/07/2021 à 09:49, ast a écrit :
> ----------------------------------------------
> import math
>
> def isPrime(n):
> if n == 4: return False
> return bool(math.factorial(n>>1)%n)
> ----------------------------------------------
>
> qui manifestement ne fonctionne pas correctement puisqu'il
> répond True pour n = 9
Ben oui d'une part n==4 n'est pas une exception au théorème (si au moins
ca avait été une congruence à 0 modulo 4, ca aurait plus de sens), et
d'autre part c'est (n-1)! et pas (n>>1)! = int(n/2)! qu'il faut utiliser.
Ce code est complètement à la ramasse. Je ne me sens pas le courage
d'aller modifier la wiki, mais honte à celui qui a écrit ce code sans
donner de justifications. Il est totalement faux et d'ailleurs il ne
figure même pas dans la page anglaise du même théorème.
> L'auteur parle "d'augmenter la vitesse de calcul" mais je
> ne comprends pas ce qu'il a voulu faire.
Il dit que les factorielles sont couteuses. C'est vrai, mais sa version
"optimisée" avec le n>>1 (soit int(n/2)) utilise encore une factorielle.
C'est du grand n'importe quoi vu là comme ca.
Par contre il y a moyen d'éviter les grands nombres en calculant la
factorielle modulo n de bout en bout (soit n produits + modulo), ce qui
reste lent pour un test de primalité où l'on teste des nombres "n" à
plusieurs milliers de chiffres.
sam.