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])
Hãy thử trực tuyến!
Giải trình
Chúng tôi quan tâm đến các số nguyên tố trong hình bình hành này trên mặt phẳng phức (ví dụ cho n = 4 ):
Chúng ta có thể chia chúng thành các số nguyên tố trên các đường màu xanh lá cây và trên các đường màu xám .
Wikipedia cho tôi biết một số Eisenstein z là một dòng màu xanh lá cây Eisenstein Prime iff | z | là một số nguyên tố tự nhiên bằng 2 mod 3.
Nó cũng cho biết z là một đường màu xám Eisenstein Prime iff | z | ² = a² - ab + b² là một số nguyên tố tự nhiên.
Vì vậy, chúng tôi lặp qua a = 0 Giảm n và b = 0 Khác n và kiểm tra:
Nếu (a = 0 hoặc b = 0 hoặc a = b) và max (a, b)% 3 = 2 , thì hãy tính xem max (a, b) có phải là số nguyên tố hay không.
Khác, tính xem a² - ab + b² có phải là số nguyên tố hay không.
Tuy nhiên, chúng ta có thể lạm dụng tính đối xứng của phân phối. Thay vì đếm từng dòng xanh một lần, chúng ta chỉ có thể đếm một lần ba dòng xanh! Đó là, chỉ kiểm tra a = 0 và tăng bộ đếm lên ba khi chúng ta tìm thấy một số nguyên tố màu xanh lục. Các a=[0;0;0:n]
đạt chính xác này.
Vì chúng tôi biết rằng chúng tôi chỉ xem xét đường màu xanh lá cây a = 0 , chúng tôi có thể thay thế max (a, b) bằng b .
Điều kiện đường màu xanh lá cây của người Viking được thể hiện độc đáo ở Julia bằng cách sử dụng chuỗi vận hành: a<1<b%3
.
(Đối với các dòng màu xanh lá cây còn lại, chúng tôi sẽ không bao giờ trả lại dương tính giả: nếu a = b hoặc b = 0 thì a² - ab + b² = a² , không thể là số nguyên tố.)
Ý tưởng
Có lẽ, thay vì viết a^2-a*b+b^2
, tôi có thể có điều kiện thay thế số mũ tại b
bởi 1
khi a<1<b%3
- thì biểu thức giảm xuống b
. Điều này dường như không ngắn hơn, nhưng nó gọn gàng!