Mathematica,70 69字节
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
一个未命名的函数,它接受并返回一个整数。它在输入上引发错误,1
但仍会计算正确的结果。
说明
像往常一样,由于所有语法糖,阅读顺序有点有趣。甲&
右边定义的未命名函数和它的参数被称为通过#
,#2
,#3
等。
...FactorInteger@#...
我们首先考虑输入因素。这给出了一个对的列表,{prime, exponent}
例如input 12
Gives {{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
”。