Mathematica, 70 69 byte
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
Una funzione senza nome che accetta e restituisce un numero intero. Genera un errore sull'input 1
ma calcola comunque il risultato corretto.
Spiegazione
Come al solito, a causa di tutto lo zucchero sintattico, l'ordine di lettura è un po 'divertente. Un &
sui definisce giuste una funzione senza nome e suoi argomenti sono indicati da #
, #2
, #3
, etc.
...FactorInteger@#...
Iniziamo prendendo in considerazione l'input. Questo dà una lista di coppie {prime, exponent}
es ingresso 12
dà {{2, 2}, {3, 1}}
. In qualche modo in modo inopportuno, 1
dà {{1, 1}}
.
(...&)@@@...
Questo applica la funzione a sinistra all'elenco di numeri interi al livello 1, ovvero la funzione viene chiamata per ogni coppia, passando il primo e l'esponente come argomenti separati, quindi restituisce un elenco dei risultati. (Questo è simile al mapping della funzione sull'elenco, ma ricevere due argomenti separati è più conveniente che ricevere una coppia.)
...PrimePi@#...
Calcoliamo il numero di numeri primi fino a, incluso l'ingresso (primo) incluso, utilizzando l'integrato PrimePi
. Questo ci dà l'indice del numero primo.
...BitXor[...+1,1]-1...
Il risultato viene incrementato, XOR con 1
e nuovamente diminuito. Questo scambia 1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, cioè tutti gli indici basati su 1. Si noti che l'input 1
produrrà 0
per PrimePi
cui viene quindi mappato -1
in questo processo. Ci occuperemo più tardi.
...Prime[...]^#2...
Ora ottiene il n ° primo (dove n è il risultato del calcolo precedente), che è il primo correttamente scambiati, ed innalziamola alla potenza del primo originale nel fattorizzazione dell'ingresso. A questo punto Prime[-1]
verrà generato un errore ma verrà restituito non valutato. La potenza in questo caso è 1
che l'intero processo finora produce {Prime[-1]}
input 1
e un elenco di potenze primi corrette per tutti gli altri input.
1##&@@...
Successivamente, moltiplichiamo semplicemente tutti i poteri principali. 1##&
è un trucco da golf standard per la Times
funzione. Vedi questo suggerimento (sezione "Sequenze di argomenti") per come funziona.
Infine, dobbiamo occuparci degli input 1
per i quali tutto quanto sopra è risultato Prime[-1]
. Possiamo facilmente risolverlo con una semplice regola di sostituzione. Ricorda che f@x
è l'abbreviazione di f[x]
. Vogliamo solo abbinare qualsiasi espressione di quella forma (poiché tutti gli altri risultati saranno numeri interi, cioè espressioni atomiche), e sostituirlo con un 1
:
.../._@_->1
Qui, /.
è l'abbreviazione di ReplaceAll
, _@_
è un modello per qualsiasi forma f[x]
(cioè qualsiasi espressione composta con un singolo figlio) e ->1
dice "sostituisci con 1
".