ハスケル- 77/ 108 107文字数
使用法:両方のソリューションで、a%bと入力すると、a + biがガウス素数であるかどうかが返されます。
最下位のiが管理しているが、創造性やパフォーマンスはない(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未満のすべての数値を使用して、素数であるかどうかを確認します。
改変されていないバージョン:
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
改変されていないバージョン:
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)
これは、エラトステネスのふるいを使用して、すべての素数の無限リストを計算します(コードのリストではlと呼ばれます)。(無限リストはhaskellのよく知られたトリックです)。
無限のリストを持つことはどのように可能ですか?プログラムの開始時にリストは評価されず、リスト要素を保存する代わりに、コンピューターはそれらを計算する方法を保存します。しかし、プログラムがリストにアクセスすると、リクエストまで部分的に評価されます。したがって、プログラムがリストの4番目の項目を要求する場合、コンピューターはまだ評価されていない4番目までのすべての素数を計算して保存し、残りは評価されずに残り、一度計算する方法として保存されます必要です。
これはすべて、Haskell言語の怠thisな性質によって自由に与えられていることに注意してください。コード自体からは明らかです。
プログラムの両方のバージョンがオーバーロードされているため、任意のサイズのデータを処理できます。
factor
Bashmf
およびmF
CJamで...)