Mathematica, 70 69 bajtów
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
Nienazwana funkcja, która przyjmuje i zwraca liczbę całkowitą. Zgłasza błąd na wejściu, 1ale nadal oblicza poprawny wynik.
Wyjaśnienie
Jak zwykle, ze względu na cały cukier składniowy, kolejność czytania jest nieco śmieszna. &Na prawo definiuje nienazwana funkcyjnych i jej argumenty są określane przez #, #2, #3, itd.
...FactorInteger@#...
Zaczynamy od faktoryzacji danych wejściowych. Daje listę par {prime, exponent}np wejście 12daje {{2, 2}, {3, 1}}. Nieco niewygodnie 1daje {{1, 1}}.
(...&)@@@...
Powoduje to zastosowanie funkcji po lewej do listy liczb całkowitych na poziomie 1, to znaczy funkcja jest wywoływana dla każdej pary, przekazując liczbę pierwszą i wykładnik jako osobne argumenty, a następnie zwraca listę wyników. (Jest to podobne do mapowania funkcji na liście, ale otrzymywanie dwóch oddzielnych argumentów jest wygodniejsze niż otrzymywanie pary.)
...PrimePi@#...
Obliczamy liczbę liczb pierwszych do (włącznie) danych wejściowych (pierwszych) za pomocą wbudowanego PrimePi. To daje nam indeks liczby pierwszej.
...BitXor[...+1,1]-1...
Wynik jest zwiększany, XOR'owany 1i ponownie zmniejszany. To zamienia 1 <-> 2, 3 <-> 4, 5 <-> 6, ..., tzn. Wszystkie indeksy 1. Zauważ, że dane wejściowe 1przyniosą zysk, 0na PrimePiktóry jest następnie mapowany -1w tym procesie. Zajmiemy się tym później.
...Prime[...]^#2...
Otrzymujemy teraz n- tą liczbę pierwszą (gdzie n jest wynikiem poprzedniego obliczenia), która jest poprawnie zamienioną liczbą pierwszą i podnosimy ją do potęgi oryginalnej liczby pierwszej w rozkładzie na czynniki wejściowe. W tym momencie Prime[-1]wyrzuci błąd, ale zwróci się bez oceny. Moc w tym przypadku jest 1taka, że cały dotychczasowy proces daje {Prime[-1]}wkład 1i listę poprawnych mocy pierwotnych dla wszystkich innych czynników.
1##&@@...
Następnie pomnożymy wszystkie główne moce. 1##&to standardowa sztuczka golfowa dla tej Timesfunkcji. Zobacz tę końcówkę (sekcja „sekwencje argumentów”) dla, jak to działa.
Wreszcie musimy zadbać o wkład, 1w wyniku którego wszystkie powyższe wyniki zaowocowały Prime[-1]. Możemy to łatwo naprawić za pomocą prostej reguły wymiany. Pamiętaj, że f@xto jest skrót od f[x]. Chcemy tylko dopasować dowolne wyrażenie tej formy (ponieważ wszystkie inne wyniki będą liczbami całkowitymi, tj. Wyrażeniami atomowymi) i zastąpimy je 1:
.../._@_->1
Tutaj /.jest skrótem ReplaceAll, _@_jest wzorem dla f[x]dowolnej postaci (tj. Dowolnego wyrażenia złożonego z jednym dzieckiem) i ->1mówi „zamień na 1”.