하스켈 - (77) / 108 107 숯을
사용법 : 두 솔루션 모두에서 a % b를 입력하면 a + bi가 가우스 소수인지 여부를 반환합니다.
내가 관리하는 가장 낮지 만 창의력이나 성능이 없습니다 (77 자)
p n=all(\x->rem n x>0)[2..n-1]
a%0=rem a 4==3&&p(abs a)
0%a=a%0
a%b=p$a^2+b^2
이 솔루션은 n 이하의 모든 숫자를 통해 소수인지 확인합니다.
ungolfed 버전 :
isprime = all (\x -> rem n x != 0) [2..n-1] -- none of the numbers between 2 and n-1 divide n.
isGaussianPrime a 0 = rem a 4==3 && isprime (abs a)
isGaussianPrime 0 a = isGaussianPrime a 0 -- the definition is symmetric
isGaussianPrime a b = isprime (a^2 + b^2)
다음 솔루션에는 메모 기능이라는 추가 기능이 있습니다. 정수 n이 소수인지 확인한 후에는 컴퓨터에 저장되므로 n보다 작거나 같은 모든 숫자의 "프라이 머리"를 다시 계산할 필요가 없습니다.
(107 자. 코멘트는 명확성을위한 것입니다)
s(p:x)=p:s[n|n<-x,rem n p>0] --the sieve function
l=s[2..] --infinite list of primes
p n=n==filter(>=n)l!!0 --check whether n is in the list of primes
a%0=rem a 4==3&&p(abs a)
0%a=a%0
a%b=p$a*a+b*b
ungolfed 버전 :
primes = sieve [2..] where
sieve (p:xs) = p:filter (\n -> rem n p /= 0) xs
isprime n = n == head (filter (>=n) primes) -- checks if the first prime >= n is equal to n. if it is, n is prime.
isGaussianPrime a 0 = rem a 4==3 && isprime (abs a)
isGaussianPrime 0 a = isGaussianPrime a 0 -- the definition is symmetric
isGaussianPrime a b = isprime (a^2 + b^2)
이것은 Eratosthenes의 체를 사용하여 모든 소수의 무한 목록을 계산합니다 (코드에서 목록으로 l이라고 함). (무한 목록은 잘 알려진 속임수입니다).
무한 목록을 어떻게 가질 수 있습니까? 프로그램이 시작될 때 목록은 평가되지 않고 목록 요소를 저장하는 대신 컴퓨터가 목록을 계산하는 방법을 저장합니다. 그러나 프로그램이 목록에 액세스하면 요청에 따라 부분적으로 자체 평가됩니다. 따라서 프로그램이 목록의 네 번째 항목을 요청하는 경우 컴퓨터는 아직 평가되지 않은 모든 소수를 계산하고 저장하며 나머지는 평가되지 않은 상태로 유지하여 한 번 계산하는 방식으로 저장합니다 필요합니다.
이 모든 것은 하스켈 언어의 게으른 특성에 의해 자유롭게 주어 지지만, 코드 자체에서 그 어느 것도 분명하지 않습니다.
프로그램의 두 버전이 모두 오버로드되어 임의 크기의 데이터를 처리 할 수 있습니다.
factor
Bashmf
및mF
CJam, ...)