Số nguyên tố Cuba


20

Cho số tự nhiên , trả về số nguyên tố cuban thứ .nn

Số nguyên tố Cuba

Một số nguyên tố Cuba là số nguyên tố của mẫu

p=x3y3xy

trong đó và hoặcy>0x=1+yx=2+y

Chi tiết

  • Bạn có thể sử dụng lập chỉ mục dựa trên 0 hoặc 1, bất cứ điều gì phù hợp nhất với bạn.
  • Bạn có thể trả về số nguyên tố thứ cho chỉ số hoặc số nguyên tố đầu tiên theo thứ tự tăng dần hoặc thay vào đó bạn có thể trả về một danh sách / trình tạo vô hạn tạo ra các số nguyên tố theo thứ tự tăng dần.nnn

Các trường hợp thử nghiệm

Một vài điều khoản đầu tiên như sau:

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

Nhiều thuật ngữ có thể được tìm thấy trên OEIS: Chúng được chia thành hai chuỗi, tùy thuộc vào wheter hoặc : A002407A002648x=1+yx=2+y


2
Chúng ta có thể trả về n số nguyên tố đầu tiên không được sắp xếp không?
J42161217

@ J42161217 Không, các số nguyên tố phải theo thứ tự tăng dần.
flawr

Câu trả lời:


23

JavaScript (V8) , 54 byte

Một chương trình đầy đủ in các số nguyên tố Cuba mãi mãi.

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

Hãy thử trực tuyến!

Lưu ý: Trừ khi bạn có giấy vô hạn trong máy in của mình, đừng cố chạy nó trong bảng điều khiển trình duyệt của bạn , nơi print()có thể có ý nghĩa khác.


JavaScript (ES6),  63 61 60  59 byte

Trả về số nguyên tố Cuba thứ n , 1 chỉ mục.

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

Hãy thử trực tuyến!

Làm sao?

Điều này dựa trên thực tế là các số nguyên tố Cuba là các số nguyên tố có dạng:

pn=3n24+1,n3

Công thức trên có thể được viết là:

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

hoặc cho bất kỳ y>0 :

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

đó là x3y3xy lần lượt làx=y+1x=y+2.


7

05AB1E , 16 12 9 byte

Tạo một danh sách vô hạn.
Đã lưu 4 byte với công thức Arnaulds của Kevin Cruijssen . Đã lưu thêm 3 byte nhờ Grimy

∞n3*4÷>ʒp

Hãy thử trực tuyến!

Giải trình

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

Bạn đã tạo ra một lỗi đánh máy trong lời giải thích của bạn: "nên đặt một bản sao N^2+3trên ngăn xếp " 3*N^2. Ngoài ra, tại sao )thay vì ¯? Bởi vì nó dễ gõ hơn? Và vì một số lý do tôi có cảm giác NnN‚3*¬sO‚có thể ngắn hơn 1 byte, nhưng tôi không thấy nó. Một thay thế byte bằng nhau là Nn3*DN3*+‚. Nhưng có lẽ tôi chỉ nhìn thấy những thứ không có ở đó ..;) Câu trả lời hay, nên +1 từ tôi.
Kevin Cruijssen

1
Tôi thực sự đã cố gắng chuyển câu trả lời của mình sang 05AB1E, nhưng thất bại thảm hại. : D
Arnauld

1
Trên thực tế, việc tạo một danh sách vô hạn sẽ thuận tiện hơn: 9 byte với n3 * 4> p
Grimmy

1
OK, tôi không quen với thông số kỹ thuật mâu thuẫn với chính họ. :-)
WGroleau

6
@WGroleau Tôi cho rằng bạn chưa bao giờ phát triển phần mềm một cách chuyên nghiệp. Tôi quan tâm hơn khi tôi nhận được thông số kỹ thuật không mâu thuẫn với chính họ.
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

Hãy thử trực tuyến!

-2 byte bằng cách lưu ý rằng tôi có thể xóa dấu ngoặc nếu tôi sử dụng *thay vì &(ưu tiên khác nhau).

Xuất ra số nnguyên tố Cuba thứ 1 (được lập chỉ mục 1).

Nó sử dụng thực tế (được đưa ra trong OEIS) rằng số nguyên tố Cuba có dạng p= =1+3n2 hoặc 4p= =1+3n2 đối với một số n , tức là n= =mộtp-13 là một số nguyên chomột= =1hoặcmột= =4.

Mẹo nhỏ là không có số nguyên tố nào có thể có dạng 2p= =1+3n2 hoặc 3p= =1+3n2 (*), vì vậy chúng ta có thể lưu 2 byte bằng cách kiểm tra công thức cho một{1,2,3,4} ( 1:4) thay vì một{1,4} ( c(1,4)).

Phiên bản hơi vô căn cứ của mã:

# 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

(*) Không có số nguyên tố nào có thể có dạng 3p= =1+3n2 , nếu không 1= =3(p-n2) sẽ chia hết cho 3 .

Không có số nguyên tố nào ngoài p= =2 (không phải là số nguyên tố Cuba) có thể có dạng 2p= =1+3n2 : n sẽ cần phải là số lẻ, tức là n= =2k+1 . Mở rộng cho 2p= =4+12k(k+1) , do đó p= =2+6k(k+1)p sẽ là số chẵn.


Điều gì về việc tránh một vòng lặp bằng cách sử dụng một giới hạn trên của thủ tướng Cuba thứ n?
Tây An

@ Xi'an Tôi đã nghĩ về điều đó, nhưng không thể đưa ra một ràng buộc như vậy. Bạn có cái nào không?
Robin Ryder

5

Ngôn ngữ Wolfram (Mathicala) , 66 65 56 byte

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

Hãy thử trực tuyến!

  • J42161217 -1 bằng cách sử dụng ⌊ ⌋thay vìFloor[ ]

  • attinat

    • -1 bằng cách sử dụng ⌊3#/4#⌋thay vì⌊3#^2/4⌋
    • -8 cho For[n=i=0,i<#,PrimeQ@f@++n&&i++]thay vìn=2;i=#;While[i>0,i-=Boole@PrimeQ@f@++n]

1
65 byte . Chào mừng đến với ppcg. Câu trả lời đầu tiên tốt đẹp! +1
J42161217

Cảm ơn! (Người ẩn giấu thời gian dài.) Tôi không thể phân tích câu trả lời hiện có của bạn nên tôi đã tự viết và nó xuất hiện ngắn hơn một chút. Tôi cũng có thể làm một Python.
speedstyle


@attinat Tôi nghĩ rằng công thức của Arnauld chỉ hoạt động với n> 2 vì vậy tôi đã không bắt đầu bằng 0 - mặc dù như trong ví dụ của bạn, nó hoạt động với tất cả n (vì nó bắt đầu 1 1 4 7 13 ... vì vậy các số nguyên tố là 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 byte bằng cách sử dụng trình kiểm tra chính của Java của @SaraJ , vì vậy hãy đảm bảo nâng cấp cô ấy!
-2 byte nhờ @ OlivierGrégoire . Vì số đầu tiên chúng tôi kiểm tra là 7, chúng tôi có thể thả dấu %nkiểm từ trình kiểm tra chính của Sara, đó là chấm dứt vòng lặp cho n=1.
-2 byte nhờ @ OlivierGrégoire bằng cách chuyển câu trả lời của @Arnauld .

Đầu ra không gian được phân định không giới hạn.

Hãy thử trực tuyến.

Giải thích (của phiên bản 86 byte cũ): TODO: Cập nhật giải thích

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

Tôi thực sự không nghĩ rằng nó khả thi, nhưng một cách khác để tìm các số nguyên tố Cuba sử dụng công thức này:, 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);}có lẽ ai đó có thể sử dụng nó để chơi gôn? Tôi không thể.
Olivier Grégoire

1
@ OlivierGrégoire Bạn có thể chơi gôn nhiều hơn một chút bằng cách loại bỏ những thứ không sử dụng ,pvà đổi i+=++r%2*3,n+=ithành n+=i+=++r%2*3, nhưng sau đó tôi vẫn sẽ kết thúc ở 106 byte. Sử dụng Java 11 String#repeatvới Prime-regex là 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

Vâng, tôi đoán nó không thể chơi được nhiều mặc dù những sai lầm (giờ đã rõ ràng) của tôi. Cảm ơn vì đã cho nó đi nhờ;)
Olivier Grégoire

@ OlivierGrégoire Có thể cũng tốt để biết cho bạn, nhưng rõ ràng có một vòng kiểm tra chính ngắn hơn trong Java. Xem chỉnh sửa của tôi và câu trả lời chính của SaraJ.
Kevin Cruijssen

Tôi có thể sai, nhưng điều cuối cùng %nlà không bắt buộc, phải không?
Olivier Grégoire




1

Khoảng trắng , 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]

Chữ cái S(dấu cách), T(tab) và N(dòng mới) được thêm vào dưới dạng chỉ tô sáng.
[..._some_action]chỉ thêm vào giải thích.

Đầu ra dòng mới được phân định vô thời hạn.

Dùng thử trực tuyến (chỉ có khoảng trắng, tab và dòng mới).

Giải thích bằng mã giả:

pn= =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

1

Python 3 , 110 108 102 byte

Phương pháp tương tự với câu trả lời Mathicala của tôi (tức là isPrime(1+⌊¾n²⌋) else n++) bằng cách sử dụng trình kiểm tra chính được đánh gôn này và trả về một trình tạo vô hạn ẩn danh

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

Hãy thử trực tuyến!

  • mypetlion -2 vì các trình tạo ẩn danh được cho là được phép nhiều hơn các trình tạo tên
  • -6 bằng cách bắt đầu từ count2 +1 để and x>1trong trình kiểm tra chính tôi đã mượn là không cần thiết -7

Câu trả lời đi vào một biến thường không được coi là một dạng "đầu ra" hợp lệ. Bạn có thể làm lại câu trả lời của mình để kết quả là đầu ra cho thiết bị xuất chuẩn hoặc được trả về bởi một hàm không?
mypetlion

1
vì các chức năng ẩn danh được cho phép và thách thức rõ ràng cho phép một trình tạo vô hạn, tôi đã xóa g=. Tôi chỉ đưa nó vào vị trí đầu tiên vì nó cho phép hiển thị nhanh trên TIO với print(next(g) for i in range(52)).
speedstyle



1

Python 3 , 83 byte

in các số nguyên tố Cuba mãi mãi.

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)

Hãy thử trực tuyến!

x= =1+yx= =2+y

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

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


1

Perl 6 , 33 31 byte

-2 byte nhờ Grimy

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

Hãy thử trực tuyến!

Khối mã ẩn danh trả về một danh sách vô hạn lười biếng của các số nguyên tố Cuba. Điều này sử dụng công thức của Arnauld để tạo ra các số nguyên tố Cuba có thể, sau đó &is-primeđể lọc chúng.

Giải trình:

{                           }  # 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+|có thể chỉ là1+|
Grimmy


0

APL (NARS), 98 ký tự, 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

thụt lề:

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

kiểm tra:

  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

nó dựa trên: nếu y ở N, một Cuba có thể là

S1=1+3y(y+1)

Thủ tướng Cuba có thể tiếp theo sẽ là

S2=3(y+1)+S1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.