Haskell - 77/108 107 caractères
utilisation: dans les deux solutions, taper a% b retournera si a + bi est un nombre premier gaussien.
le plus bas que j'ai réussi, mais pas de créativité ni de performance (77 caractères)
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
cette solution passe simplement par tous les nombres en dessous de n pour vérifier s'il est premier.
version non golfée:
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 solution suivante a une fonctionnalité supplémentaire - la mémorisation. une fois que vous avez vérifié si un entier n est premier, vous n'aurez pas besoin de recalculer la "primauté" de tous les nombres inférieurs ou égaux à n, car il sera stocké dans l'ordinateur.
(107 caractères. Les commentaires sont pour plus de clarté)
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
version non golfée:
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)
ceci utilise le tamis d'Eratosthène pour calculer une liste infinie de tous les nombres premiers (appelés l pour liste dans le code). (les listes infinies sont une astuce bien connue de haskell).
comment est-il possible d'avoir une liste infinie? au début du programme, la liste n'est pas évaluée, et au lieu de stocker les éléments des listes, l'ordinateur stocke la façon de les calculer. mais lorsque le programme accède à la liste, il s'évalue partiellement jusqu'à la demande. donc, si le programme demandait le quatrième élément de la liste, l'ordinateur calculerait tous les nombres premiers jusqu'au quatrième qui ne sont pas déjà évalués, les stockerait et le reste resterait non évalué, stocké comme moyen de les calculer une fois nécessaire.
notez que tout cela est donné librement par la nature paresseuse du langage Haskell, rien de cela ne ressort du code lui-même.
les deux versions du programme sont surchargées, de sorte qu'elles peuvent gérer des données de taille arbitraire.
factor
dans Bash,mf
etmF
dans CJam, ...)