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])
Probieren Sie es online aus!
Erläuterung
Wir interessieren uns für die Primzahlen in diesem Parallelogramm auf der komplexen Ebene (Beispiel für n = 4 ):
Wir können sie in Primzahlen auf den grünen Linien und auf den grauen Linien aufteilen .
Wikipedia sagt mir, dass eine Eisenstein-Zahl z eine grüne Linie ist. Eisenstein prime iff | z | ist eine natürliche Primzahl gleich 2 mod 3.
Es heißt auch, dass z eine graue Linie ist. Eisenstein-Primzahl, wenn | z | ² = a² - ab + b² eine natürliche Primzahl ist.
Also durchlaufen wir a = 0… n und b = 0… n und prüfen:
Wenn (a = 0 oder b = 0 oder a = b) und max (a, b)% 3 = 2 , dann zähle, ob max (a, b) eine Primzahl ist.
Andernfalls zählen Sie, ob a² - ab + b² eine Primzahl ist.
Wir können jedoch die Symmetrie der Distribution missbrauchen. Anstatt jede grüne Linie einmal zu zählen, können wir nur dreimal eine grüne Linie zählen! Das heißt, überprüfen Sie a = 0 nur und erhöhen Sie den Zähler um drei, wenn wir eine grüne Primzahl finden. Das a=[0;0;0:n]
erreicht genau das.
Da wir wissen, dass wir nur die grüne Linie a = 0 berücksichtigen , können wir max (a, b) durch b ersetzen .
Die „Bedingung der grünen Linie“ wird in Julia durch die Verkettung von Operatoren gut ausgedrückt : a<1<b%3
.
(Für die verbleibenden grünen Linien werden wir niemals ein falsches Positiv zurückgeben: Wenn a = b oder b = 0, dann ist a² - ab + b² = a² , was keine Primzahl sein kann.)
Ideen
Vielleicht, statt zu schreiben a^2-a*b+b^2
, kann ich bedingt den Exponenten ersetzen bei b
durch , 1
wenn a<1<b%3
- dann ist der Ausdruck reduziert sich auf b
. Das scheint nicht kürzer zu sein, aber es ist ordentlich!