Non seulement votre prime
la fonction de vérification renvoie toujours false
même s'il fonctionnait correctement, votre boucle principale ne cherche pas du tout les facteurs du nombre d'entrée, mais seulement le plus grand nombre premier inférieur ou égal à celui-ci. En pseudo-code, votre code est équivalent à :
foo(n):
x := 0 ;
foreach d from 1 to n step 1:
if is_prime(d): // always false
x := d
return x // always 0
is_prime(d):
not( d % 1 == 0 ) // always false
Mais vous n'avez pas du tout besoin de la fonction de vérification de la prime ici. La fonction suivante trouve tous les facteurs d'un nombre, par Division de première instance :
factors(n):
fs := []
d := 2
while ( d <= n/d ):
if ( n % d == 0 ): { n := n/d ; fs := append(fs,d) }
else: { d := d+1 }
if ( n > 1 ): { fs := append(fs, n) }
return fs
Le test de divisibilité est effectué uniquement jusqu'à la racine carrée du nombre. Chaque facteur, au fur et à mesure qu'il est trouvé, est divisé à partir du nombre à factoriser, ce qui réduit encore le temps d'exécution. La factorisation du nombre en question s'exécute instantanément, ne nécessitant que 1473 itérations.
Par construction, tous les facteurs ainsi trouvés sont garanti pour être premier (c'est pourquoi aucune vérification du caractère premier n'est nécessaire). Il est crucial d'énumérer les diviseurs possibles en ordre ascendant pour que cela se produise 1 . L'ordre ascendant est également le plus efficace car un nombre donné a plus de chances d'avoir un facteur premier plus petit qu'un plus grand. L'énumération des primes au lieu de cotes, bien que cela ne soit pas nécessaire, sera plus efficace si vous avez un moyen efficace d'obtenir ces nombres premiers, pour tester la division par.
Il est trivial d'augmenter ce qui précède pour trouver le le plus grand facteur : il suffit de mettre en œuvre append
comme
append(fs,d):
return d
1 car alors, pour tout diviseur composite d
du nombre original à factoriser, quand nous atteindrons d
nous aurons déjà divisé ses facteurs premiers à partir du nombre original, et donc le nombre réduit n'aura pas de facteurs premiers communs avec lui, c'est-à-dire que d
ne divisera pas le nombre réduit même s'il divise l'original.