Eisenstein-Primzahlen zählen

8

Einführung

Eisenstein-Ganzzahlen sind komplexe Zahlen der Form

a+bω

Wo a,bsind ganze Zahlen und

ω = e^(2πi/3)

Die Eisenstein-Ganzzahlen bilden in der komplexen Ebene ein Dreiecksgitter:

Eisenstein-Ganzzahlen in der komplexen Ebene

Wir sagen, dass eine Eisenstein-Ganzzahl z=a+bωeine Primzahl ist, wenn sie nicht als Produkt zweier Eisenstein-Ganzzahlen ohne Einheit (nicht 1, -1, ω, -ω, ω ^ 2 oder -ω ^ 2) geschrieben werden kann

Programm

Eingabe : Eine natürliche Zahl n.

Ausgabe : Die Anzahl der Eisenstein-Primzahlen in der Form, a+bωfür die a,bnatürliche Zahlen (einschließlich Null) kleiner oder gleich sindn

Testfälle

0 → 0

1 → 0

2 → 5

3 → 9

4 → 13

5 → 20

Wertung

Dies bedeutet code-golf, dass die geringste Anzahl von Bytes gewinnt

Miau Mix
quelle
2
Könnten Sie einige Testfälle bereitstellen?
Alex A.
Ich verstehe die Testfälle nicht. Die Anzahl der a,bPaare für 2ist nur 4so, wie könnte 5von ihnen Primzahl sein?
Maltysen
@Maltysen lassen Sie mich die Definition umschreiben
Meow Mix
1
@ user3502615 Ich spreche über den Teil, in dem Sie sagen "sind von der Form a + bω, für die a, b natürliche Zahlen (einschließlich Null) kleiner als n sind"
Maltysen
@Maltysen Es gibt 5 Zahlen: 2ω, 2ω + 1,2ω + 2, ω + 2 und 2
Meow Mix

Antworten:

1

Gelee, 24 Bytes

Rð_²+×µ€µ³RḊm3,µÆP×1¦3FS

Etwa der gleiche Ansatz wie meine Antwort von Julia.

                          Initial argument: n
R                           Compute [1, 2, …, n]
 ð_²+×                      (λ, ρ) —→ (λ − ρ)² + λρ (which is λ² − λρ + ρ²)
      µ€                    Zip with itself. Call this Q.

        µ                 Refocus argument: Q
         ³                  The initial argument n
          RḊm3              Compute candidate green line primes: [2, 5, 8, …, n]
              ,             Call this P. Make pair with argument.

               µ          Refocus argument: [P, Q]
                ÆP          Check primality
                  ×1¦3      Multiply the first element by 3
                      FS    Sum everything
                            (The result is 3·countprimes(P) + countprimes(Q))
Lynn
quelle
8

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 ):

Geben Sie hier die Bildbeschreibung ein

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 bdurch , 1wenn a<1<b%3- dann ist der Ausdruck reduziert sich auf b. Das scheint nicht kürzer zu sein, aber es ist ordentlich!

Lynn
quelle
1

CJam (34 Bytes)

qi,:)_2m*{_:*\:-_*+}%\1>3%3*+:mp1b

Online-Demo

Peter Taylor
quelle