568 votes

Pourquoi vérifie-t-on jusqu'à la racine carrée d'un nombre premier pour déterminer s'il est premier ?

Pour vérifier si un nombre est premier ou non, pourquoi devons-nous vérifier s'il est divisible uniquement jusqu'à la racine carrée de ce nombre ?

53 votes

Car si n = a*b y a <= b puis a*a <= a*b = n .

18 votes

Pour clarifier, cela signifie que nous devons tester uniquement jusqu'à ce que floor(sqrt(n)) .

7 votes

12voto

Super Cat Points 1303

Ce ne sont que des utilisations basiques de la factorisation et des racines carrées.

Cela peut sembler abstrait, mais en réalité, il s'agit simplement du fait que la factorielle maximale possible d'un nombre non primaire doit être sa racine carrée :

sqrroot(n) * sqrroot(n) = n .

Étant donné que, si un nombre entier supérieur à 1 et en dessous ou jusqu'à sqrroot(n) div div div div div div div div div div div div div div div div div div div div div div div div div div div div div n entonces n ne peut pas être un nombre premier.

Exemple de pseudo-code :

i = 2;

is_prime = true;

while loop (i <= sqrroot(n))
{
  if (n % i == 0)
  {
    is_prime = false;
    exit while;
  }
  ++i;
}

1 votes

Brillante observation. Utiliser cette observation pour créer un guard en Swift en conjonction avec cette pratique stackoverflow.com/a/25555762/4475605 pour sortir prématurément d'un calcul plutôt que de gaspiller la puissance de calcul. Merci de votre contribution.

0 votes

@Adrian Je dois avouer qu'après être revenu sur cette réponse, j'ai effectivement trouvé une erreur au moment de votre publication. Vous ne pouvez pas effectuer de division sur un 0, et en théorie si vous le pouviez ++i deviendrait le nombre 1, qui renverrait toujours faux (parce que 1 se divise en tout). J'ai corrigé la réponse ci-dessus.

1 votes

Oui... j'ai abordé ce point dans mon code... votre observation de la racine carrée est un excellent moyen de rejeter une valeur non primaire avant de commencer les calculs. Je me faisais tuer par un grand nombre qui s'est avéré être une grande perte de temps. J'ai également appris que cet algorithme peut réduire considérablement les temps de traitement des grands nombres. fr.wikipedia.org/wiki/Miller -Rabin_primality_test

8voto

Supposons que l'entier donné N n'est pas premier,

Alors N peut être factorisé en deux facteurs a y b , 2 <= a, b < N tal que N = a*b . Il est clair que les deux ne peuvent pas être supérieurs à sqrt(N) simultanément.

Supposons, sans perte de généralité, que a est plus petit.

Maintenant, si vous ne pouviez pas trouver un diviseur de N appartenant à la gamme [2, sqrt(N)] Qu'est-ce que ça veut dire ?

Cela signifie que N [2, a] como a <= sqrt(N) .

Par conséquent, a = 1 y b = n et donc Par définition, N est premier .

...

Une lecture plus approfondie si vous n'êtes pas satisfait :

De nombreuses combinaisons différentes de (a, b) peuvent être possibles. Disons qu'ils le sont :

(a 1 , b 1 ), (a 2 , b 2 ), (a 3 , b 3 ), ..... , (a k , b k ). Sans perte de généralité, supposons que a i < b i , 1<= i <=k .

Maintenant, pour être capable de montrer que N n'est pas premier, il suffit de montrer qu'aucun de a i peut être factorisé davantage. Et nous savons aussi qu'un i <= sqrt(N) et donc vous devez vérifier jusqu'à sqrt(N) qui couvrira tous les a i . Et donc vous serez en mesure de conclure si oui ou non N est premier.

...

7voto

rhea rodrigues Points 61

Donc pour vérifier si un nombre N est premier ou non. Nous devons seulement vérifier si N est divisible par des nombres<=SQROOT(N). En effet, si nous factorisons N en 2 facteurs quelconques, disons X et Y, c'est-à-dire que N=X Y. Chacun de X et Y ne peut pas être inférieur à SQROOT(N) car alors, X Y < N Chacun de X et Y ne peut être supérieur à SQROOT(N) car alors, X*Y > N

Par conséquent, un facteur doit être inférieur ou égal à SQROOT(N) ( tandis que l'autre facteur est supérieur ou égal à SQROOT(N) ). Ainsi, pour vérifier si N est premier, il suffit de vérifier les nombres <= SQROOT(N).

7voto

Disons que nous avons un nombre "a", qui n'est pas premier [un nombre non premier/composé signifie - un nombre qui peut être divisé de manière égale par des nombres autres que 1 ou lui-même. Par exemple, 6 peut être divisé également par 2, ou par 3, ainsi que par 1 ou 6].

6 = 1 × 6 ou 6 = 2 × 3

Donc maintenant, si "a" n'est pas premier, alors il peut être divisé par deux autres nombres et disons que ces nombres sont "b" et "c". Ce qui signifie

a=b*c.

Maintenant, si "b" ou "c", l'un d'entre eux est supérieur à la racine carrée de "a", alors la multiplication de "b" et "c" sera supérieure à "a".

Ainsi, "b" ou "c" est toujours <= racine carrée de "a" pour prouver l'équation "a=b*c".

Pour cette raison, lorsque nous testons si un nombre est premier ou non, nous ne vérifions que la racine carrée de ce nombre.

2 votes

B & c <= Math.sqrt(n)? ; Ce devrait être plutôt b || c ( b ou c) puisque si n=6, b=3, c=2 alors Math.sqrt(n) > c.

1 votes

Merci mon pote pour la correction. Je fais la correction. :)

5voto

typelogic Points 797

Étant donné un nombre quelconque n alors une façon de trouver ses facteurs est d'obtenir sa racine carrée. p :

sqrt(n) = p

Bien sûr, si on multiplie p par lui-même, alors on obtient n :

p*p = n

On peut le réécrire comme suit :

a*b = n

p = a = b . Si a augmente, alors b diminue pour maintenir a*b = n . Par conséquent, p est la limite supérieure.

Mise à jour : Je relis cette réponse aujourd'hui et elle est devenue plus claire pour moi. La valeur p ne signifie pas nécessairement un nombre entier, car si c'est le cas, alors n ne serait pas une prime. Donc, p pourrait être un nombre réel (c'est-à-dire avec des fractions). Et au lieu de parcourir toute la gamme des n il ne nous reste plus qu'à parcourir toute la gamme de p . L'autre p est une copie miroir, donc en fait, nous divisons la gamme par deux. Et puis, maintenant je vois que nous pouvons en fait continuer à refaire la square root et de le faire à p pour réduire encore de moitié la portée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X