Ich habe diese Lösung ziemlich schnell gefunden, aber sie hat Konsequenzen. Dies wird Fermats kleiner Satz genannt. Wenn wir eine beliebige Zahl p
nehmen und diese in (1^p)-1
oder (2^p)-2
...(n^p)-n
usw. einsetzen und die Zahl, die wir erhalten, durch p
teilbar ist, dann handelt es sich um eine Primzahl. Bezüglich der Konsequenzen ist es keine 100%ige richtige Lösung. Es gibt einige Zahlen wie 341
(nicht prim), die den Test mit (2^341)-2
bestehen werden, aber bei (3^341)-3
durchfallen, daher werden sie als zusammengesetzte Zahlen bezeichnet. Wir können zwei oder mehr Überprüfungen durchführen, um sicherzustellen, dass sie alle bestehen. Es gibt noch eine Art von Zahlen, die nicht prim sind, aber auch alle Testfälle bestehen: (561, 1729 Ramanujan-Taxi-Nr. etc.)
Das Gute: Mit (2^p)-2
fallen in den ersten 25 Milliarden Zahlen nur 2183 durch diesen Fall.
#include
#include
using namespace std;
int isPrime(int p)
{
int tc = pow(2, p) - 2;
if (tc % p == 0)
{
cout << p << " ist prim ";
}
else
{
cout << p << " ist nicht prim";
}
return 0;
}
int main()
{
int p;
cin >> p;
isPrime(p);
return 0;
}
0 Stimmen
Ein altes Artikel, das ich gefunden habe, aber interessant aussieht: Spaß mit Primzahlen
30 Stimmen
@Jaider dies scheitert bereits bei Zahlen so niedrig wie 7 (111). Es scheitert auch für 1001=9. Und offensichtlich scheitert es für fast alle Primzahlen im Allgemeinen (deckt nicht den Fall 2^p - 1 ab, die Mersenne-Primzahlen sind - klassisch generierte Beispiele - die immer in Form von 111...1 sein werden)
2 Stimmen
@Kasperasky - Sie haben nicht erwähnt, welches Sieb? Sie meinen wahrscheinlich das Sieb von Eranthoses!
0 Stimmen
Sieb des Eratosthenes Algorithmus
1 Stimmen
Es ist erstaunlich zu sehen, wie viele Antworten es gibt, wenn die Frage absolut unmöglich zu beantworten ist, ohne den Zahlenbereich zu kennen, der abgedeckt werden soll. Wenn Sie alle Primzahlen möchten, ist kein schneller Algorithmus erforderlich.
0 Stimmen
@YvesDaoust ... und mit der besten Antwort, die eindeutig falsch ist, und der zweitbesten Antwort, die keine Antwort ist (im Grunde genommen sagt sie: "Jemand anderes hat es bereits gemacht, nutze ihre Ergebnisse").
1 Stimmen
@WillNess: Würde
int p[]= {2, 3};
als "schnellster Algorithmus zum Auffinden von Primzahlen" gelten?0 Stimmen
@YvesDaoust "...unter 4", vielleicht (mit der fest codierten 4). Andernfalls muss der benötigte Bereich angegeben werden (auch wenn es [0,+inf) ist).
1 Stimmen
@WillNess: Ich frage mich, ob eine einzige Primzahl ausreichen würde, um "numberS" zu befriedigen.
0 Stimmen
@YvesDaoust auch keine Zahlen können die Antwort sein, zum Beispiel für Primzahlen über 5 unter 7.