キューバのプライム


20

自然数を指定すると、番目のキューバプライムを返します。nn

キューバのプライム

キューバ素数は次の形式の素数です

p=x3y3xy

ここで、およびまたはy>0x=1+yx=2+y

詳細

  • 最適なものであれば、0または1ベースのインデックスを使用できます。
  • インデックスまたは最初の素数を昇順に指定して番目の素数を返すか、または素数を昇順で生成する無限リスト/ジェネレーターを返すことができます。nnn

テストケース

最初のいくつかの用語は次のとおりです。

(#1-13)   7, 13, 19, 37, 61, 109, 127, 193, 271, 331, 397, 433, 547,
(#14-24) 631, 769, 919, 1201, 1453, 1657, 1801, 1951, 2029, 2269, 2437,
(#25-34) 2791, 3169, 3469, 3571, 3889, 4219, 4447, 4801, 5167, 5419,
(#35-43) 6211, 7057, 7351, 8269, 9241, 10093, 10267, 11719, 12097,
(#44-52) 12289, 13267, 13669, 13873, 16651, 18253, 19441, 19927, 20173

より用語はOEISで見つけることができる:彼らはwheterに応じて、二つの配列に分割されている又は:A002407及びA002648x=1+yx=2+y


2
ソートされていない最初のn個の素数を返すことができますか?
J42161217

@ J42161217いいえ、素数は昇順である必要があります。
flawr

回答:


23

JavaScript(V8)、54バイト

キューバの素数を永遠に印刷する完全なプログラム。

for(x=0;;){for(k=N=~(3/4*++x*x);N%++k;);~k||print(-N)}

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

注:プリンターに無限の用紙がある場合を除きブラウザーコンソールこれを実行しようとしないでくださいprint()。別の意味があります。


JavaScript(ES6)、 63 61 60  59バイト

n番目のキューバプライムを1インデックスで返します。

f=(n,x)=>(p=k=>N%++k?p(k):n-=!~k)(N=~(3/4*x*x))?f(n,-~x):-N

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

どうやって?

これは、キューバの素数が次の形式の素数であるという事実に基づいています。

pn=3n24+1,n3

上記の式は次のように書くことができます。

pn={3n2+14 if n is odd3n2+44 if n is even

またはy>0

p2y+1=3(2y+1)2+14=3y2+3y+1
p2y+2=3(2y+2)2+44=3y2+6y+4

これはx3y3xyx=y+1、およびx=y+2それぞれ。


7

05AB1E16 12 9バイト

無限リストを生成します。Kevin CruijssenのArnauldsの式の式で
4バイトを節約しました。Grimyの おかげでさらに3バイト節約

∞n3*4÷>ʒp

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

説明

∞          # on the list of infinite positive integers
 n3*4÷>    # calculate (3*N^2)//4+1 for each
       ʒp  # and filter to only keep primes

あなたはあなたの説明でタイプミスをしました:「スタックにコピーを置くN^2+3」はそうでなければなりません3*N^2。また、なぜの)代わりに¯?入力が簡単だから?そして、何らかの理由で私はNnN‚3*¬sO‚1バイト短くすることができると感じていますが、私はそれを見ていません。わずかに等しいバイトの代替はNn3*DN3*+‚です。しかし、私はおそらくそこにないものを見ているだけです。
ケビンクルーッセン

1
私は実際に答えを05AB1Eに移植しようとしましたが、惨めに失敗しました。:D
アーナウド

1
実際には、無限のリストを生成することはより便利である:と9バイト∞n3* 4÷>ʒp
Grimmy

1
OK、私は自分自身と矛盾する仕様には慣れていません。:-)
WGroleau

6
@WGroleauあなたは、プロとしてソフトウェアを開発したことはないと思います。自分自身と矛盾しない仕様を取得するとき、私はより心配です。
MikeTheLiar

7

R75 73バイト

n=scan()
while(F<n)F=F+any(!(((T<-T+1)*1:4-1)/3)^.5%%1)*all(T%%(3:T-1))
T

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

(異なる優先順位)の*代わりにブラケットを使用すると、ブラケットを削除できることに気付き、-2バイト&

nキューバプライム(1から始まる)を出力します。

これはキューバの素数がフォームであること(OEISで与えられる)実際使用しp=1+3n2又は4p=1+3n2、いくつかのためのn、すなわちn=ap13a=1またはa=4整数です。

トリックはない素数の形式のものとすることができないことである2p=1+3n2又は3p=1+3n2(*)、我々は式をチェックすることにより、2つのバイトを保存することができるよう{ 1 2 3 4 }(代わりに){ 1 4 }()。a{1,2,3,4}1:4a{1,4}c(1,4)

コードのわずかに未使用のバージョン:

# F and T are implicitly initialized at 0 and 1
# F is number of Cuban primes found so far
# T is number currently being tested for being a Cuban prime
n = scan()                       # input
while(F<n){
  T = T+1                        # increment T 
  F = F +                        # increment F if
    (!all(((T*1:4-1)/3)^.5 %% 1) # there is an integer of the form sqrt(((T*a)-1)/3)
     & all(T%%(3:T-1)))          # and T is prime (not divisible by any number between 2 and T-1)
  }
T                                # output T

(*)3p=1+3n2の形式の素数は使用できません。それ以外の場合1=3(pn2)3で割り切れます。

超えない素数他p=2(キューバ素数ではない)形の缶2p=1+3n2n奇数であることが必要であろう、すなわち、n=2k+1。展開すると2p=4+12k(k+1)が得られるため、p=2+6k(k+1)となり、pは偶数になります。


n番目のキューバプライムの上限を使用してループを回避するのはどうですか?
西安

@ Xi'an私はそれについて考えましたが、そのような限界を思い付くことができませんでした。持っていますか?
ロビンライダー

5

Wolfram言語(Mathematica)66 65 56バイト

(f=1+⌊3#/4#⌋&;For[n=i=0,i<#,PrimeQ@f@++n&&i++];f@n)&

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

  • J42161217 -1使って、⌊ ⌋代わりにFloor[ ]

  • アッティナ

    • -1使って、⌊3#/4#⌋代わりに⌊3#^2/4⌋
    • -8For[n=i=0,i<#,PrimeQ@f@++n&&i++]代わりにn=2;i=#;While[i>0,i-=Boole@PrimeQ@f@++n]

1
65バイト。ppcgへようこそ。素敵な最初の答え!+1
J42161217

ありがとう!(長い時間に潜んでいます。)既存の回答を十分に解析できなかったため、独自の回答を作成し、少し短くなりました。私もPythonをするかもしれません。
スピードスタイル


@attinat Arnauldの式はn> 2でしか機能しないと思ったので、0で始めませんでした-あなたの例のようにすべてのnで機能します(1 1 4 7 13で始まるので...素数は7 13です) ..)
speedstyle

3

Java 8、94 88 86 84バイト

v->{for(int i=3,n,x;;System.out.print(x<1?++n+" ":""))for(x=n=i*i++*3/4;~n%x--<0;);}

@SaraJの Javaプライムチェッカーを使用し -6バイトなので、必ず彼女賛成してください!@OlivierGrégoireの
おかげで-2バイト。チェックする最初の数はなので、のループを終了するために、Saraのプライムチェッカーから末尾を削除できます。@Arnauldの回答を移植 して、@OlivierGrégoireに感謝-2バイト。7%nn=1

スペース区切りで無期限に出力します。

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

説明(古い86バイトバージョンの): TODO:説明の更新

pn=3n24+1n3

v->{                     // Method with empty unused parameter and no return-type
  for(int i=3,           //  Loop-integer, starting at 3
          n,x            //  Temp integers
      ;                  //  Loop indefinitely:
      ;                  //    After every iteration:
       System.out.print( //     Print:
        n==x?            //      If `n` equals `x`, which means `n` is a prime:
         n+" "           //       Print `n` with a space delimiter
        :                //      Else:
         ""))            //       Print nothing
    for(n=i*i++*3/4+1,   //   Set `n` to `(3*i^2)//4+1
                         //   (and increase `i` by 1 afterwards with `i++`)
        x=1;             //   Set `x` to 1
        n%++x            //   Loop as long as `n` modulo `x+1`
                         //   (after we've first increased `x` by 1 with `++x`)
             >0;);}      //   is not 0 yet
                         //   (if `n` is equal to `x`, it means it's a prime)

私はそれが実際に実行可能であるとは思いませんが、キューバの素数を見つける別の方法はこの式v->{for(int n=7,i=3,p,x,d,r=0;;i+=++r%2*3,n+=i,System.out.print(x>1?x+" ":""))for(x=n,d=1;++d<n;x=x%d<1?0:n);}を使用します。できなかった。
オリビエグレゴワール

1
@OlivierGrégoire未使用の,pを削除してに変更i+=++r%2*3,n+=iするとn+=i+=++r%2*3、ゴルフをもう少しゴルフできますが、それでも106バイトになります。String#repeatprime-regexでJava 11を使用すると、105バイトになりますv->{for(int n=7,i=3,r=0;;n+=i+=++r%2*3)if(!"x".repeat(n).matches(".?|(..+?)\\1+"))System.out.println(n);}
ケビンクルーッセン

ええ、私は(今では明らかな)ミスにもかかわらず、それほどゴルフに適さないと思いました。乗車してくれてありがとう;)
オリビエグレゴワール

@OlivierGrégoireも知っておくといいかもしれませんが、Javaにはプライムチェックループが短いようです。編集内容とSaraJのプライムチェックの回答をご覧ください。
ケビンクルーッセン

私は間違っているかもしれませんが、最後%nは必須ではありませんか?
オリビエグレゴワール




1

空白、180バイト

[S S S T    S N
_Push_2][S N
S _Duplicate][N
S S N
_Create_Label_OUTER_LOOP][S N
N
_Discard_top_stack][S S S T N
_Push_1][T  S S S _Add][S N
S _Duplicate][S N
S _Duplicate][T S S N
_Multiply][S S S T  T   N
_Push_3][T  S S N
_Multiply][S S S T  S S N
_Push_4][T  S T S _Integer_divide][S S S T  N
_Push_1][T  S S S _Add][S S S T N
_Push_1][S N
S _Duplicate_1][N
S S S N
_Create_Label_INNER_LOOP][S N
N
_Discard_top_stack][S S S T N
_Push_1][T  S S S _Add][S N
S _Duplicate][S N
S _Duplicate][S T   S S T   T   N
_Copy_0-based_3rd][T    S S T   _Subtract][N
T   S T N
_Jump_to_Label_PRINT_if_0][S T  S S T   S N
_Copy_0-based_2nd][S N
T   _Swap_top_two][T    S T T   _Modulo][S N
S _Duplicate][N
T   S S S N
_Jump_to_Label_FALSE_if_0][N
S N
S N
_Jump_to_Label_INNER_LOOP][N
S S T   N
_Create_Label_PRINT][T  N
S T _Print_as_integer][S S S T  S T S N
_Push_10_(newline)][T   N
S S _Print_as_character][S N
S _Duplicate][N
S S S S N
_Create_Label_FALSE][S N
N
_Discard_top_stack][S N
N
_Discard_top_stack][N
S N
N
_Jump_to_Label_OUTER_LOOP]

強調表示としてのみ追加される文字S(スペース)、T(タブ)、およびN(改行)。
[..._some_action]説明としてのみ追加。

改行区切りで無期限に出力します。

オンラインで試してください(未加工のスペース、タブ、改行のみ)。

擬似コードの説明:

pn=3n24+1n3

Integer i = 2
Start OUTER_LOOP:
  i = i + 1
  Integer n = i*i*3//4+1
  Integer x = 1
  Start INNER_LOOP:
    x = x + 1
    If(x == n):
      Call function PRINT
    If(n % x == 0):
      Go to next iteration of OUTER_LOOP
    Go to next iteration of INNER_LOOP

function PRINT:
  Print integer n
  Print character '\n'
  Go to next iteration of OUTER_LOOP

1

Pythonの3110の 108 102バイト

私のMathematicaの答え(すなわちisPrime(1+⌊¾n²⌋) else n++)と同様の方法で、このゴルフプライムチェッカーを使用して、匿名の無限ジェネレーターを返します。

from itertools import*
(x for x in map(lambda n:1+3*n**2//4,count(2)) if all(x%j for j in range(2,x)))

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

  • mypetlion -2名前付きのものよりもほぼ間違いなく匿名のジェネレータが許可されているため
  • -6count 2 +1から開始して、and x>1借りたプライムチェッカーで不要になる-7

変数に入る答えは通常、「出力」の有効な形式とは見なされません。結果が標準出力に出力されるように、または関数によって返されるように、答えを修正できますか?
mypetlion

1
無名関数が許可され、チャレンジが明示的に無限ジェネレータを許可するため、削除しましたg=。を使ってTIOのクイックビジュアルを許可したため、そもそもそれを含めましたprint(next(g) for i in range(52))
スピードスタイル

1

Japt14 13バイト

Arnauldの式から改作。1インデックス付き。

@µXj}f@Ò(X²*¾

それを試してみてください

EXAMPLEOfIgnoranceにより1バイトが節約されました。


13バイト?ただし、完全にはテストされていません。
無知の具現化

ありがとう、@ EmbodimentofIgnorance。私はそれを試してみましたが、うまくいきませんでした。私は忘れていたことが判明し(ます。
シャギー


1

Python 3、83バイト

キューバの素数を永遠に印刷します。

P=k=1
while 1:P*=k*k;x=k;k+=1;P%k>0==((x/3)**.5%1)*((x/3+.25)**.5%1-.5)and print(k)

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

バツ=1+yバツ=2+y

p=1+y3y31+yy=1+3y+3y2y=12±14+p13

p=2+y3y31+yy=4+6y+3y2y=1±p13
y±1


1

Perl 6の33の 31バイト

-Grimyのおかげで2バイト

{grep &is-prime,1+|¾*$++²xx*}

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

キューバの素数の怠zyな無限リストを返す匿名コードブロック。これは、Arnauldの式を使用して、可能なキューバプライムを生成し、&is-primeそれらをフィルタリングします。

説明:

{                           }  # Anonymous code block
 grep &is-prime,               # Filter the primes from
                         xx*   # The infinite list
                   ¾*          # Of three quarters
                     $++²      # Of an increasing number squared
                1+|            # Add one by ORing with 1

1
1+0+|ちょうど1+|
グリムミー


0

APL(NARS)、98文字、196バイト

r←h w;y;c;v
r←c←y←0⋄→4
→3×⍳∼0πv←1+3×y×1+y+←1⋄r←v⋄→0×⍳w≤c+←1
→2×⍳∼0πv+←3×y+1⋄c+←1⋄r←v
→2×⍳w>c

インデント:

r←h w;y;c;v
r←c←y←0⋄→4
    →3×⍳∼0πv←1+3×y×1+y+←1⋄r←v⋄→0×⍳w≤c+←1
    →2×⍳∼0πv+←3×y+1⋄c+←1⋄r←v
    →2×⍳w>c

テスト:

  h ¨1..20
7 13 19 37 61 109 127 193 271 331 397 433 547 631 769 919 1201 1453 1657 1801 
  h 1000
25789873
  h 10000
4765143511

に基づいています:yがNの場合、キューバプライムの1つは

S1=1+3y(y+1)

次のキューバプライムは

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