Mathematica,70 69字节
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
一个未命名的函数,它接受并返回一个整数。它在输入上引发错误,1但仍会计算正确的结果。
说明
像往常一样,由于所有语法糖,阅读顺序有点有趣。甲&右边定义的未命名函数和它的参数被称为通过#,#2,#3等。
...FactorInteger@#...
我们首先考虑输入因素。这给出了一个对的列表,{prime, exponent}例如input 12Gives {{2, 2}, {3, 1}}。1给您带来一些不便{{1, 1}}。
(...&)@@@...
这会将左侧的函数应用于级别1的整数列表,即对于每对调用该函数,将质数和指数作为单独的参数传递,然后返回结果列表。(这类似于在列表上映射函数,但是接收两个单独的参数比接收一对更方便。)
...PrimePi@#...
我们使用内建函数计算直到(包括)输入的素数数量PrimePi。这给了我们素数的指数。
...BitXor[...+1,1]-1...
结果递增,与异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”。