Warum überprüfen wir die Quadratwurzel einer Primzahl, um festzustellen, ob es sich um eine Primzahl handelt?

392

Um zu testen, ob eine Zahl eine Primzahl ist oder nicht, warum müssen wir testen, ob sie nur bis zur Quadratwurzel dieser Zahl teilbar ist?

Schwenken
quelle
33
denn wenn n = a*bund a <= bdann a*a <= a*b = n.
Will Ness
7
Zur Verdeutlichung bedeutet dies, dass wir nur bis testen müssen floor(sqrt(n)).
Acumenus

Antworten:

659

Wenn eine Zahl nkeine Primzahl ist, kann es in zwei Faktoren werden berücksichtigt aund b:

n = a * b

Jetzt aund bkann nicht beide größer als die Quadratwurzel von sein n, da dann das Produkt a * bgrößer als wäre sqrt(n) * sqrt(n) = n. Bei jeder Faktorisierung von nmuss mindestens einer der Faktoren kleiner als die Quadratwurzel von sein n, und wenn wir keine Faktoren finden können, die kleiner oder gleich der Quadratwurzel sind, nmuss dies eine Primzahl sein.

Sven Marnach
quelle
Wie muss sqrt(n)genau genug sein, damit diese Eigenschaft gilt, wenn wir Gleitkommazahlen verwenden?
Benoît
@ Benoît Sie können immer die Prüfung verwenden, i * i <= nanstatt i <= sqrt(n)die Feinheiten von Gleitkommazahlen zu vermeiden.
Sven Marnach
348

Sagen wir m = sqrt(n)dann m × m = n. Nun, wenn nes keine Primzahl ist, nkann es so geschrieben n = a × bwerden m × m = a × b. Beachten Sie, dass dies meine reelle Zahl nist aund bnatürliche Zahlen sind.

Jetzt kann es 3 Fälle geben:

  1. a> m ⇒ b <m
  2. a = m ⇒ b = m
  3. a <m ⇒ b> m

In allen 3 Fällen min(a, b) ≤ m. Wenn wir also bis suchen m, müssen wir mindestens einen Faktor finden n, der ausreicht, um zu zeigen, dass dies nkeine Primzahl ist.

BiGYaN
quelle
4
n = 12 m = sqrt (12) = 3,46, a = 2, b = 6. n = m m, dh 12 = 3,46 · 3,46 und n = a b, dh 12 = 2 · 6. Nun Bedingung 3. a <m <b, dh 2 <3,46 <6. Um also die Primzahl zu überprüfen, müssen wir nur nach einer Zahl kleiner als 3,46 suchen, was 2 ist, um herauszufinden, dass die Zahl keine Primzahl ist. Überprüfen Sie daher die Teilbarkeit durch Zahlen kleiner oder gleich (wenn n = 4, m = a = b = 2) der Quadratwurzel von n.
Anukalp
2
Ich denke, wir sollten zuerst die Annahme hervorheben. Nehmen wir an n is not a prime, und beweisen Sie es, sonst ist es eine Primzahl.
Huei Tan
Eigentlich bin ich nicht davon überzeugt, dass es eine bessere Antwort ist. Es ist eine richtige Antwort, aber sie beantwortet die Frage nicht wirklich. Es beschreibt nur einige andere Dynamiken rund um Primzahlen und das Quadrat. Die Antworten von @ Sven sind kurz und prägnant und stellen dabei keine weiteren Fragen.
Jon M
1
Ich rollte zurück zur letzten guten Version. Sie haben es verpasst, als jemand unnötig ein Wort ('daher') entfernt hat, das für den Fluss benötigt wird.
Will Ness
55

Denn wenn ein Faktor größer als die Quadratwurzel von n ist, ist der andere Faktor, der sich mit ihm multiplizieren würde, um gleich n zu sein, notwendigerweise kleiner als die Quadratwurzel von n.

Patros
quelle
37

Eine intuitivere Erklärung wäre:

Die Quadratwurzel von 100 ist 10. Sagen wir axb = 100 für verschiedene Paare von a und b.

Wenn a == b, dann sind sie gleich und genau die Quadratwurzel von 100. Welches ist 10.

Wenn einer von ihnen kleiner als 10 ist, muss der andere größer sein. Zum Beispiel 5 x 20 == 100. Einer ist größer als 10, der andere ist kleiner als 10.

Wenn einer von ihnen nach unten geht, muss der andere größer werden, um dies auszugleichen, damit das Produkt bei 100 bleibt. Sie drehen sich um die Quadratwurzel.

Die Quadratwurzel von 101 ist ungefähr 10.049875621. Wenn Sie also die Zahl 101 auf Primalität testen, müssen Sie nur die ganzen Zahlen bis 10, einschließlich 10, ausprobieren. 8, 9 und 10 sind jedoch selbst keine Primzahlen, sodass Sie nur bis 7 testen müssen Prime.

Denn wenn es ein Paar von Faktoren gibt, bei denen eine der Zahlen größer als 10 ist, muss die andere des Paares kleiner als 10 sein. Wenn der kleinere nicht existiert, gibt es keinen passenden größeren Faktor von 101.

Wenn Sie 121 testen, ist die Quadratwurzel 11. Sie müssen die Primzahlen 1 bis 11 (einschließlich) testen, um festzustellen, ob sie gleichmäßig eingehen. 11 geht in 11 mal, also ist 121 nicht prim. Wenn Sie bei 10 angehalten und 11 nicht getestet hätten, hätten Sie 11 verpasst.

Sie müssen jede Primzahl testen, die größer als 2, aber kleiner oder gleich der Quadratwurzel ist, vorausgesetzt, Sie testen nur ungerade Zahlen.

`

Archit Garg
quelle
3
"Wenn man an Axb denkt, muss einer von ihnen größer werden, um zu kompensieren, damit einer bei 100 bleibt. Sie drehen sich um die Quadratwurzel." Mein Aha Moment! Vielen Dank!
Brian Wigginton
Dies ist die beste Antwort.
JeanieJ
19

Angenommen, es nist keine Primzahl (größer als 1). Es gibt also Zahlen aund bsolche

n = ab      (1 < a <= b < n)

Durch Multiplikation der Beziehung a<=bmit aund erhalten bwir:

a^2 <= ab
 ab <= b^2

Deshalb: (beachten Sie, dass n=ab)

a^2 <= n <= b^2

Daher: (Beachten Sie, dass aund bpositiv sind)

a <= sqrt(n) <= b

Wenn also eine Zahl (größer als 1) keine Primzahl ist und wir die Teilbarkeit bis zur Quadratwurzel der Zahl testen, werden wir einen der Faktoren finden.

LoMaPh
quelle
8

Nehmen wir an, dass die angegebene Ganzzahl Nkeine Primzahl ist.

Dann kann N faktorisiert in zwei Faktoren werden aund b, 2 <= a, b < Ndass solche N = a*b. Natürlich können beide nicht größer als sqrt(N)gleichzeitig sein.

Nehmen wir ohne Verlust der Allgemeinheit an, dass akleiner ist.

Wenn Sie nun keinen Teiler der NZugehörigkeit im Bereich finden konnten [2, sqrt(N)], was bedeutet das?

Dies bedeutet, dass Nin [2, a]as kein Divisor vorhanden ist a <= sqrt(N).

Deshalb a = 1und b = nund damit per definitionem Nist eine Primzahl .

...

Lesen Sie weiter, wenn Sie nicht zufrieden sind:

(a, b)Möglicherweise sind viele verschiedene Kombinationen von möglich. Nehmen wir an, sie sind:

(a 1 , b 1 ), (a 2 , b 2 ), (a 3 , b 3 ), ....., (a k , b k ). Nehmen Sie ohne Verlust der Allgemeinheit a i <b i , 1<= i <=k.

Um nun zeigen zu können, dass dies Nkeine Primzahl ist, reicht es aus zu zeigen, dass keines von i weiter faktorisiert werden kann. Und wir wissen auch, dass a i <= sqrt(N)und daher müssen Sie überprüfen, bis sqrt(N)alle a i abgedeckt sind . Und so können Sie schließen, ob es sich Num eine Primzahl handelt oder nicht .

...


quelle
7

Es ist alles wirklich nur eine grundlegende Verwendung von Faktorisierung und Quadratwurzeln.

Es mag abstrakt erscheinen, aber in Wirklichkeit liegt es einfach in der Tatsache, dass die maximal mögliche Fakultät einer Nicht-Primzahl ihre Quadratwurzel sein müsste, weil:

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

Wenn eine ganze Zahl über 1und unter oder bis sqrroot(n)gleichmäßig in geteilt wird n, nkann dies keine Primzahl sein.

Pseudocode-Beispiel:

i = 2;

is_prime = true;

while loop (i <= sqrroot(n))
{
  if (n % i == 0)
  {
    is_prime = false;
    exit while;
  }
  ++i;
}
Super Cat
quelle
Geniale Beobachtung. Verwenden Sie diese Beobachtung, um eine guardAnweisung in Swift in Verbindung mit diesem praktischen stackoverflow.com/a/25555762/4475605 zu erstellen , um eine Berechnung vorzeitig zu beenden , anstatt Rechenleistung zu verschwenden. Vielen Dank für die Veröffentlichung.
Adrian
@Adrian Ich muss gestehen, dass ich nach der Rückkehr zu dieser Antwort zum Zeitpunkt Ihrer Veröffentlichung einen Fehler gefunden habe. Sie können keine Division mit einer 0 durchführen, und theoretisch, wenn Sie ++idie Zahl 1 werden könnten, würde dies immer false zurückgeben (weil 1 in alles teilt). Ich habe die Antwort oben korrigiert.
Super Cat
Ja ... ich habe das in meinem Code angesprochen ... Ihre Quadratwurzelbeobachtung ist eine großartige Möglichkeit, einen Nicht-Primwert frühzeitig zu verwerfen, bevor Sie mit der Ausführung von Berechnungen beginnen. Ich wurde auf einer großen Zahl getötet, die sich als große Zeitverschwendung herausstellte. Ich habe auch gelernt, dass dieser Algorithmus die Verarbeitungszeiten auch bei großen Zahlen erheblich verkürzen kann. en.wikipedia.org/wiki/Miller –Rabin_primality_test
Adrian
6

Überprüfen Sie also, ob eine Zahl N Prime ist oder nicht. Wir müssen nur prüfen, ob N durch Zahlen <= SQROOT (N) teilbar ist. Dies liegt daran, dass, wenn wir N in 2 beliebige Faktoren einbeziehen, X und Y sagen, d. H. N = X Y. X und Y können nicht kleiner als SQROOT (N) sein, da dann X. Y <N ist. Jedes von X und Y kann nicht größer als SQROOT (N) sein, weil dann X * Y> N.

Daher muss ein Faktor kleiner oder gleich SQROOT (N) sein (während der andere Faktor größer oder gleich SQROOT (N) ist). Um zu überprüfen, ob N Prime ist, müssen wir nur diese Zahlen <= SQROOT (N) überprüfen.

Rhea Rodrigues
quelle
3

Nehmen wir an, wir haben eine Zahl "a", die keine Primzahl ist [nicht Primzahl / zusammengesetzte Zahl bedeutet - eine Zahl, die gleichmäßig durch andere Zahlen als 1 oder sich selbst geteilt werden kann. Zum Beispiel kann 6 gleichmäßig durch 2 oder durch 3 sowie durch 1 oder 6 geteilt werden].

6 = 1 × 6 oder 6 = 2 × 3

Wenn also "a" keine Primzahl ist, kann es durch zwei andere Zahlen geteilt werden. Nehmen wir an, diese Zahlen sind "b" und "c". Was bedeutet

a = b * c.

Wenn nun "b" oder "c" ist, ist einer von ihnen größer als die Quadratwurzel von "a", als die Multiplikation von "b" und "c" größer als "a" ist.

"B" oder "c" ist also immer <= Quadratwurzel von "a", um die Gleichung "a = b * c" zu beweisen.

Aus dem oben genannten Grund prüfen wir beim Testen, ob eine Zahl eine Primzahl ist oder nicht, nur bis zur Quadratwurzel dieser Zahl.

Abu Naser Md Shoaib
quelle
1
b & c <= Math.sqrt (n)?; Es sollte eher b || sein c (b oder c), denn wenn n = 6, b = 3, c = 2, dann ist Math.sqrt (n)> c.
daGo
Danke Kumpel für die Korrektur. Korrektur vornehmen. :)
Abu Naser Md Shoaib
2

Bei einer beliebigen Zahl nbesteht eine Möglichkeit, die Faktoren zu ermitteln, darin, die Quadratwurzel zu ermitteln p:

sqrt(n) = p

Wenn wir uns pvon selbst vermehren , kommen wir natürlich zurück n:

p*p = n

Es kann wie folgt umgeschrieben werden:

a*b = n

Wo p = a = b. Wenn aerhöht, dann bverringert, um beizubehalten a*b = n. Daher pist die Obergrenze.

Update: Ich lese diese Antwort heute noch einmal und es wurde mir klarer. Der Wert pbedeutet nicht unbedingt eine ganze Zahl, denn wenn dies der nFall ist, wäre dies keine Primzahl. Könnte palso eine reelle Zahl sein (dh mit Brüchen). Und anstatt die gesamte Bandbreite von nzu durchlaufen, müssen wir jetzt nur noch die gesamte Bandbreite von durchlaufen p. Die andere pist eine Spiegelkopie, also halbieren wir den Bereich. Und dann, jetzt sehe ich, dass wir das tatsächlich wiederholen square rootund tun können, pum die Hälfte der Reichweite zu erreichen.

trueadjustr
quelle
1

Sei n nicht prim. Daher hat es mindestens zwei ganzzahlige Faktoren größer als 1. Sei f der kleinste dieser Faktoren von n. Angenommen, f> sqrt n. Dann ist n / f eine ganze Zahl LTE sqrt n, also kleiner als f. Daher kann f nicht der kleinste Faktor von n sein. Reductio ad absurdum; Der kleinste Faktor von n muss LTE sqrt n sein.

Reb.Cabin
quelle
1

Jede zusammengesetzte Zahl ist ein Produkt von Primzahlen.

Sagen wir n = p1 * p2, wo p2 > p1und sie sind Primzahlen.

Wenn n % p1 === 0dann ist n eine zusammengesetzte Zahl.

Wenn n % p2 === 0dann raten Sie mal was n % p1 === 0auch!

Es gibt also keine Möglichkeit, wenn n % p2 === 0aber n % p1 !== 0gleichzeitig. Mit anderen Worten, wenn eine zusammengesetzte Zahl n gleichmäßig durch p2, p3 ... pi (ihr größerer Faktor) geteilt werden kann, muss sie auch durch ihren niedrigsten Faktor p1 geteilt werden. Es stellt sich heraus, dass der niedrigste Faktor p1 <= Math.square(n)immer wahr ist.

Kanake
quelle
Wenn Sie neugierig sind, warum es wahr ist, hat @LoMaPh die Tatsache in seiner Antwort sehr erklärt. Ich habe meine Antwort hinzugefügt, weil ich es wirklich schwer hatte, andere Antworten zu visualisieren und zu verstehen. Es hat einfach nicht geklickt.
daGo
0

Um die Primalität einer Zahl n zu testen , würde man zunächst eine Schleife wie die folgende erwarten:

bool isPrime = true;
for(int i = 2; i < n; i++){
    if(n%i == 0){
        isPrime = false;
        break;
    }
}

Die obige Schleife bewirkt Folgendes: Für eine gegebene 1 <i <n wird geprüft, ob n / i eine ganze Zahl ist (der Rest bleibt 0). Wenn es ein i gibt, für das n / i eine ganze Zahl ist, können wir sicher sein, dass n keine Primzahl ist. An diesem Punkt endet die Schleife. Wenn für no i n / i eine ganze Zahl ist, dann ist n eine Primzahl.

Wie bei jedem Algorithmus fragen wir: Können wir es besser machen?

Lassen Sie uns sehen, was in der obigen Schleife vor sich geht.

Die Folge von i lautet: i = 2, 3, 4, ..., n-1

Und die Folge von Ganzzahlprüfungen lautet: j = n / i, dh n / 2, n / 3, n / 4, ..., n / (n-1)

Wenn für einige i = a n / a eine ganze Zahl ist, dann ist n / a = k (ganze Zahl)

oder n = ak, klar n> k> 1 (wenn k = 1, dann a = n, aber ich erreiche nie n; und wenn k = n, dann ist a = 1, aber ich beginne mit Form 2)

Auch ist n / k = a, und wie oben angegeben, ist a ein Wert von i, also n> a> 1.

A und k sind also beide ganze Zahlen zwischen 1 und n (exklusiv). Da ich jede ganze Zahl in diesem Bereich erreiche, bei einer Iteration i = a und bei einer anderen Iteration i = k. Wenn der Primalitätstest von n für min (a, k) fehlschlägt, schlägt er auch für max (a, k) fehl. Wir müssen also nur einen dieser beiden Fälle prüfen, es sei denn, min (a, k) = max (a, k) (wobei zwei Prüfungen auf eins reduziert werden), dh a = k, an welchem ​​Punkt a * a = n, welcher impliziert a = sqrt (n).

Mit anderen Worten, wenn der Primalitätstest von n für einige i> = sqrt (n) (dh max (a, k)) fehlschlagen würde, würde er auch für einige i <= n (dh min (a) fehlschlagen , k)). Es würde also ausreichen, wenn wir den Test für i = 2 bis sqrt (n) ausführen.

Aroonalok
quelle
Es gibt viel kürzere und meiner Meinung nach viel einfacher zu verstehende und
Thierry Lathuille