Haskell - 77/108 107 символов
Использование: в обоих решениях ввод% 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)
здесь используется сито Эратосфена для вычисления бесконечного списка всех простых чисел (в коде это называется l для списка). (бесконечные списки - хорошо известный трюк с haskell).
как можно иметь бесконечный список? в начале программы список не оценивается, и вместо хранения элементов списков компьютер сохраняет способ их вычисления. но когда программа обращается к списку, она частично оценивает себя до запроса. поэтому, если бы программа запрашивала четвертый элемент в списке, компьютер вычислял бы все простые числа до четвертого, которые еще не были оценены, сохранял их, а остальное оставалось бы без оценки, сохраняясь как способ вычисления их один раз необходимо.
обратите внимание, что все это дается свободно ленивой природой языка Haskell, ничего из этого не видно из самого кода.
обе версии программы перегружены, поэтому они могут обрабатывать данные произвольного размера.
factor
в Bashmf
иmF
в CJam, ...)