Counting Eisenstein primes
Julia, 66 62 60 bytes
!n=sum(isprime,[a<1<b%3?b:a^2-a*b+b^2for a=[0;0;0:n],b=0:n])
Try it online!
Explanation
We’re interested in the primes in this parallelogram on the complex plane (example for n = 4):
We can split them into primes on the green lines, and on the gray lines.
Wikipedia tells me an Eisenstein number z is a green line Eisenstein prime iff |z| is a natural prime equal to 2 mod 3.
It also says z is a gray line Eisenstein prime iff |z|² = a² − ab + b² is a natural prime.
So we loop over a = 0…n and b = 0…n, and check:
If (a = 0 or b = 0 or a = b) and max(a, b) % 3 = 2, then count whether max(a, b) is a prime.
Else, count whether a² − ab + b² is a prime.
However, we can abuse the distribution’s symmetry. Instead of counting each green line once, we can just count one green line thrice! That is, only check a = 0 and increment the counter by three when we find a green line prime. The a=[0;0;0:n]
achieves exactly this.
Since we know we’re only considering the green line a = 0, we can replace max(a, b) by b.
The “green line condition” is nicely expressed in Julia using operator chaining: a<1<b%3
.
(For the remaining green lines, we will never return a false positive: if a = b or b = 0 then a² − ab + b² = a², which can’t be prime.)
Ideas
Maybe, instead of writing a^2-a*b+b^2
, I can conditionally replace the exponent at b
by 1
when a<1<b%3
– then the expression reduces to b
. This doesn’t seem to be shorter, but it’s neat!