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の整数のリストに適用します。つまり、関数は各ペアに対して呼び出され、素数と指数を別々の引数として渡し、結果のリストを返します。(これはリスト上で関数をマッピングするのと似ていますが、2つの個別の引数を受け取るほうがペアを受け取るよりも便利です。)
...PrimePi@#...
built-inを使用して、(プライム)入力までのプライムの数を計算し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]
。そのフォームの任意の式と一致させ(他のすべての結果は整数、つまりアトミック式であるため)、それをaに置き換えたいだけです1
。
.../._@_->1
ここで、/.
は、の略でReplaceAll
、あらゆる_@_
形式のパターンf[x]
(つまり、単一の子を持つ複合式)であり、->1
「置換」と言い1
ます。