Mathematica, 70 69 байт
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
Безымянная функция, которая принимает и возвращает целое число. Выдает ошибку при вводе, 1но все равно вычисляет правильный результат.
объяснение
Как обычно, из-за всего синтаксического сахара, порядок чтения немного забавен. &На право определяет неназванные функции и ее аргументы ссылаются #, #2, #3и т.д.
...FactorInteger@#...
Мы начнем с факторинга ввода. Это дает список пар, {prime, exponent}например, ввод 12дает {{2, 2}, {3, 1}}. Несколько неудобно, 1дает {{1, 1}}.
(...&)@@@...
Это применяет функцию слева к списку целых чисел на уровне 1, то есть функция вызывается для каждой пары, передавая простое и экспоненту в качестве отдельных аргументов, а затем возвращает список результатов. (Это похоже на отображение функции по списку, но получение двух отдельных аргументов удобнее, чем получение пары.)
...PrimePi@#...
Мы вычисляем количество простых чисел вплоть до (простого) ввода с использованием встроенного PrimePi. Это дает нам индекс простого числа.
...BitXor[...+1,1]-1...
Результат увеличивается, XOR 1и снова уменьшается. Это перестановки 1 <-> 2, 3 <-> 4, 5 <-> 6, ..., т.е. все индексы, основанные на 1. Обратите внимание, что входные данные 1дадут, 0для PrimePiкоторых затем отображается -1в этом процессе. Мы разберемся с этим позже.
...Prime[...]^#2...
Теперь мы получим n- е простое число (где n - результат предыдущего вычисления), которое является правильно переставленным простым, и возведем его в степень исходного простого числа при факторизации входных данных. В этот момент Prime[-1]выдаст ошибку, но вернет себя без оценки. Мощность в этом случае такова, 1что весь процесс до сих пор дает данные {Prime[-1]}для ввода 1и список правильных простых степеней для всех других входов.
1##&@@...
Далее мы просто умножаем все основные силы. 1##&стандартная игра в гольф для этой Timesфункции. Смотрите этот совет (раздел «Последовательности аргументов»), чтобы узнать, как это работает.
Наконец, нам нужно позаботиться о том, 1что привело ко всему вышеперечисленному Prime[-1]. Мы можем легко исправить это с помощью простого правила замены. Помните, что f@xэто сокращение от f[x]. Мы просто хотим сопоставить любое выражение этой формы (поскольку все остальные результаты будут целыми числами, то есть атомарными выражениями) и заменить его на 1:
.../._@_->1
Здесь, /.сокращенно ReplaceAll, _@_это шаблон для чего-либо в форме f[x](то есть для любого составного выражения с одним дочерним элементом ), и он ->1говорит «заменить на 1».