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?
floor(sqrt(n))
.
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?
floor(sqrt(n))
.
Antworten:
Wenn eine Zahl n
keine Primzahl ist, kann es in zwei Faktoren werden berücksichtigt a
und b
:
n = a * b
Jetzt a
und b
kann nicht beide größer als die Quadratwurzel von sein n
, da dann das Produkt a * b
größer als wäre sqrt(n) * sqrt(n) = n
. Bei jeder Faktorisierung von n
muss 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, n
muss dies eine Primzahl sein.
sqrt(n)
genau genug sein, damit diese Eigenschaft gilt, wenn wir Gleitkommazahlen verwenden?
i * i <= n
anstatt i <= sqrt(n)
die Feinheiten von Gleitkommazahlen zu vermeiden.
Sagen wir m = sqrt(n)
dann m × m = n
. Nun, wenn n
es keine Primzahl ist, n
kann es so geschrieben n = a × b
werden m × m = a × b
. Beachten Sie, dass dies m
eine reelle Zahl n
ist a
und b
natürliche Zahlen sind.
Jetzt kann es 3 Fälle geben:
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 n
keine Primzahl ist.
n is not a prime
, und beweisen Sie es, sonst ist es eine Primzahl.
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.
`
Angenommen, es n
ist keine Primzahl (größer als 1). Es gibt also Zahlen a
und b
solche
n = ab (1 < a <= b < n)
Durch Multiplikation der Beziehung a<=b
mit a
und erhalten b
wir:
a^2 <= ab
ab <= b^2
Deshalb: (beachten Sie, dass n=ab
)
a^2 <= n <= b^2
Daher: (Beachten Sie, dass a
und b
positiv 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.
Nehmen wir an, dass die angegebene Ganzzahl N
keine Primzahl ist.
Dann kann N faktorisiert in zwei Faktoren werden a
und b
, 2 <= a, b < N
dass 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 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 ist a <= sqrt(N)
.
Deshalb a = 1
und b = n
und damit per definitionem N
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, bis sqrt(N)
alle a i abgedeckt sind . Und so können Sie schließen, ob es sich N
um eine Primzahl handelt oder nicht .
...
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 bis sqrroot(n)
gleichmäßig in geteilt wird n
, n
kann 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;
}
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.
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.
Bei einer beliebigen Zahl n
besteht eine Möglichkeit, die Faktoren zu ermitteln, darin, die Quadratwurzel zu ermitteln p
:
sqrt(n) = p
Wenn wir uns p
von 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 a
erhöht, dann b
verringert, um beizubehalten a*b = n
. Daher p
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 der n
Fall ist, wäre dies keine Primzahl. Könnte p
also eine reelle Zahl sein (dh mit Brüchen). Und anstatt die gesamte Bandbreite von n
zu durchlaufen, müssen wir jetzt nur noch die gesamte Bandbreite von durchlaufen p
. Die andere p
ist eine Spiegelkopie, also halbieren wir den Bereich. Und dann, jetzt sehe ich, dass wir das tatsächlich wiederholen square root
und tun können, p
um die Hälfte der Reichweite zu erreichen.
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.
Jede zusammengesetzte Zahl ist ein Produkt von Primzahlen.
Sagen wir n = p1 * p2
, wo p2 > p1
und sie sind Primzahlen.
Wenn n % p1 === 0
dann ist n eine zusammengesetzte Zahl.
Wenn n % p2 === 0
dann raten Sie mal was n % p1 === 0
auch!
Es gibt also keine Möglichkeit, wenn n % p2 === 0
aber n % 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 Faktor p1 <= Math.square(n)
immer wahr ist.
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.
n = a*b
unda <= b
danna*a <= a*b = n
.