Une puissance première est un entier positif n qui peut s'écrire sous la forme n = p k où p est un nombre premier et k est un entier positif. Par exemple, certains pouvoirs principaux le sont [2, 3, 5, 4, 9, 25, 8, 27, 125]
.
Ensuite, considérons des puissances premières de 2. Celles-ci sont [2, 4, 8, 16, ...]
et peuvent être écrites sous la forme 2 k . Ils seraient tous inclus lorsque l'on considère les puissances premières inférieures à 20. Cependant, 16 est la puissance première maximale avec un nombre premier de base de 2 dans cette plage. Une puissance première p k est maximale dans une plage si elle est la puissance la plus élevée de p dans cette plage. Nous ne sommes intéressés que par la puissance primaire maximale dans chaque plage, donc toutes les puissances primaires inférieures doivent être exclues.
Votre objectif est d'écrire une fonction ou un programme qui prend un entier positif n et génère les puissances premières maximales dans la plage [2, 3, 4, ..., n]
.
Merci à @ Peter Taylor d' avoir clarifié la définition de la puissance maximale maximale et plus encore.
Règles
- C'est du code-golf, alors faites votre code le plus court possible.
- Les puissances premières maximales peuvent être émises dans n'importe quel ordre mais il ne doit pas y avoir de doublons.
Cas de test
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]
La liste complète des puissances premières maximales pour 10000 peut être trouvée ici .
Power floor
Qu'est-ce que le diableMathematica,
444340 octets4 octets enregistrés grâce aux miles et à Martin Ender
n#^⌊#~Log~n⌋&/@Select[Range@n,PrimeQ]
⌊
et⌋
sont les3
caractères d'octetU+230A
etU+230B
représentant\[LeftFloor]
et\[RightFloor]
, respectivement.Explication:
Fonction pure.
#
est l'abréviation deSlot[1]
qui représente le premier argument duFunction
.PrimePi@#
compte le nombre de nombres premiers inférieurs ou égaux à#
,Range@PrimePi@#
est la liste des premiersPrimePi[#]
entiers positifs, ainsi quePrime@Range@PrimePi@#
la liste des nombres premiers inférieurs ou égaux à#
(c'est un octet plus court queSelect[Range@#,PrimeQ]
). Le symbolex
estSet
égal à cette liste, puis élevé à laPower
⌊x~Log~#⌋
, qui est la liste deFloor[Log[n,#]]
pour chaquen
entréex
. Dans Mathematica, élever une liste versPower
une autre liste de même longueur donne la liste des puissances de leurs éléments correspondants.la source
Range@#~Select~PrimeQ
serait plus court quePrime@Range@PrimePi@#
... mais c'est une égalitéTreeForm
MATL, 13 octets
Essayez-le en ligne!
Explication
la source
Gelée , 8 octets
Essayez-le en ligne!
Comment ça marche
la source
Gelée ,
129 octetsEssayez-le en ligne!(la méthode est trop lente pour le cas 10000).
Comment?
Construit la liste de p k par ordre de p .
la source
Pyth, 13 octets
Essayez-le ici!
Je n'ai pas joué avec Pyth depuis un moment donc tous les conseils de golf sont appréciés.
la source
Je ne pouvais pas obtenir une solution Mathematica plus courte que la solution de ngenisis , mais j'ai pensé proposer deux approches alternatives (espérons-le intéressantes).
Mathematica, 65 octets
Nous utilisons
{#,#}&/@Range@#~Select~PrimeQ
d' abord pour construire une liste de tous les nombres premiers dans la plage appropriée, mais avec des paires ordonnées de chaque nombre premier, comme{ {2,2}, {3,3}, ...}
. Ensuite, nous opérons sur cette liste à plusieurs reprises avec la règle de remplacement{a_,b_}/;a<=#:>{b a,b}
, qui multiplie le premier élément de la paire ordonnée par le second jusqu'à ce que le premier élément dépasse l'entrée. Ensuite, nous appliquons#/#2&@@@
à la sortie, pour chaque paire ordonnée, le premier élément divisé par le second. (Ils finissent par être triés par nombre premier sous-jacent: un exemple de sortie est{16, 9, 5, 7, 11, 13, 17, 19}
.)Mathematica, 44 octets
La fonction de von Mangoldt
Λ(n)
est une fonction de théorie des nombres intéressante: elle est égale à 0 sauf si ellen
est une puissance première p k , auquel cas elle estlog p
(nonlog n
). (Ce sont des journaux naturels, mais cela n'a pas d'importance.)MangoldtLambda@#->#&~Array~#
Crée ainsi un tableau de règles{ 0->1, Log[2]->2, Log[3]->3, Log[2]->4, Log[5]->5, 0->6, ... }
dont la longueur est l'entier en entrée.Nous transformons ensuite cette liste de règles en une "association" en utilisant
<|...|>
. Cela a pour effet de ne conserver que la dernière règle avec une valeur de gauche donnée. En d'autres termes, il supprimeraLog[2]->2
etLog[2]->4
etLog[2]->8
et conservera uniquementLog[2]->16
(en supposant que l'entrée est comprise entre 16 et 31 pour cet exemple). Par conséquent, les seuls côtés droits restants sont les puissances premières maximales - à l'exception de la seule règle restante0->n
, oùn
est la plus grande puissance non principale jusqu'à l'entier d'entrée. MaisRest
jette cette règle indésirable etValues
extrait le côté droit des règles de l'association. (Ils finissent par être triés comme ci-dessus.)Une version légèrement plus longue (46 octets), qui compte le nombre d'apparitions de chacun
log p
puis exponenti pour se convertir aux puissances premières maximales:la source
CJam ,
2120 octets1 octet enregistré grâce à Martin Ender
Essayez-le en ligne!
Explication
la source
Brachylog , 15 octets
Essayez-le en ligne!
Cela délivre les puissances du plus grand au plus petit.
C'est très inefficace.
Explication
Cela trouvera les plus grandes décompositions principales pour chaque premier en raison de la façon dont
⊇
fonctionne: de gauche à droite et du plus grand au plus petit sous-ensemble.la source
Brachylog ,
242119 octets3 + 2 octets économisés grâce à Fatalize!
C'est ma première utilisation de Brachylog, et je sais que certaines choses auraient pu être faites de manière plus courte, mais je suis heureux que cela fonctionne même: D
Essayez-le en ligne! (Les valeurs de retour sont ordonnées par leurs nombres premiers de base)
Explication:
la source
?
et.
pour Input et Output, au lieu deI
etX
, en tant que tels:{≥N~^.hṗ:N×>?∧0<~t}ᶠ^ᵐ
0<~t
et en déclarant que chaque élément de la sortie.
est enℕ₁ = [1, ..., +inf)
tant que tel:{≥N~^.ℕ₁ᵐhṗ:N×>?∧}ᶠ^ᵐ
{≥.~^ℕ₁ᵐhṗ:.×>?∧}ᶠ
(en utilisant N directement en sortie) ne fonctionne pas? J'ai d'abord essayé quelque chose comme ça, mais j'ai dû ensuite utiliser X et appliquer ^ dessus{...}ᶠ
qui provoque un comportement étrange. J'ai l'intention de changer cela et j'examinerai spécifiquement pourquoi ce programme ne fonctionne pas de la même manière que celui ci-dessus.{≥.~^ℕ₁ᵐhṗ:.≜×>?∧}ᶠ
cette façon, vous obtenez une étiquetage correcte. (Un changement a été apporté aux spécifications entre-temps mais ne change pas réellement le comportement de ce programme particulier, donc il ne le rend pas non concurrentiel). Cela économise 2 octets05AB1E ,
1512 octetsEssayez-le en ligne!
Explication
la source
Utilitaires Bash + GNU, 74 octets
Essayez-le en ligne!
Le numéro d'entrée est passé en argument. La sortie est imprimée sur stdout. (Comme d'habitude, stderr est ignoré.)
Exemple de sortie:
Voici comment cela fonctionne:
Appelez l'argument N.
seq
génère tous les nombres de 1 à N et lesfactor
factorise tous.Le regex dans l'appel à sed identifie les lignes où le nombre est un P premier, et remplace ces lignes par des lignes qui ont la forme `
(où P et N sont remplacés par leurs valeurs numériques réelles, et tout le reste est copié littéralement, même les guillemets et les points-virgules, et la chaîne
print
).Ces lignes sont alimentées en entrée vers
bc -l
; bc imprime les valeurs des trois nombres indiqués, chacune suivie d'une nouvelle ligne, puis imprime les caractères/^p
. (En bc, l (x) désigne le logarithme naturel de x.) JK KLes chaînes que bc imprime sont ensuite introduites en entrée dans dc; dc imprime la valeur de chaque P ^ (log (N) / log (P)) en utilisant l'arithmétique entière (tronquée); c'est la plus grande puissance de P qui est <= N.
Une chose qui est passée sous silence est ce qui arrive aux lignes qui sont produites par des facteurs qui ne correspondent pas aux nombres premiers. Ces lignes ne correspondent pas à l'expression régulière dans l'appel à sed, donc aucun remplacement n'est effectué sur celles-ci. Par conséquent, ces lignes commencent par un nombre suivi d'un deux-points, ce qui génère une erreur lors de son alimentation en entrée
bc
. Mais bc imprime alors sur stderr, ce que nous ignorons; il n'imprime rien sur stdout. Par défaut, stderr est ignoré sur PPCG .la source
Haskell ,
73 6766 octetsEssayez-le en ligne! Usage:
Edit: 6 octets de réduction grâce à Zgarb!
Explication:
la source
last[x^i|i<-[1..n],x^i<=n]
.Gelée , 9 octets
Un octet de plus que mon autre réponse , mais se termine pour l'entrée 10 000, c'est quelques secondes.
Essayez-le en ligne!
Comment ça marche
la source
JavaScript (ES6),
118120119114112 112105 octetsSuggestions bienvenues. C'est un peu long, mais cela semblait valoir la peine d'être publié car il effectue tous les tests de divisibilité de manière explicite plutôt que d'utiliser des éléments intégrés liés aux nombres premiers.
Remarques:
la source
Sauge, 43 octets
Mappe chaque prime dans la plage
primes(i)
à sa puissance maximale maximale.ln
n'est qu'un alias delog
donc il accepte des bases alternatives bien que son nom suggère qu'il ne peut utiliser que la basee
.la source
primes
fonction et je suis vraiment excité. Ne plus jamais faire confiance à stackoverflow.Haskell,
11090 octets- mis à jour selon les commentaires de Laikoni
la source
Exception: Prelude.last: empty list
pourf 2
etf 3
.f 4
Retourne également[2,3]
au lieu de[4,3]
, je pense que vostakeWhile(<n)
besoins doivent êtretakeWhile(<=n)
. Cependant, l'utilisationfst.span
au lieu detakeWhile
est un octet plus court.Haskell , 70 octets
Définit une fonction
f
. Essayez-le en ligne!Explication
L'idée est de filtrer la plage
[2..n]
pour les nombresk
qui satisfontk == p^length(divisors k)
etp*k > n
, oùp
est le plus petit diviseur premier dek
.la source
PHP,
101939188 octetsjuste un peu de vrais maths ...
panne
la source
JavaScript ES7, 93 octets
Itérer récursivement
i
de 0 à et y comprisn
. Sii
est premier, élevez-le au plus haut exposant au sol qui le fait<= n
(i ^ floor(log(n) / log(i))
)la source