Bestimmen, ob eine Zahl prim ist

8

Ich habe eine Menge Code zu diesem Thema gelesen, aber die meisten von ihnen erzeugen die Zahlen, die bis zur Eingangsnummer prim sind. Ich benötige jedoch einen Code, der nur prüft, ob die angegebene Eingangsnummer prim ist.

Hier ist, was ich schreiben konnte, aber es funktioniert nicht:

%Vor%

Ich würde mich freuen, wenn mir jemand Tipps geben könnte, wie das funktioniert.

Aktualisieren

Ich habe es geändert, um alle Zahlen in einer for-Schleife zu überprüfen.

%Vor%     
carla 12.12.2010, 22:11
quelle

20 Antworten

13

Sie müssen noch etwas überprüfen. Im Moment überprüfen Sie nur, ob die Zahl durch 2 teilbar ist. Tun Sie dasselbe für 2, 3, 4, 5, 6, ... bis zu number . Tipp: Verwenden Sie eine Schleife .

Nachdem Sie das Problem gelöst haben, suchen Sie nach Optimierungen. Tipp: Sie müssen nur alle Zahlen bis zur Quadratwurzel der Zahl überprüfen

    
Pablo Santa Cruz 12.12.2010, 22:14
quelle
32

Meine eigene IsPrime () - Funktion, geschrieben und basierend auf der deterministischen Variante des berühmten Rabin-Miller-Algorithmus, kombiniert mit optimiertem Schritt-Brute-Forcing, bietet Ihnen eine der schnellsten Testfunktionen überhaupt.

%Vor%

Um den Code zu verwenden, kopieren Sie ihn und fügen Sie ihn oben in Ihr Programm ein. Rufen Sie es auf, und es gibt einen BOOL-Wert zurück, entweder True oder False.

%Vor%

Wenn Sie beim Kompilieren mit "__int64" ein Problem bekommen, ersetzen Sie dieses durch "long". Es kompiliert gut unter VS2008 und VS2010.

Wie es funktioniert: Die Funktion besteht aus drei Teilen. Teil überprüft, ob es eine der seltenen Ausnahmen (negative Zahlen, 1) ist, und abfängt die Ausführung des Programms.

Teil zwei beginnt, wenn die Zahl kleiner ist als 1373653, was die theoretische Zahl ist, bei der der Rabin-Miller-Algorithmus meine optimierte Brute-Force-Funktion übertrifft. Dann kommen zwei Stufen von Rabin Miller, um die Anzahl der benötigten Zeugen zu minimieren. Da die meisten Zahlen, die Sie testen werden, unter 4 Milliarden liegen, kann der probabilistische Rabin-Miller-Algorithmus durch Überprüfen der Zeugen 2, 7 und 61 deterministisch gemacht werden. Wenn Sie die 4 Milliarden Cap überschreiten müssen, benötigen Sie eine große number library und wendet eine modul- oder bit shift-Änderung auf die power () -Funktion an.

Wenn Sie auf einer Brute-Force-Methode bestehen, hier ist nur meine optimierte Brute-Force-IsPrime () -Funktion:

%Vor%

Wie dieses Brute-Force-Stück funktioniert: Alle Primzahlen (außer 2 und 3) können in der Form 6k + 1 oder 6k-1 ausgedrückt werden, wobei k eine positive ganze Zahl ist. Dieser Code verwendet diese Tatsache und testet alle Zahlen in der Form von 6k + 1 oder 6k-1 weniger als die Quadratwurzel der fraglichen Nummer. Dieses Stück ist in meine größere IsPrime () -Funktion integriert (die Funktion zuerst).

Wenn Sie alle Primzahlen unterhalb einer Zahl finden müssen, finden Sie alle Primzahlen unter 1000, schauen Sie in das Sieb von Eratosthenes. Ein weiterer Liebling von mir.

Als zusätzliche Anmerkung würde ich gerne sehen, dass irgendjemand den Eliptical Curve Method-Algorithmus implementiert, der schon seit einiger Zeit in C ++ implementiert sein möchte. Ich habe meine Implementierung verloren. Theoretisch ist es sogar schneller als der deterministische Rabin-Miller-Algorithmus, den ich implementiert habe, obwohl ich mir nicht sicher bin, ob das für Zahlen unter 4 Milliarden gilt.

    
LostInTheCode 12.12.2010 22:36
quelle
31
%Vor%     
Toomtarm Kung 19.01.2013 20:35
quelle
5

Ich nehme an, dass sqrt und foreach frpm 2 zu sqrt + 1 ausgeführt werden, wenn (input% number! = 0) false zurückgibt; Sobald Sie sqrt + 1 erreichen, können Sie sich sicher sein, dass es das Beste ist.

    
Valentin Kuzub 12.12.2010 22:15
quelle
4

C ++

%Vor%

JavaScript

%Vor%

Python

%Vor%     
un33k 20.09.2016 16:22
quelle
3

Wenn Sie den Bereich der Eingaben kennen (was Sie tun, da Ihre Funktion int annimmt), können Sie eine Tabelle von Primzahlen vorberechnen, die kleiner oder gleich der Quadratwurzel der maximalen Eingabe ist (2 ^ 31-1 In diesem Fall), und teste dann die Teilbarkeit, indem jede Primzahl in der Tabelle kleiner oder gleich der Quadratwurzel der angegebenen Zahl ist.

    
user470379 12.12.2010 22:16
quelle
2

Dieser Code prüft nur, ob die Zahl durch zwei teilbar ist. Damit eine Zahl prim ist, darf sie nicht ganz durch alle ganzen Zahlen kleiner als sie selbst sein. Dies kann naiv implementiert werden, indem überprüft wird, ob es durch ganze Zahlen kleiner als floor(sqrt(n)) in einer Schleife teilbar ist. Wenn Sie interessiert sind, gibt es eine Reihe von viel schnelleren Algorithmen , die es gibt.

    
Michael Koval 12.12.2010 22:16
quelle
2

Wenn du faul bist und viel RAM hast, erschaffe ein Sieb von Eratosthenes , das praktisch ein riesiges Array ist aus dem du alle Zahlen gekickt hast, die nicht prim sind. Ab dann wird jeder Prime "Wahrscheinlichkeits" -Test super schnell sein. Die obere Grenze für diese Lösung für schnelle Ergebnisse ist die Menge an RAM. Die Obergrenze für diese Lösung für SuperLow-Ergebnisse ist die Kapazität Ihrer Festplatte.

    
karatedog 12.12.2010 22:45
quelle
2

Ich folge dem gleichen Algorithmus, aber einer anderen Implementierung, die zu sqrt (n) mit Schritt 2 nur ungeraden Zahlen führt, weil ich überprüfe, ob es, wenn es durch 2 oder 2 * k teilbar ist, falsch ist. Hier ist mein Code

%Vor%     
user467871 14.12.2010 10:24
quelle
2

Benutze Mathematik zuerst die Quadratwurzel der Zahl und dann die Schleife, bis die Zahl endet, die du nach der Quadratwurzelung erhältst. überprüfe für jeden Wert, ob die gegebene Zahl durch den Iterationswert teilbar ist. Wenn irgendein Wert die gegebene Zahl teilt, dann ist es keine Primzahl, sonst Primzahl. Hier ist der Code

%Vor%     
Dev Kumar 21.10.2015 20:32
quelle
2
%Vor%

prüft auf eine beliebige Zahl, wenn es eine Primzahl ist

    
user6449382 10.06.2016 09:30
quelle
1

Jemand oben hatte folgendes:

%Vor%

Das hat meistens funktioniert. Ich habe es gerade in Visual Studio 2017 getestet. Es würde sagen, dass alles, was weniger als 2 war auch Prime (also 1, 0, -1, etc.)

Hier ist eine kleine Modifikation, um das zu korrigieren.

%Vor%     
Joe C 11.02.2018 00:03
quelle
0

Siehe das Programm hier: Ссылка

    
Ryan Bigg 12.12.2010 22:19
quelle
0

Es gibt mehrere verschiedene Ansätze für dieses Problem.
Die "naive" Methode: Versuche alle (ungeraden) Zahlen bis zur (Wurzel) der Zahl.
Verbesserte "Naive" Methode: Versuche nur alle 6n ± 1.
Probabilistische Tests: Miller-Rabin, Solovay-Straße, etc.

Welcher Ansatz zu Ihnen passt, hängt davon ab, was Sie mit der Prime machen.
Sie sollten zumindest auf Primärtests nachlesen.

    
Sani Singh Huttunen 12.12.2010 22:19
quelle
0
%Vor%

    
Aleksey Bykov 25.04.2013 14:12
quelle
0

Ich kam auf folgendes:

%Vor%

}

    
Mr. Frank 25.03.2017 13:13
quelle
0

Wenn n 2 ist, ist es prim.

Wenn n 1 ist, ist es nicht prim.

Wenn n gerade ist, ist es nicht prim.

Wenn n ungerade ist, größer als 2, müssen wir alle ungeraden Zahlen 3..sqrt (n) +1 prüfen, wenn irgendeine dieser Zahlen n teilen kann, n ist nicht prim, sonst ist n prim.

Für bessere Leistung empfehle ich Sieb von Eratosthenes.

Hier ist das Codebeispiel:

%Vor%
    
izanbf1803 23.03.2017 17:00
quelle
0

Ich habe diese Idee zu finden, wenn die Nr. ist Prime oder nicht:

%Vor%     
Ratnesh Aroskar 04.08.2017 12:25
quelle
-1
%Vor%     
Kapil 30.12.2010 05:27
quelle
-3
%Vor%

Der Code ist unglaublich falsch. 33 geteilt durch 2 ist 16 mit Erinnerung an 1, aber es ist keine Primzahl ...

    
Jojo Jkee 30.11.2015 19:44
quelle

Tags und Links