처음에는 모르는 언어를 사용해 보았을 때 약간 사소한 것입니다. 있을 수있는대로, 나는 문제를 흥미롭게 발견하고 당신을 위해 몇 가지 해결책을 채찍질했다. Dyalog APL을 사용하여 수행됩니다. APL 초보자는 약간의 학습이 필요합니다.
PollardRho←{
n←⍵
⍺←2 2 1
x y d←⍺
f←{n|1+⍵*2}
x←f x
y←f f y
d←n∨|x-y
d=n:'Failure'
d≠1:d
x y d ∇ n
}
우리는 APL 세션에서 이것을 시도 할 수 있습니다 :
첫 번째 솔루션은 주요 기능에 직접 포함 된 F (X)와, (위키 백과에 의해 정의 된대로) 폴라드의 Rho에 대한 간단한 기능입니다 :
PollardRho 8051
97
번째 방법은 주요 기능의 함수 f (X)를 추출하고, F (x)에 대한 다양한 기능을 사용하여 편리 인수로 그것을 제공한다.
PollardRho2←{
n←⍵
⍺←2 2 1
x y d←⍺
x←n ⍺⍺ x
y←n ⍺⍺ n ⍺⍺ y
d←n∨|x-y
d=n:'Failure'
d≠1:d
x y d ⍺⍺ ∇∇ n
}
우리는 우선 함수 f (X)를 형성하고, 왼쪽 피연산자로서 제공함으로써 세션이 실행 :
APL, 인수는 운영자라고로서의 기능을 취하는 함수
f←{⍺|1+⍵*2}
f PollardRho2 8051
97
두 솔루션 모두 꼬리 재귀를 사용합니다.
당신이 유용하다고 생각합니다.
왜 '∇∇'라고 쓰셨습니까? 피연산자는 절대로 바뀌지 않으므로'∇'라고 써도됩니다. – marinus
하지만 함수 f (x)가 변경 될 수 있습니다. 따라서 첫 번째 예제 함수 PollardRho에서 추출되어 Operl PollardRho2에 피연산자로 제공됩니다. Pollard-Rho에있는 wikipedia 항목을 보면 함수 f (x)가 실제로 알고리즘에 입력 된 것입니다. –