Haskell - 77/ 108 107 Символів
використання: в обох рішеннях введення% b поверне, чи + 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, нічого з цього не видно з самого коду.
обидві версії програми перевантажені, тому вони можуть обробляти дані довільного розміру.
factor
в Bash,mf
іmF
в CJam, ...)