Eine Primzahlpotenz ist eine positive ganze Zahl n das kann in der Form geschrieben werden , n = p k wobei p eine Primzahl ist und k eine positive ganze Zahl. Zum Beispiel sind einige Primkräfte [2, 3, 5, 4, 9, 25, 8, 27, 125]
.
Als nächstes betrachten [2, 4, 8, 16, ...]
wir Primzahlen von 2. Diese sind und können in der Form 2 k geschrieben werden . Sie werden alle berücksichtigt, wenn Primzahlen unter 20 berücksichtigt werden. 16 ist jedoch die maximale Primzahl mit einer Basisprimzahl von 2 in diesem Bereich. Eine Primzahlleistung p k ist maximal in einem Bereich, wenn es die höchste Leistung von p in diesem Bereich ist. Wir sind nur an der maximalen Primleistung in jedem Bereich interessiert , daher müssen alle niedrigeren Primleistungen ausgeschlossen werden.
Ihr Ziel ist es, eine Funktion oder ein Programm zu schreiben, das eine positive ganze Zahl n annimmt und die maximalen Primzahlen im Bereich ausgibt [2, 3, 4, ..., n]
.
Vielen Dank an @ Peter Taylor für die Klärung der Definition von maximaler Primkraft und mehr.
Regeln
- Das ist Code-Golf, also mach deinen Code so kurz wie möglich.
- Die maximalen Primzahlen können in beliebiger Reihenfolge ausgegeben werden, es dürfen jedoch keine Duplikate vorhanden sein.
Testfälle
n result
1 []
2 [2]
3 [2, 3]
4 [3, 4]
5 [3, 4, 5]
6 [3, 4, 5]
7 [3, 4, 5, 7]
20 [5, 7, 9, 11, 13, 16, 17, 19]
50 [11, 13, 17, 19, 23, 25, 27, 29, 31, 32, 37, 41, 43, 47, 49]
100 [11, 13, 17, 19, 23, 25, 29, 31, 37, 41, 43, 47, 49, 53, 59, 61, 64, 67, 71, 73, 79, 81, 83, 89, 97]
10000 <1229 results>
[101, 103, 107, 109, 113, 127, 131, 137, 139, 149, ..., 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973]
Die vollständige Liste der maximalen Primzahlen für 10000 finden Sie hier .
Power floor
Was zum TeufelMathematica,
444340 Bytes4 Bytes gespart dank Meilen und Martin Ender
n#^⌊#~Log~n⌋&/@Select[Range@n,PrimeQ]
⌊
und⌋
sind die3
Byte - ZeichenU+230A
undU+230B
darstellen\[LeftFloor]
und\[RightFloor]
, respectively.Erläuterung:
Funktion pur.
#
ist die Abkürzung fürSlot[1]
das erste Argument für dieFunction
.PrimePi@#
zählt die Anzahl der Primzahlen, die kleiner oder gleich sind#
,Range@PrimePi@#
ist die Liste der erstenPrimePi[#]
positiven Ganzzahlen, und ebensoPrime@Range@PrimePi@#
die Liste der Primzahlen, die kleiner oder gleich sind#
(dies ist ein Byte kürzer alsSelect[Range@#,PrimeQ]
). Das Symbolx
istSet
gleich dieser Liste, dann in die angehobenePower
⌊x~Log~#⌋
, das ist die Liste derFloor[Log[n,#]]
für jedenn
inx
. In Mathematica führt das Erhöhen einer Liste auf diePower
einer anderen Liste gleicher Länge zu einer Liste der Potenzen der entsprechenden Elemente.quelle
Range@#~Select~PrimeQ
wäre kürzer alsPrime@Range@PrimePi@#
... aber es ist ein UnentschiedenTreeForm
MATL, 13 Bytes
Probieren Sie es online!
Erläuterung
quelle
Gelee , 8 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Gelee ,
129 BytesProbieren Sie es online! (Methode ist für den 10000-Fall zu langsam).
Wie?
Erstellt die Liste von p k in der Reihenfolge von p .
quelle
Pyth, 13 Bytes
Probieren Sie es hier aus!
Ich habe eine Weile nicht mehr mit Pyth gespielt, daher sind alle Golftipps willkommen.
quelle
Ich könnte keine kürzere Mathematica-Lösung bekommen als die von ngenisis , aber ich dachte, ich würde ein paar (hoffentlich interessante) alternative Ansätze anbieten.
Mathematica, 65 Bytes
Zuerst
{#,#}&/@Range@#~Select~PrimeQ
erstellen wir eine Liste aller Primzahlen im entsprechenden Bereich, aber mit geordneten Paaren jeder Primzahl, wie{ {2,2}, {3,3}, ...}
. Dann bearbeiten wir diese Liste wiederholt mit der Ersetzungsregel{a_,b_}/;a<=#:>{b a,b}
, die das erste Element des geordneten Paares mit dem zweiten multipliziert, bis das erste Element die Eingabe überschreitet. Dann wenden wir#/#2&@@@
für jedes geordnete Paar das erste Element dividiert durch das zweite an. (Sie werden nach der zugrunde liegenden Primzahl sortiert. Ein Beispiel für die Ausgabe ist{16, 9, 5, 7, 11, 13, 17, 19}
.)Mathematica, 44 Bytes
Die von Mangoldt-Funktion
Λ(n)
ist eine interessante Funktion der Zahlentheorie: Sie ist gleich 0, sofern es sich nichtn
um eine Primzahl p k handelt. In diesem Fall ist sie gleichlog p
(nichtlog n
). (Dies sind natürliche Protokolle, aber es spielt keine Rolle.) DadurchMangoldtLambda@#->#&~Array~#
wird ein Array von Regeln erstellt,{ 0->1, Log[2]->2, Log[3]->3, Log[2]->4, Log[5]->5, 0->6, ... }
dessen Länge die ganze Zahl der Eingabe ist.Wir wandeln dann diese Liste von Regeln in eine "Assoziation" mit
<|...|>
. Dies hat zur Folge, dass nur die letzte Regel mit einem bestimmten Wert für die linke Hand beibehalten wird. Mit anderen Worten, wirft es wegLog[2]->2
undLog[2]->4
undLog[2]->8
und hält nurLog[2]->16
(unter der Annahme , dass der Eingang zwischen 16 und 31 in diesem Beispiel ist). Die einzigen verbleibenden rechten Seiten sind daher die maximalen Primzahlen - mit Ausnahme der einen verbleibenden Regel0->n
, bei dern
die größte Nichtprimzahl bis zur Eingangszahl ist. AberRest
wirft diese unerwünschte Regel weg undValues
extrahiert die rechten Seiten aus den Regeln in der Assoziation. (Sie enden wie oben sortiert.)Eine etwas längere (46 Bytes) Version, die die Anzahl der Auftritte jedes einzelnen zählt
log p
und dann potenziert, um sie in die maximalen Primzahlen umzuwandeln:quelle
CJam ,
2120 BytesDank Martin Ender 1 Byte gespeichert
Probieren Sie es online!
Erläuterung
quelle
Brachylog , 15 Bytes
Probieren Sie es online!
Dies gibt die Leistungen vom größten zum kleinsten aus.
Das ist sehr ineffizient.
Erläuterung
Dies findet die größten Primzerlegungen für jede Primzahl zuerst, und zwar aufgrund der Funktionsweise
⊇
: von links nach rechts und von der größten zur kleinsten Teilmenge.quelle
Brachylog ,
242119 Bytes3 + 2 Bytes gespart dank Fatalize!
Es ist das erste Mal, dass ich Brachylog benutze und ich weiß, dass einige Dinge auf kürzere Weise hätte erledigt werden können, aber ich bin froh, dass es überhaupt funktioniert: D
Probieren Sie es online! (Rückgabewerte werden nach ihren Basisprimzahlen sortiert)
Erläuterung:
quelle
?
und.
für die Eingabe und Ausgabe anstelle vonI
und verwendenX
:{≥N~^.hṗ:N×>?∧0<~t}ᶠ^ᵐ
0<~t
und die besagen , dass jedes Element des Outputs.
in istℕ₁ = [1, ..., +inf)
als solche:{≥N~^.ℕ₁ᵐhṗ:N×>?∧}ᶠ^ᵐ
{≥.~^ℕ₁ᵐhṗ:.×>?∧}ᶠ
(mit N direkt als Ausgabe) nicht funktioniert? Ich habe zuerst so etwas versucht, musste dann aber auf X zurückgreifen und ^ darüber anwenden{...}ᶠ
der zu seltsamem Verhalten führt. Ich habe vor, das zu ändern, und ich werde genauer untersuchen, warum dieses Programm nicht auf die gleiche Weise wie das oben beschriebene funktioniert.{≥.~^ℕ₁ᵐhṗ:.≜×>?∧}ᶠ
diese Weise erhalten Sie die richtige Beschriftung. (In der Zwischenzeit wurden Änderungen an den technischen Daten vorgenommen, die jedoch das Verhalten dieses bestimmten Programms nicht ändern, sodass es nicht konkurrierend wird.) Dies spart 2 Bytes05AB1E ,
1512 BytesProbieren Sie es online!
Erläuterung
quelle
Bash + GNU-Dienstprogramme, 74 Bytes
Probieren Sie es online!
Die eingegebene Nummer wird als Argument übergeben. Die Ausgabe wird auf Standard gedruckt. (Stderr wird wie üblich ignoriert.)
Beispielausgabe:
So funktioniert das:
Nenne das Argument N.
seq
generiert alle Zahlen von 1 bis N undfactor
faktorisiert sie alle.Der reguläre Ausdruck im Aufruf von sed identifiziert die Zeilen, in denen die Zahl ein Primzahl P ist, und ersetzt diese Zeilen durch Zeilen der Form `
(wobei P und N durch ihre tatsächlichen numerischen Werte ersetzt werden und alles andere buchstäblich kopiert wird, auch die Anführungszeichen und Semikolons sowie die Zeichenfolge
print
).Diese Zeilen werden als Eingabe für
bc -l
; bc druckt die Werte der drei angegebenen Zahlen, gefolgt von einer neuen Zeile, und druckt dann die Zeichen/^p
. (In bc bezeichnet l (x) den natürlichen Logarithmus von x.) JK KDie Zeichenfolgen, die bc druckt, werden dann als Eingabe in dc eingespeist. dc gibt den Wert jedes P ^ (log (N) / log (P)) unter Verwendung von Ganzzahlarithmetik (Abschneiden) aus; das ist die größte Potenz von P, die <= N ist.
Eine Sache, die oben beschönigt wurde, ist, was mit Linien passiert, die durch Faktoren erzeugt werden, die nicht mit Primzahlen korrespondieren. Diese Zeilen stimmen nicht mit dem regulären Ausdruck im Aufruf von sed überein, daher wird für diese keine Ersetzung vorgenommen. Infolgedessen beginnen diese Zeilen mit einer Zahl, gefolgt von einem Doppelpunkt, der einen Fehler erzeugt, wenn er als Eingabe für eingegeben wird
bc
. Aber bc druckt nur nach stderr, was wir ignorieren. es druckt nichts zu stdout. Standardmäßig wird stderr in PPCG ignoriert .quelle
Haskell ,
73 6766 BytesProbieren Sie es online! Verwendung:
Edit: 6 Bytes weg dank Zgarb!
Erläuterung:
quelle
last[x^i|i<-[1..n],x^i<=n]
.Gelee , 9 Bytes
Ein Byte länger als meine andere Antwort , aber die Eingabe von 10.000 dauert ein paar Sekunden.
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES6),
118120119114112105 ByteVorschläge sind willkommen. Dies ist etwas lang, aber es schien sich zu lohnen, es zu veröffentlichen, da alle Teilbarkeitstests explizit durchgeführt werden, anstatt mit Primzahlen verknüpfte integrierte Funktionen zu verwenden.
Anmerkungen:
quelle
Salbei, 43 Bytes
Ordnet jeder Primzahl im Bereich
primes(i)
ihre maximale Primzahlstärke zu.ln
ist nur ein Alias von,log
so dass es alternative Basen akzeptiert, obwohl der Name andeutet, dass es nur base verwenden kanne
.quelle
primes
Funktion und war sehr aufgeregt. Nie wieder auf Stackoverflow vertrauen.Haskell,
110-90Bytes--aktualisiert nach Laikonis Feedback
quelle
Exception: Prelude.last: empty list
fürf 2
undf 3
.f 4
wieder[2,3]
statt[4,3]
, denke ich muss deintakeWhile(<n)
seintakeWhile(<=n)
. Die Verwendung vonfst.span
anstelle vontakeWhile
ist jedoch ein Byte kürzer.Haskell , 70 Bytes
Definiert eine Funktion
f
. Probieren Sie es online!Erläuterung
Die Idee ist, den Bereich
[2..n]
nach jenen Zahlen zu filtern, diek
befriedigenk == p^length(divisors k)
und vonp*k > n
denenp
der kleinste Primteiler istk
.quelle
PHP,
101939188 Bytesnur ein bisschen echte Mathematik ...
Nervenzusammenbruch
quelle
JavaScript ES7, 93 Bytes
Iterieren Sie rekursiv
i
von 0 bis einschließlichn
. Wenni
Prime ist, erhöhe es auf den höchsten Exponenten, der es erzeugt<= n
(i ^ floor(log(n) / log(i))
)quelle