Primer Kuba

20

Diberi bilangan alami n , kembalikan prima ke- n Kuba .

Primer Kuba

Perdana Kuba adalah bilangan prima dari formulir

hal=x3-y3x-y

di mana y>0 dan x=1+y atau x=2+y

Detail

  • Anda dapat menggunakan pengindeksan berbasis 0 atau 1, apa pun yang paling sesuai untuk Anda.
  • Anda dapat mengembalikan n prima -th diberikan indeks n atau yang pertama n bilangan prima dalam rangka meningkatkan, atau alternatifnya Anda dapat mengembalikan daftar tak terbatas / generator yang menghasilkan bilangan prima dalam meningkatkan pesanan.

Uji kasus

Beberapa istilah pertama adalah sebagai berikut:

(#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

Lebih banyak istilah dapat ditemukan di OEIS: Mereka dibagi dalam dua urutan, tergantung pada apakah x=1+y atau x=2+y : A002407 dan A002648

cacat
sumber
2
Bisakah kita mengembalikan prima pertama dan tidak diurutkan?
J42161217
@ J42161217 Tidak, bilangan prima harus meningkat.
flawr

Jawaban:

23

JavaScript (V8) , 54 byte

Program lengkap yang mencetak bilangan prima Kuba selamanya.

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

Cobalah online!

NB: Kecuali Anda memiliki kertas yang tak terbatas di printer Anda, jangan coba-coba menjalankan ini di konsol browser Anda , di mana print()mungkin memiliki arti yang berbeda.


JavaScript (ES6),  63 61 60  59 byte

Mengembalikan n -th prime Kuba, 1-diindeks.

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

Cobalah online!

Bagaimana?

Ini didasarkan pada fakta bahwa bilangan prima Kuba adalah bilangan prima dari bentuk:

pn=3n24+1,n3

Formula di atas dapat ditulis sebagai:

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

atau untuk y>0 :

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

yaitu x3y3xy untuk masing-masingx=y+1danx=y+2.

Arnauld
sumber
7

05AB1E , 16 12 9 byte

Menghasilkan daftar tanpa batas.
Disimpan 4 byte dengan port rumus Arnaulds Kevin Cruijssen . Disimpan 3 byte lagi berkat Grimy

∞n3*4÷>ʒp

Cobalah online!

Penjelasan

∞          # on the list of infinite positive integers
 n3*4÷>    # calculate (3*N^2)//4+1 for each
       ʒp  # and filter to only keep primes
Emigna
sumber
Anda telah membuat kesalahan ketik dalam penjelasan Anda: " letakkan salinan N^2+3di tumpukan " seharusnya 3*N^2. Juga, mengapa )bukan ¯? Karena lebih mudah mengetik? Dan untuk beberapa alasan saya merasa NnN‚3*¬sO‚bisa 1 byte lebih pendek, tapi saya tidak melihatnya. Alternatif sedikit byte sama adalah Nn3*DN3*+‚. Tapi saya mungkin hanya melihat hal-hal yang tidak ada di sana ..;) Jawaban yang bagus, jadi +1 dari saya.
Kevin Cruijssen
1
Saya benar-benar mencoba untuk port jawaban saya ke 05AB1E, tetapi gagal total. : D
Arnauld
1
Sebenarnya, membuat daftar yang tak terbatas lebih mudah: 9 byte dengan ∞n3 * 4 ÷> ʒp
Grimmy
1
OK, saya tidak terbiasa dengan spesifikasi yang bertentangan dengan diri mereka sendiri. :-)
WGroleau
6
@WGroleau saya berasumsi Anda belum pernah mengembangkan perangkat lunak secara profesional. Saya lebih khawatir ketika saya mendapatkan spesifikasi yang tidak bertentangan dengan diri mereka sendiri.
MikeTheLiar
7

R , 75 73 byte

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

Cobalah online!

-2 byte dengan memperhatikan bahwa saya dapat menghapus tanda kurung jika saya menggunakan *sebagai ganti &(prioritas yang berbeda).

Output nperdana Kuba (1-diindeks).

Ini menggunakan fakta (diberikan dalam OEIS) bahwa bilangan prima Kuba dalam bentuk hal=1+3n2 atau 4hal=1+3n2 untuk beberapa n , yaitu n=Sebuahhal-13 adalah bilangan bulat untukSebuah=1atauSebuah=4.

Kuncinya adalah bahwa tidak ada prima dapat dari bentuk 2hal=1+3n2 atau 3hal=1+3n2 (*), sehingga kita dapat menghemat 2 byte dengan memeriksa rumus untuk Sebuah{1,2,3,4} ( 1:4) bukan Sebuah{1,4} ( c(1,4)).

Versi kode yang sedikit tidak diubah:

# 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

(*) Tidak ada bilangan prima dalam bentuk 3hal=1+3n2 , jika tidak 1=3(hal-n2) akan habis dibagi 3 .

Tidak ada bilangan prima selain hal=2 (yang bukan bilangan prima Kuba) dalam bentuk 2hal=1+3n2 : n harus ganjil, yaitu n=2k+1 . Memperluas memberi 2hal=4+12k(k+1) , maka hal=2+6k(k+1) dan hal akan genap.

Robin Ryder
sumber
bagaimana dengan menghindari loop dengan menggunakan batas atas pada prime Kuba ke-n?
Xi'an
@ Xi'an Saya memikirkan hal itu, tetapi tidak bisa datang dengan ikatan seperti itu. Anda punya satu?
Robin Ryder
5

Bahasa Wolfram (Mathematica) , 66 65 56 byte

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

Cobalah online!

  • J42161217 -1 dengan menggunakan ⌊ ⌋bukanFloor[ ]

  • attinat

    • -1 dengan menggunakan ⌊3#/4#⌋alih-alih⌊3#^2/4⌋
    • -8 untuk For[n=i=0,i<#,PrimeQ@f@++n&&i++]bukannyan=2;i=#;While[i>0,i-=Boole@PrimeQ@f@++n]
gaya kecepatan
sumber
1
65 byte . Selamat datang di ppcg. Jawaban pertama yang bagus! +1
J42161217
Terima kasih! (Lama bersembunyi.) Saya tidak bisa menguraikan jawaban Anda yang sudah ada jadi saya menulis jawaban saya sendiri dan hasilnya sedikit lebih pendek. Saya mungkin melakukan satu Python juga.
speedstyle
2
56 bytes
attinat
@attinat Saya pikir rumus Arnauld hanya bekerja untuk n> 2 jadi saya tidak mulai dengan 0 - meskipun seperti pada contoh Anda ini bekerja untuk semua n (karena mulai 1 1 4 7 13 ... jadi prima adalah 7 13. ..)
speedstyle
3

Java 8, 94 88 86 84 byte

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

-6 bytes dengan menggunakan Java prime-checker dari @SaraJ , jadi pastikan untuk melakukan upvote padanya!
-2 byte terima kasih kepada @ OlivierGrégoire . Karena angka pertama yang kita periksa adalah 7, kita dapat menghapus trailing %ndari pemeriksa-utama Sara, yang untuk mengakhiri perulangan n=1.
-2 byte terima kasih kepada @ OlivierGrégoire dengan memasukkan jawaban @Arnauld .

Output dibatasi ruang tanpa batas.

Cobalah online.

Penjelasan (dari versi 86 byte yang lama): TODO: Perbarui penjelasan

haln=3n24+1,n3

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)
Kevin Cruijssen
sumber
Saya tidak benar-benar berpikir itu layak, tetapi cara lain untuk menemukan bilangan prima Kuba menggunakan rumus ini:, 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);}mungkin seseorang dapat menggunakan ini untuk golf? Saya tidak bisa.
Olivier Grégoire
1
@ OlivierGrégoire Anda dapat golf Anda sedikit lebih dengan menghapus yang tidak terpakai ,pdan mengubah i+=++r%2*3,n+=ike n+=i+=++r%2*3, tapi kemudian aku masih akan berakhir pada 106 byte. Menggunakan Java 11 ini String#repeatdengan prime-regex adalah 105 byte: v->{for(int n=7,i=3,r=0;;n+=i+=++r%2*3)if(!"x".repeat(n).matches(".?|(..+?)\\1+"))System.out.println(n);}.
Kevin Cruijssen
Ya, saya kira itu tidak banyak golf meskipun kesalahan saya (sekarang jelas). Terima kasih telah memberikan tumpangan;)
Olivier Grégoire
@ OlivierGrégoire Mungkin juga baik untuk Anda ketahui, tetapi tampaknya ada pemeriksaan perdana yang lebih pendek di Jawa. Lihat edit saya dan jawaban cek utama SaraJ.
Kevin Cruijssen
Saya mungkin salah, tetapi yang terakhir %ntidak diperlukan, bukan?
Olivier Grégoire
1

Bahasa Wolfram (Mathematica) , 83 byte

Solusi ini akan menampilkan perdana Kuba ke-n dengan manfaat tambahan berupa cepat dan mengingat semua hasil sebelumnya dalam simbol f.

(d:=1+3y(c=1+y)+3b c;e:=If[PrimeQ@d,n++;f@n=d];For[n=y=b=0,n<#,e;b=1-b;e,y++];f@#)&

Cobalah online!

Kelly Lowder
sumber
1

Spasi , 180 byte

[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]

Huruf S(spasi), T(tab), dan N(baris baru) ditambahkan hanya sebagai penyorotan.
[..._some_action]ditambahkan sebagai penjelasan saja.

Output-batas baru dibatasi tanpa batas.

Cobalah online (dengan spasi, tab, dan hanya baris baru).

Penjelasan dalam pseudo-code:

haln=3n24+1,n3

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
Kevin Cruijssen
sumber
1

Python 3 , 110 108 102 byte

Metode yang mirip dengan jawaban Mathematica saya (yaitu isPrime(1+⌊¾n²⌋) else n++) menggunakan pemeriksa prime golf ini dan mengembalikan generator tanpa batas anonim

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

Cobalah online!

  • mypetlion -2 karena generator anonim bisa dibilang lebih diizinkan daripada yang bernama
  • -6 dengan mulai countdari 2 +1 sehingga and x>1pemeriksa utama yang saya pinjam tidak perlu -7
gaya kecepatan
sumber
Jawaban yang masuk ke variabel biasanya tidak dianggap sebagai bentuk "output" yang valid. Bisakah Anda mengolah jawaban Anda sehingga hasilnya adalah output ke stdout atau dikembalikan oleh suatu fungsi?
mypetlion
1
karena fungsi anonim diizinkan, dan tantangannya secara eksplisit memungkinkan generator tanpa batas, saya telah menghapus g=. Saya hanya memasukkannya di tempat pertama karena memungkinkan visual cepat pada TIO dengan print(next(g) for i in range(52)).
speedstyle
1

Japt , 14 13 byte

Diadaptasi dari formula Arnauld . 1-diindeks.

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

Cobalah

1 byte disimpan berkat EmbodimentOfIgnorance.

Shaggy
sumber
13 byte? Tidak diuji secara menyeluruh.
Perwujudan Ketidaktahuan
Terima kasih, @EmbodimentofIgnorance. Saya sudah mencobanya tetapi tidak berhasil; Ternyata saya lupa (.
Shaggy
1

Racket , 124 byte

(require math)(define(f n[i 3])(let([t(+(exact-floor(* 3/4 i i))1)][k(+ 1 i)])(if(prime? t)(if(= 0 n)t(f(- n 1)k))(f n k))))

Cobalah online!

Mengembalikan n-th perdana Kuba, 0-diindeks.

Menggunakan rumus jawaban JavaScript @ Arnauld

Galen Ivanov
sumber
1

Python 3 , 83 byte

mencetak bilangan prima Kuba selamanya.

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)

Cobalah online!

x=1+yx=2+y

hal=(1+y)3-y3(1+y)-y=1+3y+3y2y=-12±14+hal-13

hal=(2+y)3-y3(1+y)-y=4+6y+3y2y=-1±hal-13
y±-1

ovs
sumber
1

Perl 6 , 33 31 byte

-2 byte terima kasih kepada Grimy

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

Cobalah online!

Blok kode anonim yang mengembalikan daftar malas bilangan prima Kuba. Ini menggunakan rumus Arnauld untuk menghasilkan kemungkinan bilangan prima Kuba, lalu &is-primemenyaringnya.

Penjelasan:

{                           }  # 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
Jo King
sumber
1
1+0+|bisa saja1+|
Grimmy
0

APL (NARS), 98 karakter, 196 byte

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

indentasi:

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

uji:

  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

didasarkan pada: jika y dalam N, satu kemungkinan Perdana Cuban adalah

S1=1+3y(y+1)

Perdana mungkin Kuba berikutnya

S2=3(y+1)+S1
RosLuP
sumber