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?
algorithm
primes
primality-test
Schwenken
quelle
quelle
n = a*b
unda <= b
danna*a <= a*b = n
.floor(sqrt(n))
.Antworten:
Wenn eine Zahl
n
keine Primzahl ist, kann es in zwei Faktoren werden berücksichtigta
undb
:Jetzt
a
undb
kann nicht beide größer als die Quadratwurzel von seinn
, da dann das Produkta * b
größer als wäresqrt(n) * sqrt(n) = n
. Bei jeder Faktorisierung vonn
muss mindestens einer der Faktoren kleiner als die Quadratwurzel von seinn
, und wenn wir keine Faktoren finden können, die kleiner oder gleich der Quadratwurzel sind,n
muss dies eine Primzahl sein.quelle
sqrt(n)
genau genug sein, damit diese Eigenschaft gilt, wenn wir Gleitkommazahlen verwenden?i * i <= n
anstatti <= sqrt(n)
die Feinheiten von Gleitkommazahlen zu vermeiden.Sagen wir
m = sqrt(n)
dannm × m = n
. Nun, wennn
es keine Primzahl ist,n
kann es so geschriebenn = a × b
werdenm × m = a × b
. Beachten Sie, dass diesm
eine reelle Zahln
ista
undb
natürliche Zahlen sind.Jetzt kann es 3 Fälle geben:
In allen 3 Fällen
min(a, b) ≤ m
. Wenn wir also bis suchenm
, müssen wir mindestens einen Faktor findenn
, der ausreicht, um zu zeigen, dass diesn
keine Primzahl ist.quelle
n is not a prime
, und beweisen Sie es, sonst ist es eine Primzahl.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.
quelle
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.
`
quelle
Angenommen, es
n
ist keine Primzahl (größer als 1). Es gibt also Zahlena
undb
solcheDurch Multiplikation der Beziehung
a<=b
mita
und erhaltenb
wir:Deshalb: (beachten Sie, dass
n=ab
)Daher: (Beachten Sie, dass
a
undb
positiv sind)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.
quelle
Nehmen wir an, dass die angegebene Ganzzahl
N
keine Primzahl ist.Dann kann N faktorisiert in zwei Faktoren werden
a
undb
,2 <= a, b < N
dass solcheN = a*b
. Natürlich können beide nicht größer alssqrt(N)
gleichzeitig sein.Nehmen wir ohne Verlust der Allgemeinheit an, dass
a
kleiner ist.Wenn Sie nun keinen Teiler der
N
Zugehörigkeit im Bereich finden konnten[2, sqrt(N)]
, was bedeutet das?Dies bedeutet, dass
N
in[2, a]
as kein Divisor vorhanden ista <= sqrt(N)
.Deshalb
a = 1
undb = n
und damit per definitionemN
ist 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
N
keine 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, bissqrt(N)
alle a i abgedeckt sind . Und so können Sie schließen, ob es sichN
um eine Primzahl handelt oder nicht ....
quelle
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
1
und unter oder bissqrroot(n)
gleichmäßig in geteilt wirdn
,n
kann dies keine Primzahl sein.Pseudocode-Beispiel:
quelle
guard
Anweisung 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.++i
die Zahl 1 werden könnten, würde dies immer false zurückgeben (weil 1 in alles teilt). Ich habe die Antwort oben korrigiert.Ü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.
quelle
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.
quelle
Bei einer beliebigen Zahl
n
besteht eine Möglichkeit, die Faktoren zu ermitteln, darin, die Quadratwurzel zu ermittelnp
:Wenn wir uns
p
von selbst vermehren , kommen wir natürlich zurückn
:Es kann wie folgt umgeschrieben werden:
Wo
p = a = b
. Wenna
erhöht, dannb
verringert, um beizubehaltena*b = n
. Daherp
ist die Obergrenze.Update: Ich lese diese Antwort heute noch einmal und es wurde mir klarer. Der Wert
p
bedeutet nicht unbedingt eine ganze Zahl, denn wenn dies dern
Fall ist, wäre dies keine Primzahl. Könntep
also eine reelle Zahl sein (dh mit Brüchen). Und anstatt die gesamte Bandbreite vonn
zu durchlaufen, müssen wir jetzt nur noch die gesamte Bandbreite von durchlaufenp
. Die anderep
ist eine Spiegelkopie, also halbieren wir den Bereich. Und dann, jetzt sehe ich, dass wir das tatsächlich wiederholensquare root
und tun können,p
um die Hälfte der Reichweite zu erreichen.quelle
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.
quelle
Jede zusammengesetzte Zahl ist ein Produkt von Primzahlen.
Sagen wir
n = p1 * p2
, wop2 > p1
und sie sind Primzahlen.Wenn
n % p1 === 0
dann ist n eine zusammengesetzte Zahl.Wenn
n % p2 === 0
dann raten Sie mal wasn % p1 === 0
auch!Es gibt also keine Möglichkeit, wenn
n % p2 === 0
abern % p1 !== 0
gleichzeitig. 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 Faktorp1 <= Math.square(n)
immer wahr ist.quelle
Um die Primalität einer Zahl n zu testen , würde man zunächst eine Schleife wie die folgende erwarten:
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.
quelle