Cubimes Primes


20

รับจำนวนธรรมชาติ , กลับ -th นายกคิวบาnn

Cubimes Primes

Cuban prime เป็นจำนวนเฉพาะของแบบฟอร์ม

พี=x3-Y3x-Y

โดยที่และหรือY>0x=1+Yx=2+Y

รายละเอียด

  • คุณอาจใช้การจัดทำดัชนีตาม 0 หรือ 1 สิ่งที่เหมาะกับคุณที่สุด
  • คุณสามารถกลับนายก -th ให้ดัชนีหรือแรกช่วงเวลาในการสั่งซื้อที่เพิ่มขึ้นหรือมิฉะนั้นคุณสามารถกลับรายการอนันต์ / เครื่องกำเนิดไฟฟ้าที่ผลิตเฉพาะในการสั่งซื้อที่เพิ่มขึ้น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 ไม่สิ่งที่ควรจะอยู่ในลำดับที่เพิ่มขึ้น
ข้อบกพร่อง

คำตอบ:


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 ไบต์

ส่งคืนไพรม์ Cuban -th ที่สร้างดัชนี 1 ตำแหน่งn

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

ลองออนไลน์!

อย่างไร?

สิ่งนี้มีพื้นฐานมาจากข้อเท็จจริงที่ว่าจำนวนเฉพาะของคิวบาเป็นช่วงเวลาของแบบฟอร์ม:

พีn=3n24+1,n3

สูตรข้างต้นสามารถเขียนเป็น:

พีn={3n2+14 ถ้า n แปลก3n2+44 ถ้า n เป็นคู่

หรือสำหรับใด ๆ :Y>0

พี2Y+1=3(2Y+1)2+14=3Y2+3Y+1
p2y+2=3(2y+2)2+44=3Y2+6Y+4

ซึ่งคือสำหรับและตามลำดับx3-Y3x-Yx=Y+1x=Y+2


7

05AB1E , 16 12 9 ไบต์

สร้างรายการที่ไม่มีที่สิ้นสุด
ที่บันทึกไว้ 4 ไบต์กับเควิน Cruijssen ของ พอร์ตของสูตร Arnaulds
บันทึกอีก 3 ไบต์ด้วยGrimy

∞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 จากฉัน
Kevin Cruijssen

1
จริง ๆ แล้วฉันพยายามที่จะพอร์ตคำตอบของฉันเพื่อ 05AB1E แต่ล้มเหลวอย่างน่าสังเวช : D
Arnauld

1
ที่จริงแล้วการสร้างรายการไม่มีที่สิ้นสุดสะดวกกว่า: 9 ไบต์ด้วยwithn3 * 4 ÷> ʒp
Grimmy

1
ตกลงฉันไม่คุ้นเคยกับสเป็คที่ขัดแย้งกับตัวเอง :-)
WGroleau

6
@WGroleau ฉันคิดว่าคุณไม่เคยพัฒนาซอฟต์แวร์อย่างมืออาชีพมาก่อน ฉันกังวลมากขึ้นเมื่อฉันได้รับสเป็คที่ไม่ขัดแย้งกับตัวเอง
MikeTheLiar

7

R , 75 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=ap13เป็นจำนวนเต็มสำหรับ=1หรือ=4a=1a=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)จะหารด้วย33

ไม่มีที่สำคัญอื่น ๆ กว่าp=2 (ซึ่งไม่ได้เป็นนายกคิวบา) สามารถของรูปแบบที่2p=1+3n2 : nจะต้องแปลกคือn=2k+1 1 การขยายให้2p=4+12k(k+1)ดังนั้นp=2+6k(k+1)และpจะเท่ากัน


สิ่งที่เกี่ยวกับการหลีกเลี่ยงการวนซ้ำโดยใช้ขอบเขตบนบนคิวบาที่สำคัญ?
ซีอาน

@ ซีอานฉันคิดเกี่ยวกับสิ่งนั้น แต่ไม่สามารถเกิดขึ้นได้ด้วยข้อ จำกัด ดังกล่าว คุณมีหรือไม่
Robin Ryder

5

ภาษา Wolfram (Mathematica) , 66 65 56 bytes

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

ลองออนไลน์!

  • J42161217 -1โดยใช้⌊ ⌋แทนFloor[ ]

  • attinat

    • -1โดยใช้⌊3#/4#⌋แทน⌊3#^2/4⌋
    • -8สำหรับFor[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 ด้วย
speedstyle


@attinat ฉันคิดว่าสูตรของ Arnauld ใช้ได้กับ n> 2 เท่านั้นฉันจึงไม่ได้ขึ้นต้นด้วย 0 - แม้ว่าในตัวอย่างของคุณจะใช้ได้กับ n ทั้งหมด (เพราะเริ่ม 1 1 4 7 13 ... ดังนั้นช่วงเวลานั้นคือ 13 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;);}

-6 ไบต์โดยใช้Java prime-checker ของ@SaraJดังนั้นอย่าลืม upvote เธอ!
-2 ไบต์ขอบคุณที่@ OlivierGrégoire ตั้งแต่การตรวจสอบจำนวนครั้งแรกที่เราเป็น7เราสามารถวางต่อท้ายจากซาร่าลากตัวตรวจสอบซึ่งก็คือการบอกเลิกห่วงสำหรับ%n -2 ไบต์ขอบคุณ@ OlivierGrégoireโดยตอบคำตอบของ@Arnauldn=1

ส่งออกที่คั่นด้วยช่องว่างอย่างไม่มีกำหนด

ลองออนไลน์

คำอธิบาย (ของรุ่น 86 ไบต์เก่า): สิ่งที่ต้องทำ: อัปเดตคำอธิบาย

พีn=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)

ฉันไม่คิดว่ามันจะเป็นไปได้ แต่วิธีอื่นในการค้นหา Cuban primes ใช้สูตรนี้: 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);}อาจมีบางคนสามารถใช้สิ่งนี้เพื่อเล่นกอล์ฟ? ฉันทำไม่ได้
Olivier Grégoire

1
@ OlivierGrégoireคุณสามารถตีกอล์ฟของคุณได้มากขึ้นโดยการลบสิ่งที่ไม่ได้ใช้,pและเปลี่ยนi+=++r%2*3,n+=iไปn+=i+=++r%2*3แต่หลังจากนั้นฉันจะจบที่ 106 ไบต์ โดยใช้ Java 11 String#repeatกับนายก regex 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);}ไบต์:
Kevin Cruijssen

ใช่ฉันเดาว่ามันไม่สามารถเล่นกอล์ฟได้มากนักแม้จะมีข้อผิดพลาด (ตอนนี้ชัดเจน) ของฉัน ขอบคุณที่ให้การเดินทาง;)
Olivier Grégoire

@ OlivierGrégoireอาจจะดีสำหรับคุณเช่นกัน แต่ดูเหมือนว่าจะมีการตรวจสอบวนซ้ำที่สั้นกว่าใน Java ดูการแก้ไขและคำตอบเฉพาะของ SaraJ
Kevin Cruijssen

ฉันอาจจะผิด แต่%nไม่จำเป็นต้องใช้ล่าสุดมันคืออะไร?
Olivier Grégoire



1

ภาษา Wolfram (Mathematica) , 83 ไบต์

วิธีการแก้ปัญหานี้จะส่งผลให้นายกรัฐมนตรีคิวบาที่ n ได้รับประโยชน์เพิ่มเติมจากความรวดเร็วและจดจำผลลัพธ์ก่อนหน้านี้ทั้งหมดในสัญลักษณ์ 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@#)&

ลองออนไลน์!


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]เพิ่มเป็นคำอธิบายเท่านั้น

เอาท์พุทคั่นด้วย newline ไปเรื่อย

ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)

คำอธิบายในรหัสเทียม:

พีn=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 ไบต์

วิธีที่คล้ายกับคำตอบ Mathematicaของฉัน(เช่นisPrime(1+⌊¾n²⌋) else n++) โดยใช้ตัวตรวจสอบนายกคนนี้ golfedและส่งกลับตัวสร้างแบบไม่ จำกัด ที่ไม่ระบุชื่อ

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เนื่องจากเครื่องกำเนิดไฟฟ้านิรนามที่ไม่ระบุชื่อได้รับอนุญาตมากกว่าชื่อที่กำหนด
  • -6โดยเริ่มต้นcountที่ 2 +1ดังนั้นand x>1ในตัวตรวจสอบหลักที่ฉันยืมมานั้นไม่จำเป็น-7

คำตอบที่เข้าสู่ตัวแปรมักไม่ถือว่าเป็นรูปแบบที่ถูกต้องของ "เอาท์พุท" คุณสามารถปรับปรุงคำตอบของคุณใหม่เพื่อให้ผลลัพธ์เป็นเอาต์พุตไปยัง stdout หรือส่งคืนโดยฟังก์ชันได้หรือไม่?
mypetlion

1
g=ตั้งแต่ฟังก์ชั่นที่ไม่ระบุชื่อที่ได้รับอนุญาตและความท้าทายชัดเจนให้กำเนิดอนันต์ผมได้ลบ ฉันได้รวมเฉพาะในสถานที่แรกเพราะมันได้รับอนุญาตให้ภาพอย่างรวดเร็วใน TIO print(next(g) for i in range(52))กับ
speedstyle

1

Japt , 14 13 ไบต์

ที่ดัดแปลงมาจากสูตรของ Arnauld 1 การจัดทำดัชนี

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

ลองมัน

บันทึก 1 ไบต์ด้วย EmbodimentOfIgnorance


13 ไบต์ ไม่ได้ทดสอบอย่างละเอียดว่า
ศูนย์รวมแห่งความไม่รู้

ขอบคุณ @EmbodimentofIgnorance ฉันลองแล้ว แต่มันใช้งานไม่ได้ (ผลัดกันออกมาผมลืม
Shaggy


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)

ลองออนไลน์!

x=1+Yx=2+Y

พี=(1+Y)3-Y3(1+Y)-Y=1+3Y+3Y2Y=-12±14+พี-13

พี=(2+Y)3-Y3(1+Y)-Y=4+6Y+3Y2Y=-1±พี-13
Y±-1


1

Perl 6 , 33 31 ไบต์

-2 ไบต์ขอบคุณ Grimy

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

ลองออนไลน์!

บล็อกโค้ดแบบไม่ระบุชื่อที่ส่งคืนรายการอนันต์ช่วงเวลาของคิวบา สิ่งนี้ใช้สูตรของ 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+|
Grimmy


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, Cuban Prime ที่เป็นไปได้หนึ่งอันคือ

S1=1+3y(y+1)

Cuban Prime ที่เป็นไปได้ต่อไปจะเป็น

S2=3(y+1)+S1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.