Haskell的- 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以下的所有数字进行幂运算,以检查其是否为质数。
非高尔夫版本:
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)
这使用Eratosthenes的筛子来计算所有素数的无限列表(在代码中称为l的列表)。(无限列表是haskell的众所周知的技巧)。
如何有一个无限的列表?在程序开始时,列表未评估,计算机没有存储列表元素,而是存储了计算它们的方法。但是当程序访问列表时,它会根据请求进行部分评估。因此,如果程序要请求列表中的第四项,则计算机将计算尚未评估的所有素数到第四,并将其存储,其余的将保持未评估状态,作为计算一次的方式存储需要。
请注意,所有这些都是由Haskell语言的懒惰特性自由提供的,从代码本身来看,这些都不是显而易见的。
程序的两个版本均已重载,因此它们可以处理任意大小的数据。
factor
在Bashmf
和mF
CJam中,...)