Pour tester la primalité d'un nombre, n on s'attendrait à une boucle telle que celle qui suit en premier lieu :
bool isPrime = true;
for(int i = 2; i < n; i++){
if(n%i == 0){
isPrime = false;
break;
}
}
Ce que fait la boucle ci-dessus est le suivant : pour une donnée 1 < i < n il vérifie si n/i est un entier (en laissant le reste 0). S'il existe un i pour lequel n/i est un entier, alors on peut être sûr que n n'est pas un nombre premier, auquel cas la boucle se termine. Si pour aucun i, n/i est un entier, alors n est premier.
Comme pour chaque algorithme, nous demandons : Peut-on faire mieux ?
Voyons ce qui se passe dans la boucle ci-dessus.
La séquence de i va : i = 2, 3, 4, .... , n-1
Et la séquence de vérifications des entiers va : j = n/i, soit n/2, n/3, n/4, .... , n/(n-1)
Si pour un certain i = a, n/a est un nombre entier, alors n/a = k (nombre entier)
ou n = ak, clairement n > k > 1 (si k = 1, alors a = n, mais i n'atteint jamais n ; et si k = n, alors a = 1, mais i commence à former 2)
De plus, n/k = a, et comme indiqué ci-dessus, a est une valeur de i, donc n > a > 1.
Donc, a et k sont tous deux des entiers compris entre 1 et n (exclusif). Puisque i atteint chaque entier dans cet intervalle, à une certaine itération i = a, et à une autre itération i = k. Si le test de primalité de n échoue pour min(a,k), il échouera également pour max(a,k). Nous devons donc vérifier un seul de ces deux cas, à moins que min(a,k) = max(a,k) (où deux vérifications se réduisent à une seule), c'est-à-dire a = k, auquel cas a*a = n, ce qui implique a = sqrt(n).
En d'autres termes, si le test de primalité de n devait échouer pour un certain i >= sqrt(n) (c'est-à-dire max(a,k)), il échouerait également pour un certain i <= n (c'est-à-dire min(a,k)). Il suffirait donc d'exécuter le test pour i = 2 à sqrt(n).
53 votes
Car si
n = a*b
ya <= b
puisa*a <= a*b = n
.18 votes
Pour clarifier, cela signifie que nous devons tester uniquement jusqu'à ce que
floor(sqrt(n))
.7 votes
mathandmultimedia.com/2012/06/02/