Menghitung bilangan prima Eisenstein

8

pengantar

Bilangan bulat Eisenstein adalah bilangan kompleks dari bentuk itu

a+bω

Di mana a,bbilangan bulat, dan

ω = e^(2πi/3)

Bilangan bulat Eisenstein membentuk kisi segitiga di bidang kompleks:

Eisenstein Integer dalam Pesawat Kompleks

Kami mengatakan bahwa bilangan bulat Eisenstein z=a+bωadalah bilangan prima jika tidak dapat ditulis sebagai produk dari dua non-unit (bukan 1, -1, ω, -ω, ω ^ 2, atau -ω ^ 2) bilangan bulat Eisenstein

Program

Input : Nomor alami n.

Output : Jumlah bilangan prima Eisenstein yang dari bentuk a+bωyang a,bmerupakan bilangan (termasuk nol) kurang dari atau sama dengann

Uji Kasus

0 → 0

1 → 0

2 → 5

3 → 9

4 → 13

5 → 20

Mencetak gol

Ini code-golf, jumlah byte yang paling sedikit menang

Meow Mix
sumber
2
Bisakah Anda memberikan beberapa test case?
Alex A.
Saya tidak mengerti soal-soal ujian. Jumlah a,bpasangan 2hanya 4jadi bagaimana mungkin 5mereka menjadi prima?
Maltysen
@Maltysen izinkan saya menulis ulang definisi
Meow Mix
1
@ user3502615 saya sedang berbicara tentang bagian di mana Anda mengatakan "adalah dari bentuk + bω yang a, b adalah bilangan alami (termasuk nol) kurang dari n"
Maltysen
@Maltysen Ada 5 angka: 2ω, 2ω + 1,2ω + 2, ω + 2, dan 2
Meow Mix

Jawaban:

1

Jelly, 24 byte

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

Pendekatan yang hampir sama dengan jawaban Julia saya.

                          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
sumber
8

Julia, 66 62 60 byte

!n=sum(isprime,[a<1<b%3?b:a^2-a*b+b^2for a=[0;0;0:n],b=0:n])

Cobalah online!

Penjelasan

Kami tertarik pada bilangan prima dalam jajaran genjang ini pada bidang kompleks (contoh untuk n = 4 ):

masukkan deskripsi gambar di sini

Kita dapat membaginya menjadi bilangan prima pada garis hijau , dan pada garis abu - abu .

Wikipedia memberi tahu saya nomor Eisenstein z adalah garis hijau Eisenstein prime iff | z | adalah prime natural sama dengan 2 mod 3.

Ia juga mengatakan z adalah garis abu - abu Eisenstein prime iff | z | ² = a² - ab + b² adalah prime natural.


Jadi kita mengulang a = 0 ... n dan b = 0 ... n , dan periksa:

  • Jika (a = 0 atau b = 0 atau a = b) dan maks (a, b)% 3 = 2 , maka hitung apakah maks (a, b) adalah bilangan prima.

  • Jika tidak, hitung apakah a² - ab + b² adalah bilangan prima.

Namun, kami dapat menyalahgunakan simetri distribusi. Alih-alih menghitung setiap garis hijau satu kali, kita bisa menghitung satu garis hijau tiga kali! Yaitu, hanya memeriksa a = 0 dan menambah penghitung dengan tiga ketika kita menemukan prime garis hijau. The a=[0;0;0:n]mencapai persis ini.

Karena kita tahu kita hanya mempertimbangkan garis hijau a = 0 , kita dapat mengganti maks (a, b) dengan b .

“Kondisi jalur hijau” adalah baik dinyatakan dalam Julia menggunakan chaining Operator: a<1<b%3.

(Untuk garis hijau yang tersisa, kami tidak akan pernah mengembalikan false positive: jika a = b atau b = 0 maka a² - ab + b² = a² , yang tidak dapat menjadi prima.)

Ide ide

Mungkin, alih-alih menulis a^2-a*b+b^2, saya bisa kondisional menggantikan eksponen di boleh 1saat a<1<b%3- maka ekspresi mengurangi ke b. Ini sepertinya tidak lebih pendek, tetapi rapi!

Lynn
sumber
1

CJam (34 byte)

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

Demo online

Peter Taylor
sumber