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


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

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!


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.