J, 50 40 38 37 Zeichen
f=:3 :'+/y<:}.~.,(~:/**/)~p:i._1&p:y'
Verwendungszweck:
f 1
0
f 62
18
f 420
124
f 10000
2600
Mit Dank an FUZxxl .
Leistungstest
showtotal_jpm_ ''[f 1[start_jpm_ ''
Time (seconds)
┌───────┬──────┬────────┬────────┬─────┬────┬───┐
│name │locale│all │here │here%│cum%│rep│
├───────┼──────┼────────┼────────┼─────┼────┼───┤
│f │base │0.000046│0.000046│100.0│100 │1 │
│[total]│ │ │0.000046│100.0│100 │ │
└───────┴──────┴────────┴────────┴─────┴────┴───┘
showtotal_jpm_ ''[f 1[f 62[start_jpm_ ''
Time (seconds)
┌───────┬──────┬────────┬────────┬─────┬────┬───┐
│name │locale│all │here │here%│cum%│rep│
├───────┼──────┼────────┼────────┼─────┼────┼───┤
│f │base │0.000095│0.000095│100.0│100 │2 │
│[total]│ │ │0.000095│100.0│100 │ │
└───────┴──────┴────────┴────────┴─────┴────┴───┘
showtotal_jpm_ ''[f 1[f 62[f 420[start_jpm_ ''
Time (seconds)
┌───────┬──────┬────────┬────────┬─────┬────┬───┐
│name │locale│all │here │here%│cum%│rep│
├───────┼──────┼────────┼────────┼─────┼────┼───┤
│f │base │0.000383│0.000383│100.0│100 │3 │
│[total]│ │ │0.000383│100.0│100 │ │
└───────┴──────┴────────┴────────┴─────┴────┴───┘
showtotal_jpm_ ''[f 1[f 62[f 420[f 10000[start_jpm_ ''
Time (seconds)
┌───────┬──────┬────────┬────────┬─────┬────┬───┐
│name │locale│all │here │here%│cum%│rep│
├───────┼──────┼────────┼────────┼─────┼────┼───┤
│f │base │0.084847│0.084847│100.0│100 │4 │
│[total]│ │ │0.084847│100.0│100 │ │
└───────┴──────┴────────┴────────┴─────┴────┴───┘
showtotal_jpm_ ''[f 1[f 62[f 420[f 10000[f 50000[start_jpm_ ''
Time (seconds)
┌───────┬──────┬────────┬────────┬─────┬────┬───┐
│name │locale│all │here │here%│cum%│rep│
├───────┼──────┼────────┼────────┼─────┼────┼───┤
│f │base │5.014691│5.014691│100.0│100 │5 │
│[total]│ │ │5.014691│100.0│100 │ │
└───────┴──────┴────────┴────────┴─────┴────┴───┘
Ich bin kein Theoretiker, wie hier in der Vergangenheit gesehen wurde, aber ich denke, die zeitliche Komplexität ist so etwas wie O (n p 2 ), wobei n p die Anzahl der Primzahlen bis einschließlich der Eingangszahl n ist. Dies basiert auf der Annahme, dass die Komplexität meiner Methode (Generieren einer sehr großen Multiplikationstabelle) die Komplexität der in J eingebauten Primgenerierungsfunktion bei weitem überwiegt.
Erläuterung
f=:3 :'...'
deklariert ein (monadisches) Verb (Funktion). Die Eingabe in das Verb wird durch y
die Verbdefinition dargestellt.
p:i._1&p:y
Das p:
Verb ist das Mehrzweck-Primzahlverb und wird hier auf zwei verschiedene Arten verwendet: _1&p:y
Gibt die Anzahl der Primzahlen zurück, die geringer sind als die, die y
dann für p:i.
jede einzelne generiert werden. Verwendung von 10 als Eingabe:
p:i._1&p:10
2 3 5 7
(~:/**/)~
generiert die Tabelle, von der ich zuvor gesprochen habe. */
generiert eine Multiplikationstabelle, ~:/
generiert eine ungleiche Tabelle (um die Quadrate zu eliminieren) und beide werden miteinander multipliziert. Verwenden Sie unsere vorherige Ausgabe als Eingabe:
*/~2 3 5 7
4 6 10 14
6 9 15 21
10 15 25 35
14 21 35 49
~:/~2 3 5 7
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
(~:/**/)~2 3 5 7
0 6 10 14
6 0 15 21
10 15 0 35
14 21 35 0
}.~.,
Jetzt verwandeln wir die Zahlen in eine Liste, ,
erhalten die eindeutigen Werte ~.
und entfernen die 0 am Anfang}.
}.~.,(~:/**/)~2 3 5 7
6 10 14 15 21 35
y<:
ein Vergleich mit der ursprünglichen Eingabe, um zu überprüfen, welche Werte gültig sind:
10<:6 10 14 15 21 35
1 1 0 0 0 0
+/
und summiere das dann, um die Antwort zu erhalten.
+/1 1 0 0 0 0
2