Haskell - 77/ 108 107 Chars
uso: en ambas soluciones, escribir a% b devolverá si a + bi es un primo gaussiano.
el más bajo que logré, pero sin creatividad ni rendimiento (77 caracteres)
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
Esta solución solo funciona con todos los números debajo de n para verificar si es primo.
versión sin golf:
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)
La siguiente solución tiene una característica adicional: la memorización. una vez que haya verificado si algún número entero n es primo, no necesitará volver a calcular la "prima" de todos los números menores o iguales a n, ya que se almacenarán en la computadora.
(107 caracteres. Los comentarios son para mayor claridad)
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
versión sin golf:
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)
esto usa el tamiz de Eratóstenes para calcular una lista infinita de todos los números primos (llamada l para lista en el código). (Las listas infinitas son un truco bien conocido de Haskell).
¿Cómo es posible tener una lista infinita? al comienzo del programa, la lista no está evaluada y, en lugar de almacenar los elementos de la lista, la computadora almacena la forma de calcularlos. pero a medida que el programa accede a la lista, se evalúa parcialmente hasta la solicitud. por lo tanto, si el programa solicitara el cuarto elemento de la lista, la computadora calcularía todos los números primos hasta el cuarto que aún no se han evaluado, los almacenará, y el resto permanecerá sin evaluar, almacenados como la forma de calcularlos una vez necesario.
Tenga en cuenta que todo esto se da libremente por la naturaleza perezosa del lenguaje Haskell, nada de eso se desprende del código en sí.
ambas versiones del programa están sobrecargadas, por lo que pueden manejar datos de tamaño arbitrario.
factor
en Bashmf
ymF
en CJam, ...)