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
".