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 ):
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 b
oleh 1
saat a<1<b%3
- maka ekspresi mengurangi ke b
. Ini sepertinya tidak lebih pendek, tetapi rapi!