Haskell - 77/ 108 107 Chars
utilizzo: in entrambe le soluzioni, digitare a% b restituirà se a + bi è un primo gaussiano.
il più basso che ho gestito, ma nessuna creatività o prestazione (77 caratteri)
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
questa soluzione fornisce semplicemente tutti i numeri sotto n per verificare se è un numero primo.
versione non golfata:
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 prossima soluzione ha una funzione extra: la memoizzazione. una volta verificato se un numero intero n è primo, non sarà necessario ricalcolare la "primitudine" di tutti i numeri più piccoli o uguali a n, poiché verranno memorizzati nel computer.
(107 caratteri. I commenti sono per chiarezza)
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
versione non golfata:
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)
questo usa il setaccio di Eratostene per calcolare un elenco infinito di tutti i numeri primi (chiamato l per elenco nel codice). (le liste infinite sono un noto trucco di haskell).
come è possibile avere un elenco infinito? all'inizio del programma, l'elenco non è valutato e, invece di archiviare gli elementi degli elenchi, il computer memorizza il modo di calcolarli. ma poiché il programma accede all'elenco, si valuta parzialmente fino alla richiesta. quindi, se il programma richiedesse il quarto elemento nell'elenco, il computer calcolerebbe tutti i numeri primi fino a quel momento che non sono già stati valutati, li memorizzerebbe e gli altri rimarrebbero non valutati, memorizzati come il modo di calcolarli una volta necessario.
si noti che tutto ciò è dato liberamente dalla natura pigra del linguaggio Haskell, nulla di tutto ciò è evidente dal codice stesso.
entrambe le versioni del programma sono sovraccaricate, quindi possono gestire dati di dimensioni arbitrarie.
factor
in Bash,mf
emF
in CJam, ...)