アイゼンシュタインの素数を数える


8

前書き

アイゼンシュタイン整数は、次の形式の複素数です。

a+bω

a,b整数はどこにあり、

ω = e^(2πi/3)

アイゼンシュタイン整数は、複素平面で三角格子を形成します。

複素平面のアイゼンシュタイン整数

2つの非単位の積(1、-1、ω、-ω、ω^ 2または-ω^ 2ではない)として記述できない場合、アイゼンシュタイン整数z=a+bω素数であると言います

プログラム

入力:自然数n

出力:フォームであるアイゼンシュタインの素数の数a+bωのためには、a,bに等しいかまたはそれ以下(ゼロを含む)である自然数n

テストケース

0→0

1→0

2→5

3→9

4→13

5→20

得点

これはcode-golfなので、最小バイト数が優先されます


2
いくつかのテストケースを提供できますか?
Alex A.

テストケースがわかりません。a,bペアの数2はただの数な4ので、どのよう5にしてそれらを素数にすることができますか?
Maltysen 2016年

@マルティセンは、定義を書き直させました
Meow Mix

1
@ user3502615「a、bがnより小さい自然数(ゼロを含む)であるa +bωの形式である」と言う部分について話している
Maltysen

@マルティセン5つの数字があります:2ω、2ω+ 1、2ω + 2、ω+ 2、2
Meow Mix

回答:


1

ゼリー、24バイト

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

ジュリアの答えとほぼ同じアプローチ。

                          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

ジュリア、66 62 60バイト

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

オンラインでお試しください!

説明

複素平面上のこの平行四辺形の素数に興味があります(n = 4の例):

ここに画像の説明を入力してください

緑の線灰色の線でそれらを素数に分割できます。

ウィキペディアは、アイゼンシュタイン数z緑色の線アイゼンスタインプライム iffであることを教えてくれます| z | 2 mod 3に等しい自然素数です。

また、言うzがある灰色の線エイゼンシュテインプライム IFF AB +のB 2 - ²= A 2は、| Z |自然素数です。


したがって、a = 0…nb = 0…nをループし、以下を確認します。

  • 場合(= 0またはb = 0または= B)MAX(A、B)%3 = 2は、次にかどうかをカウント(A、B)maxは素数です。

  • そうでなければ、a²-ab +b²が素数かどうかを数えます。

ただし、分布の対称性を悪用することはできます。緑の線を1回ずつ数えるのではなく、緑の線を3回数えるだけです。つまり、a = 0のみをチェック、緑の線素を見つけたときにカウンターを3 だけインクリメントします。これはa=[0;0;0:n]まさにこれを実現します。

緑の線a = 0のみを考慮していることがわかっているので、max(a、b)bに置き換えることができます。

「緑の線の状態」は、ジュリアでは演算子チェーンを使用してうまく表現されますa<1<b%3

(残りの緑の線については、誤検知を返すことはありません。a = bまたはb = 0の場合、a²-ab +b²=a²であり、素数にすることはできません。)

アイデア

たぶん、代わりに書き込みをa^2-a*b+b^2、私は条件付きで指数を置き換えることができるbことにより、1時にa<1<b%3その式がに削減します- b。これは短くはないようですが、きちんとしています!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.