Bestimmung, ob eine Zahl eine Primzahl ist
Habe ich schon durchgelesen, eine Menge code zu diesem Thema, aber die meisten von Ihnen produzieren die zahlen, die Primzahlen sind alle Weg, bis auf die Eingangs-Nummer. Allerdings brauche ich code, der nur prüft, ob der angegebene input-Zahl eine Primzahl ist.
Hier ist, was ich in der Lage war, zu schreiben, aber es funktioniert nicht:
void primenumber(int number)
{
if(number%2!=0)
cout<<"Number is prime:"<<endl;
else
cout<<"number is NOt prime"<<endl;
}
Ich würde es begrüßen, wenn jemand könnte mir einen Rat geben, wie man diese richtig funktionieren.
Update
Ich geändert, um zu prüfen auf alle zahlen in einer for-Schleife.
void primenumber(int number)
{
for(int i=1; i<number; i++)
{
if(number%i!=0)
cout<<"Number is prime:"<<endl;
else
cout<<"number is NOt prime"<<endl;
}
}
- Dein code tut, ist zu berichten, wenn die Zahl ist durch 2 teilbar. Was den Allgemeinen Ansatz würden Sie verwenden, um zu erkennen, Primzahlen? Lasst uns damit anfangen, und das Handwerk ist es in ausführbaren code.
- Haben Sie darüber nachgedacht, was es bedeutet, für eine Zahl Primzahl? Schreiben Sie in pseudocode und schalten Sie es dann in den realen code.
- mögliche Duplikate von zu entscheiden, ob eine Zahl vollkommen ist oder prime
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie tun müssen, etwas mehr Kontrolle. Jetzt, Sie sind nur zu überprüfen, ob die Zahl ist durch 2 teilbar. Tun Sie das gleiche für 2, 3, 4, 5, 6, ... bis zu
number
. Tipp: benutzen Sie eine Schleife.Nachdem Sie dies beheben, versuchen der Suche nach Optimierungen.
Hinweis: Sie haben nur zu prüfen, alle zahlen bis zur Quadratwurzel der Zahl
Meine eigenen IsPrime () - Funktion geschrieben und auf der Grundlage der deterministischen Variante des berühmten Rabin-Miller-Algorithmus, kombiniert mit einem optimierten Schritt brute Force, so dass Sie eine der schnellsten prime Funktionen zu testen gibt.
Zu verwenden, zu kopieren und fügen Sie den code in das oben auf Ihrem Programm. Nennen Sie es, und es gibt einen BOOL-Wert, der entweder true oder false.
Wenn Sie ein problem kompilieren mit "__int64", ersetzen mit "lange". Es kompiliert einwandfrei unter VS2008 und VS2010.
Wie es funktioniert:
Es gibt drei Teile, um die Funktion. Teil prüft, um zu sehen, ob es ist eine der seltenen Ausnahmen (negative zahlen, 1), und fängt die Ausführung des Programms.
Teil zwei beginnt, wenn die Zahl kleiner als 1373653, die die theoretisch-Nummer wo der Rabin-Miller-Algorithmus zu schlagen meine optimierte brute-force-Funktion. Dann kommt zwei Ebenen der Rabin-Miller, entworfen, um zu minimieren die Anzahl der Zeugen benötigt. Wie die meisten zahlen, werden Sie die Tests sind unter 4 Milliarden, die probabilistischen Rabin-Miller-Algorithmus gemacht werden kann deterministisch durch die überprüfung von Zeugen 2, 7 und 61. Wenn Sie brauchen, um gehen über die 4-Milliarden-cap, benötigen Sie eine große Anzahl-Bibliothek, und legen Sie eine Modul-oder bit-shift Modifikation der power () - Funktion.
Wenn Sie darauf bestehen, auf eine brute-force-Methode, hier nur meine optimierte brute-force-IsPrime () - Funktion:
Wie diese brute-force-Stück funktioniert:
Alle Primzahlen (ausgenommen 2 und 3) kann ausgedrückt werden in der form 6k+1 oder 6k-1, wobei k eine positive ganze Zahl. Dieser code nutzt diese Tatsache, und tests alle zahlen der form 6k+1 oder 6k-1 weniger als die Quadratwurzel der Zahl in Frage. Dieses Stück ist integriert in meinem größeren IsPrime () - Funktion (die Funktion, die zuerst angezeigt).
Wenn Sie brauchen, um alle Primzahlen unterhalb einer Zahl, finden Sie alle Primzahlen unter 1000, schauen Sie in das Sieb des Eratosthenes. Ein weiterer Favorit von mir.
Als zusätzliche Anmerkung, ich würde gerne sehen, wer implementiert die Elliptische Kurve, Methode, Algorithmus, gefehlt, um zu sehen, dass in C++ implementiert, die für eine Weile jetzt, ich verlor meine Umsetzung davon. Theoretisch ist es sogar schneller als die deterministischen Rabin-Miller-Algorithmus implementiert habe ich, obwohl ich nicht sicher bin, ob das stimmt für die Nummern unter 4 Milliarden.
Ich würde vermuten, die Einnahme von sqrt und ausgeführt foreach frpm 2 bis sqrt+1 if(Eingabe% Zahl!=0) return false;
wenn Sie erreichen sqrt+1 können Sie sicher sein, Ihre prime.
Wenn Sie wissen, die Auswahl der Eingänge (was Sie tun, da Ihre Funktion eine
int
), können Sie vorausberechnen eine Tabelle der Primzahlen kleiner oder gleich der Quadratwurzel der max-Eingang (2^31-1 in diesem Fall), und testen Sie dann für die Teilbarkeit von jedem prime in der Tabelle weniger als oder gleich der Quadratwurzel der Zahl gegeben.prüft für jede Nummer, wenn seine eine Primzahl
C++
Javascript
Python
Dieser code nur überprüft, ob die Zahl teilbar durch zwei. Für eine Zahl Primzahl ist, muss es nicht teilbar durch alle ganzen zahlen kleiner als Sie selbst. Dies kann naiv implementiert, indem überprüft wird, ob es teilbar ist durch alle ganzen zahlen kleiner als
floor(sqrt(n))
in einer Schleife. Wenn Sie interessiert sind, gibt es eine Reihe von viel schneller algorithmen in Existenz.Wenn Sie faul sind, und haben eine Menge RAM, erstellen Sie eine Sieb des Eratosthenes das ist praktisch eine Riesen-array, aus dem Sie hinausgeworfen, alle zahlen, die nicht prim.
Ab dann ist jeder prime "Wahrscheinlichkeit" test wird super schnell.
Die Obere Grenze für diese Lösung für schnelle Ergebnisse ist der Betrag, den Sie RAM. Die Obere Grenze für diese Lösung für superslow Ergebnisse ist Ihre Festplatte die Kapazität.
sqrt
Ihre Obere Grenze. Das segment-array kann weiter verkürzt durch die Verwendung von bits, die Arbeit mit Verschiedenheit nur, oder sogar 2-3-5-coprimes.sqrt(N)
int
Primzahlen ist es Wert.Ich Folgen demselben Algorithmus, aber andere Implementierung, die Schleife zu sqrt(n) mit Schritt 2 nur ungerade zahlen, weil ich prüfen ob es teilbar ist durch 2 oder 2*k es ist falsch. Hier ist mein code
Mathematik benutzen die ersten finden, die Quadratwurzel der Zahl, dann start-Schleife, bis die Nummer enden, die Sie erhalten, nachdem square wühlen.
überprüfen Sie für jeden Wert, ob die gegebene Zahl teilbar ist durch die Iteration mit dem Wert .wenn ein Wert teilt sich die angegebene Nummer, dann ist es keine Primzahl sonst prime.
Hier ist der code
Jemand oben waren die folgenden.
Diese meist gearbeitet. Habe es gerade getestet in Visual Studio 2017. Es würde sagen, dass alles, was weniger als 2 war auch prime (also 1, 0, -1, etc.)
Hier ist eine leichte Modifikation, dies zu korrigieren.
Gibt es verschiedene Ansätze zu diesem problem.
Der "Naive" Methode: Versuchen Sie, alle (ungeraden) zahlen Sie bis (die Wurzel), die Nummer.
Verbesserte "Naive" Methode: Nur jeder ausprobieren 6n ± 1.
Probabilistische tests: Miller-Rabin, Solovay-Strasse, etc.
Welches Konzept zu Ihnen passt, hängt und was Sie tun, mit die prime.
Sie sollten wenigstens Lesen, auf Primality Testing.
6n + 1
zahlen... ich behaupte, sollten Sie testen, jede6n ± 1
... das ist6n + 1
UND6n - 1
... Das hat sich bewährt, um korrekt zu sein...Wenn n 2 ist eine Primzahl.
Wenn n 1 ist, es ist nicht prim.
Wenn n gerade ist, ist es nicht prim.
Wenn n ungerade ist, größer als 2 ist, müssen wir überprüfen, ob alle ungeraden zahlen 3..sqrt(n)+1, wenn eine dieser zahlen teilen kann n, n ist nicht prim, sonst, n ist eine Primzahl.
Für eine bessere Leistung, ich empfehle Sieb des eratosthenes.
Hier ist das Codebeispiel:
for (int i = 3; i < sqrt(n)+1; i=i+2) {
i < sqrt(n)+1
.i*i < n+1
isti < sqrt(n+1)
anstelle der geforderteni < sqrt(n) + 1
ich bin mir nicht sicher, ob es irgendwelche möglichen Werte vonn
wenn dies so egal sein kann, du hast Recht und es ist ok.Habe Ich Diese Idee Zu Finden, Wenn Dem Keine. Eine Primzahl ist oder Nicht:
1
für11
was ist eine Primzahl.Ich kam mit dieser:
Dies ist eine schnelle, effektive eins:
Wird es beginnen, finden eine teilbare Anzahl von n, beginnend mit 2. Sobald einer gefunden wird, wenn diese Anzahl gleich n, dann es ist prime, sonst ist es nicht.
for( i = 3; (i*i) < num; i += 2 )
Hinweis: die(i*i) < num
im Vergleich zu Ihrem ursprünglichen code basierend auf einfachi < num
Lassen Sie mich wissen, wenn Sie aktualisieren Sie Ihre Antwort... CheersDer code ist unglaublich falsch. 33 geteilt durch 2 ist 16 mit Erinnerung an 1, aber es ist nicht eine Primzahl...