558 Stimmen

Warum prüft man bis zur Quadratwurzel einer Zahl, ob die Zahl eine Primzahl ist?

Warum muss man, um zu prüfen, ob eine Zahl eine Primzahl ist oder nicht, prüfen, ob sie nur bis zur Quadratwurzel dieser Zahl teilbar ist?

51 Stimmen

Denn wenn n = a*b y a <= b entonces a*a <= a*b = n .

18 Stimmen

Zur Verdeutlichung: Das bedeutet, dass wir nur bis zu dem Zeitpunkt testen müssen, an dem floor(sqrt(n)) .

7 Stimmen

919voto

Sven Marnach Punkte 525472

Wenn eine Zahl n keine Primzahl ist, kann sie in zwei Faktoren zerlegt werden a y b :

n = a * b

Jetzt a y b kann nicht gleichzeitig größer sein als die Quadratwurzel aus n , da dann das Produkt a * b größer sein würde als sqrt(n) * sqrt(n) = n . In jeder Faktorisierung von n muss mindestens einer der Faktoren kleiner sein als die Quadratwurzel aus n und wenn wir keine Faktoren finden können, die kleiner oder gleich der Quadratwurzel sind, n muss eine Primzahl sein.

3 Stimmen

Wie funktioniert sqrt(n) müssen genau genug sein, damit diese Eigenschaft erhalten bleibt, da wir Fließkommazahlen verwenden.

27 Stimmen

@Benoît Sie können immer den Scheck verwenden i * i <= n anstelle von i <= sqrt(n) wenn Sie die Feinheiten der Gleitkommazahlen vermeiden wollen.

2 Stimmen

Da es nicht verletzt (abgesehen von einer zusätzlichen Division), um einen weiteren Divisor zu überprüfen, können Sie einfach ceil(sqrt(n)) berechnen.

384voto

BiGYaN Punkte 6796

Sagen wir m = sqrt(n) dann m × m = n . Wenn nun n keine Primzahl ist, dann n kann geschrieben werden als n = a × b also m × m = a × b . Beachten Sie, dass m eine reelle Zahl ist, während n , a y b sind natürliche Zahlen.

Nun 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 suchen bis m finden wir mit Sicherheit mindestens einen Faktor von n was ausreicht, um zu zeigen, dass n nicht primär ist.

5 Stimmen

N = 12 m = sqrt(12) = 3,46, a = 2, b = 6. n = m m d.h. 12=3,46*3,46 und n = a b d.h. 12=2*6. Jetzt Bedingung 3. a < m < b, d.h. 2 < 3,46 < 6. Um die Primzahl zu prüfen, müssen wir nur prüfen, ob die Zahl kleiner als 3,46 ist, also 2, um herauszufinden, dass die Zahl nicht prim ist. Prüfen Sie also die Teilbarkeit durch Zahlen, die kleiner oder gleich (wenn n = 4, m=a=b=2) der Quadratwurzel von n sind.

2 Stimmen

Ich denke, wir sollten zuerst die Vermutung hervorheben. Angenommen, n is not a prime und das beweisen, sonst ist es eine Primzahl.

0 Stimmen

Ich bin nicht überzeugt, dass dies eine bessere Antwort ist. Es ist eine richtige Antwort, aber sie beantwortet die Frage nicht wirklich. Sie beschreibt nur einige andere Dynamiken rund um Primzahlen und den Quadratwert. Die Antwort von @Sven ist sowohl kurz als auch bündig und wirft keine weiteren Fragen auf.

71voto

patros Punkte 7443

Denn wenn ein Faktor größer ist als die Quadratwurzel aus n, ist der andere Faktor, der mit ihm multipliziert werden müsste, um n zu ergeben, notwendigerweise kleiner als die Quadratwurzel aus n.

30voto

LoMaPh Punkte 1086

Angenommen, n keine Primzahl (größer als 1) ist. Es gibt also Zahlen a y b derart, dass

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

Durch Multiplikation der Beziehung a<=b por a y b erhalten wir:

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

Daher: (beachten Sie, dass n=ab )

a^2 <= n <= b^2

Daraus folgt: (Beachten Sie, dass a y 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.

12voto

Super Cat Punkte 1421

Es handelt sich eigentlich nur um grundlegende Anwendungen von Faktorisierung und Quadratwurzeln.

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

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

Wenn also eine ganze Zahl über 1 und darunter oder bis zu sqrroot(n) unterteilt sich gleichmäßig in n entonces n keine Primzahl sein kann.

Pseudocode-Beispiel:

i = 2;

is_prime = true;

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

1 Stimmen

Eine brillante Beobachtung. Die Nutzung dieser Beobachtung zur Schaffung eines guard Anweisung in Swift in Verbindung mit dieser praktischen stackoverflow.com/a/25555762/4475605 um eine Berechnung vorzeitig zu beenden, anstatt Rechenleistung zu verschwenden. Vielen Dank für Ihren Beitrag.

0 Stimmen

@Adrian Ich muss gestehen, dass ich, nachdem ich auf diese Antwort zurückgekommen bin, zum Zeitpunkt Ihres Postings einen Fehler gefunden habe. Man kann keine Division mit einer 0 durchführen, und wenn man es theoretisch könnte ++i würde zur Zahl 1 werden, die immer falsch zurückgeben würde (weil 1 sich durch alles teilt). Ich habe die Antwort oben korrigiert.

1 Stimmen

Yep ... Ich adressiert, dass in meinem Code ... Ihre Quadratwurzel Beobachtung ist eine gute Möglichkeit, eine nicht-Prime-Wert früh zu werfen, bevor Sie beginnen, Berechnungen ausführen. Ich wurde von einer großen Zahl erschlagen, die sich als große Zeitverschwendung herausstellte. Ich habe auch gelernt, dass dieser Algorithmus die Verarbeitungszeiten für große Zahlen erheblich reduzieren kann. de.wikipedia.org/wiki/Miller -Rabin_Primatitätstest

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X