Mathematica, 70 69 octets
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
Une fonction sans nom qui prend et retourne un entier. Il renvoie une erreur en entrée 1
mais calcule toujours le résultat correct.
Explication
Comme d'habitude, en raison de tout le sucre syntaxique, l'ordre de lecture est un peu drôle. Un &
sur les définit à droite une fonction sans nom et ses arguments sont désignés par #
, #2
, #3
, etc.
...FactorInteger@#...
Nous commençons par factoriser l'entrée. Cela donne une liste de paires, {prime, exponent}
par exemple l'entrée 12
donne {{2, 2}, {3, 1}}
. Un peu gênant, 1
donne {{1, 1}}
.
(...&)@@@...
Cela applique la fonction de gauche à la liste des entiers au niveau 1, c'est-à-dire que la fonction est appelée pour chaque paire, en passant le premier et l'exposant en tant qu'arguments séparés, puis renvoie une liste des résultats. (Cela revient à mapper la fonction sur la liste, mais recevoir deux arguments distincts est plus pratique que recevoir une paire.)
...PrimePi@#...
Nous calculons le nombre de nombres premiers jusqu'à et y compris l'entrée (principale) à l'aide de la fonction intégrée PrimePi
. Cela nous donne l'indice du premier.
...BitXor[...+1,1]-1...
Le résultat est incrémenté, XOR avec 1
et décrémenté à nouveau. Ces swaps 1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, c'est-à-dire tous les indices basés sur 1. Notez que l'entrée 1
donnera 0
pour PrimePi
laquelle est ensuite mappé -1
dans ce processus. Nous y reviendrons plus tard.
...Prime[...]^#2...
Nous obtenons maintenant le n ème premier (où n est le résultat du calcul précédent), qui est le premier correctement échangé, et le portons à la puissance du premier original dans la factorisation de l'entrée. À ce stade Prime[-1]
, une erreur sera lancée, mais elle se renverra sans évaluation. Dans ce cas, la puissance est 1
telle que l'ensemble du processus jusqu'à présent donne {Prime[-1]}
une entrée 1
et une liste de puissances principales correctes pour toutes les autres entrées.
1##&@@...
Ensuite, nous multiplions simplement tous les pouvoirs principaux. 1##&
est une astuce de golf standard pour la Times
fonction. Voir cette astuce (section "Séquences d'arguments") pour savoir comment cela fonctionne.
Enfin, nous devons prendre soin de la contribution 1
pour laquelle tout ce qui précède a abouti Prime[-1]
. Nous pouvons facilement résoudre ce problème avec une simple règle de remplacement. N'oubliez pas que f@x
c'est court pour f[x]
. Nous voulons juste faire correspondre n'importe quelle expression de cette forme (puisque tous les autres résultats seront des entiers, c'est-à-dire des expressions atomiques), et le remplacer par un 1
:
.../._@_->1
Ici, /.
est l'abréviation de ReplaceAll
, _@_
est un modèle pour n'importe quoi de la forme f[x]
(c'est-à-dire toute expression composée avec un seul enfant) et ->1
dit "remplacer par 1
".