เบอร์แทรนด์ของจำนวนเฉพาะ


24

เบอร์ทรานด์ของสมมุติระบุว่าสำหรับทุกจำนวนเต็มn ≥ 1มีอย่างน้อยหนึ่งที่สำคัญหน้าดังกล่าวว่าn <p ≤ 2n ในการตรวจสอบทฤษฎีบทนี้สำหรับn <4000เราไม่จำเป็นต้องตรวจสอบ 4000 ราย: กลอุบายของ Landauบอกว่าเพียงพอที่จะตรวจสอบว่า

2, 3, 5, 7, 13, 23, 43, 83, 163, 317, 631, 1259, 2503, 5003

ล้วนสำคัญ เพราะตัวเลขเหล่านี้แต่ละตัวมีค่าน้อยกว่าสองเท่าของรุ่นก่อนแต่ละช่วงเวลา{y: n <y ≤ 2n}มีตัวเลขอย่างน้อยหนึ่งในจำนวนเฉพาะเหล่านั้น

ลำดับของตัวเลขนี้คือBertrand Primes (OEIS A006992)และมีการกำหนดดังนี้:

a(1) = 2
a(n) = largest prime below 2a(n-1)

ท้าทาย

ใช้ลำดับนี้ คุณอาจจะเขียน

  • ฟังก์ชั่นหรือโปรแกรมที่ให้บางnส่งกลับค่า(n) (0 หรือ 1 ดัชนี)
  • ฟังก์ชั่นหรือโปรแกรมที่ให้บางnส่งคืนรายการแรกn (หรือn-1หรือn + 1 ) ของลำดับนี้
  • รายการหรือสตรีมหรือตัวสร้างที่ไม่สิ้นสุด

คำตอบ:


8

อ็อกเทฟ 32 ไบต์

k=2
do k=primes(k+k)(end)until 0

คงการพิมพ์ค่าอย่างไม่มีกำหนด (แต่ละค่าจะนำหน้าด้วยk =)

ลองออนไลน์!


อ็อกเทฟ 42 ไบต์

k=2
for i=2:input('')k=primes(k+k)(end)end

รับnเป็นอินพุตและเอาต์พุตnค่าแรก (แต่ละค่านำหน้าด้วยk =)

ลองออนไลน์!


อ็อกเทฟ 51 ไบต์

k=2;for i=2:input('')k=primes(k+k)(end);end
disp(k)

คล้ายกับคำตอบ MATL หลุยส์ Mendo ของ รับnเป็นอินพุตและเอาต์พุตa (n) (1-indexed)

ลองออนไลน์!


อ็อกเทฟ 60 ไบต์

k=2;for i=2:input('')k*=2;while~isprime(--k)
end
end
disp(k)

รับnเป็นอินพุตและเอาต์พุตa (n) (1-indexed)

ลองออนไลน์!




6

05AB1E , 14 7 6 ไบต์

$F·.ØØ

ลองออนไลน์!


คำตอบที่มีการจัดทำดัชนี 1 (เว้นแต่ 0 ควรจะส่งออก 1) คำอธิบาย:

$       # Push 1 and input (n)...
 F      # n-times do... 
  ·     # Double the current prime (first iteration is 1*2=2).
   .ØØ  # Find prime slightly less than double the current prime.

1 การจัดทำดัชนีเนื่องจากซ้ำทั้งหมดมี 'ดัมมี่' n=1ย้ำกับ


Fx.ØØเพื่อให้ใกล้เคียง ... n > 2ธิสำหรับสิ่งที่เหนือ
Magic Octopus Urn

1
ฉันมี$F·ÅPθจำนวนไบต์เดียวกัน
Emigna

@Emigna มี? นั่นเหมือน 0% ฮ่าฮ่าเหมือนกัน ฉันหมายถึงในทางเทคนิคเหมือนกัน แต่ไม่ใช่ ยังสามารถโพสต์ได้
Magic Octopus Urn


5

เยลลี่ 6 ไบต์

2ḤÆp$¡

ลองออนไลน์!

0 การจัดทำดัชนี

คำอธิบาย

2ḤÆp$¡  Main link. Input: n
2       Constant 2
    $¡  Repeat n times
 Ḥ        Double
  Æp      Find the largest prime less than the double

แหย่คุณต้องการไบต์อื่นเดี๋ยวนี้) ...
Magic Octopus Urn

@MagicOctopusUrn อินพุต 0 คืน 2, 1 คืน 3 และอื่น ๆ ฉันไม่เห็นปัญหาใด ๆ
ระยะทาง

ฉันหมายถึงคุณต้องบันทึกไบต์ในคำตอบนี้เพื่อชนะเพราะฉันผูกคุณไว้ที่ 6 ไบต์คำตอบของคุณเองก็ใช้ได้
Magic Octopus Urn


5

Stax , 10 ไบต์

ü☼┌τ,æ▒ìn(

เรียกใช้กรณีทดสอบ

ปัญหานี้ได้พบข้อผิดพลาดในการใช้งานของ stax :pซึ่งเป็นคำสั่งที่ได้รับนายกที่ยิ่งใหญ่ที่สุดน้อยกว่าการป้อนข้อมูลของมัน หากทำงานอย่างถูกต้องจะมีวิธีแก้ปัญหา5 6 ไบต์ แต่อนิจจามันไม่ได้และไม่มี ในฐานะผู้สร้างภาษาฉันจะแก้ไข แต่ดูเหมือนว่าราคาถูกในการแก้ไขและใช้งานได้หลังจากที่ปัญหาถูกโพสต์

อย่างไรก็ตามนี่คือตัวแทน ASCII ที่สอดคล้องกันของโปรแกรมดังกล่าวข้างต้น

ODH{|p}{vgs

เป็นการดำเนินการตามคำสั่งปัญหาที่ค่อนข้างตรงไปตรงมา สิ่งเดียวที่น่าสนใจเกี่ยวกับมันคือการใช้gsแบบฟอร์มเครื่องกำเนิดไฟฟ้า เจนเนอเรเตอร์เป็นตระกูลของสิ่งก่อสร้างที่รวมเงื่อนไขเริ่มต้นการแปลงและตัวกรองเพื่อสร้างค่าที่น่าพอใจตั้งแต่หนึ่งค่าขึ้นไป ในกรณีนี้มันใช้แทน:pคำสั่งที่หัก

O               Push integer 1 underneath the input number.
 D              Pop the input and repeat the rest of the program that many times.
  H             Double number.
   {|p}         Predicate block: is prime?
       {vgs     Decrement until the predicate is satisfied.
                Output is implicitly printed.

แก้ไข: นี่คือโซลูชั่น 6 ไบต์ แต่ต้องมีการแก้ไขข้อบกพร่องที่ใช้เฉพาะหลังจากการโพสต์ความท้าทายนี้


ภาษาดี! ฉันได้เพิ่มมันของฉันรายการ Langs แจ้งให้เราทราบหากคุณเห็นสิ่งผิดปกติหรือมีอะไรที่คุณต้องการเพิ่ม
ETHproductions

@ ETHproductions: ดีขอบคุณ! หากคุณไม่เป็นไรคุณสามารถเปลี่ยนล่าม URL เป็นstaxlang.xyz ฉันตัดสินใจที่จะรับโดเมนมา
เรียกซ้ำ

1
ว้าวโดเมนทั้งหมดสำหรับภาษากอล์ฟ? Lucky esolang;) อัปเดต!
ETHproductions

@recursive WOW $ 1.99 สำหรับแต่ละโดเมน xyz หรือไม่ ฉันเข้า
Magic Octopus Urn

4

Python 2 , 63 ไบต์

r=m=k=P=2
while k:
 P*=k;k+=1
 if k>m:print r;m=r*2
 if P%k:r=k

ลองออนไลน์!

พิมพ์ตลอดไป

การใช้ตัวสร้างทฤษฎีบทของทฤษฎีบทของวิลสันแม้ว่าการสร้างช่วงเวลาล่วงหน้านั้นเป็นปัญหาสำหรับปัญหานี้ แทร็คสำคัญที่ใหญ่ที่สุดในปัจจุบันเห็นและขอบเขตการเสแสร้งrm

สองไบต์จะถูกบันทึกไว้ทำP*=kมากกว่าP*=k*kปกติตามปกติเอฟเฟกต์เพียงอย่างเดียวคืออ้างว่า 4 เป็นไพร์มและลำดับของการเพิ่มเป็นสองเท่านั้นหายไป


4

CJam (15 ไบต์)

2{2*{mp},W=}qi*

สาธิตออนไลน์ โปรดทราบว่านี่เป็นดัชนี 0


วิธีที่มีประสิทธิภาพมากขึ้นคือการค้นหาย้อนหลัง แต่ต้องใช้อักขระหนึ่งตัวมากกว่าเพราะไม่สามารถใช้งานได้,(ช่วง):

2{2*,W%{mp}=}qi*

4

Japté , 16 14 13 12 ไบต์

โซลูชันสองรายการสำหรับราคาหนึ่งทั้งสองมีการจัดทำดัชนี


ระยะที่ N

F.g()สุดท้ายเป็นความท้าทายที่ฉันจะเขียนวิธีการแก้ปัญหาการทำงานสำหรับการใช้

_ôZ fj Ì}g°U

ลองมัน

                 :Implicit input of integer U
_       }g       :Starting with the array [0,1] take the last element (Z),
                 :pass it through the following function
                 :and push the returned value to the array
 ôZ              :  Range [Z,Z+Z]
    fj           :  Filter primes
       Ì         :  Get the last item
          °U     :Repeat that process U+1 times and return the last element in the array

เงื่อนไข N แรก

ÆV=ôV fj ̪2

ลองมัน

                 :Implicit input of integer U
                 :Also makes use of variable V, which defaults to 0
Æ                :Create range [0,U) and pass each through a function
  ôV             :  Range [V,V+V]
     fj          :  Filter primes
        Ì        :  Get the last item
         ª2      :  Logical OR with 2, because the above will return undefined on the first iteration
 V=              :  Assign the result of the above to V




2

Python 2 , 68 ไบต์

พิมพ์ลำดับไปเรื่อย ๆ (คุณต้องคลิก "Run" ครั้งที่สองเพื่อหยุดการกระทำ)

k=2
while 1:
 print k;k+=k
 while any(k%u<1for u in range(2,k)):k-=1

ลองออนไลน์!

Python 3 , 90 ไบต์

ส่งกลับ n THระยะ

f=lambda n,i=1,p=1:n*[0]and p%i*[i]+f(n-1,i+1,p*i*i) 
a=lambda n:n and f(2*a(n-1))[-1]or 1

ลองออนไลน์!


2

C (gcc) , 97 87 86 80 79 ไบต์

  • บันทึกสิบไบต์โดยการใส่ฟังก์ชั่นการตรวจสอบที่ไม่ใช่แบบPดั้งเดิมเข้าไปในลูปหลัก
  • บันทึกไบต์ด้วยการย้ายprintfสาย
  • บันทึกหกไบต์โดยส่งคืนiรายการลำดับ -th (0 ดัชนี) แทนการส่งออกกระแสไม่สิ้นสุด
  • บันทึกขอบคุณไบต์ceilingcat
f(p,r,i,m,e){for(r=2;p--;)for(e=0,i=r+r;e=m=!e;r=i--)for(;i-++m;e=e&&i%m);p=r;}

ลองออนไลน์!


@ceilingcat ขอบคุณ
Jonathan Frech

1

ทูตขนาด 38 ไบต์

{If[_,Last[Series[Prime,2*$[_-1]]],2]}

ลองออนไลน์!

0 ตาม; ส่งกลับnเบอร์แทรนด์นายก

ขณะนี้ยังไม่มี builtin เพื่อหาสิ่งที่ช่วงก่อนหน้า / ถัดไปดังนั้นผมใช้Seriesbuiltin 2*$[_-1]ในการคำนวณจำนวนเฉพาะทั้งหมดขึ้นอยู่กับ นิพจน์สุดท้ายนี้ใช้การเรียกซ้ำโดยนัย (ผูกไว้กับ$) เพื่อกำหนดความสัมพันธ์ที่เกิดซ้ำได้อย่างง่ายดาย เงื่อนไข if ถูกใช้เพื่อกำหนดเงื่อนไขพื้นฐาน



1

เรติน่า 39 ไบต์

.K`_
"$+"{`_
__
+`^(?=(..+)\1+$).

*\`_

ลองออนไลน์! คำอธิบาย:

.K`_

เริ่มต้นด้วย 1

"$+"{`

ทำซ้ำลูปโดยใช้อินพุตเป็นจำนวนลูป

_
__

เพิ่มมูลค่าเป็นสองเท่า

+`^(?=(..+)\1+$).

ค้นหาไพรม์สูงสุดที่น้อยกว่าค่า

*\`_

พิมพ์ออกมา.


0

Ruby , 51 + 7 (-rprime) = 58 ไบต์

->n{x=2
n.times{x=(x..2*x).select(&:prime?)[-1]}
x}

ลองออนไลน์!

Lamba ยอมรับnและส่งคืนnthBertrand prime ซึ่งได้รับการจัดทำดัชนี 0 มีไม่มากที่นี่ แต่ให้ฉันถอดมันต่อไป:

->n{
  x=2                       # With a starting value of 2
  n.times{                  # Repeat n times:
    x=(x..2*x)              # Take the range from x to its double
      .select(&:prime?)[-1] # Filter to only primes, and take the last
  }
  x                         # Return
}

Ruby , 48 + 7 = 55 ไบต์

x=2
loop{puts x
x*=2
loop{(x-=1).prime?&&break}}

ลองออนไลน์!

เพื่อความสนุกนี่คือคำตอบไม่สิ้นสุด มันพิมพ์ตามที่ไปและต้องมีการขัดจังหวะ ขึ้นอยู่กับเมื่อคุณขัดจังหวะคุณอาจเห็นหรือไม่เห็นผลลัพธ์ Ungolfed:

x=2
loop{
  puts x
  x*=2
  loop{
    (x-=1).prime? && break
  }
}

0

APL (ขยาย Dyalog)ขนาด 12 ไบต์

รับอินพุตจากผู้ใช้เป็น N ส่งคืนองค์ประกอบ Nth ของลำดับ (จัดทำดัชนี 0)

42×⍵}⍣⎕⊢2

ลองออนไลน์!

คำอธิบาย:

42×⍵}⍣⎕⊢2  Full program
              Get input from user - call it 'N'
          2  Repeat the left function N times, beginning with 2
    2×⍵        Double the function input
 ¯4           Find the largest prime less than above

0

R , 87 ไบต์

รับnเอาท์พุทa(n)

j=scan();n=2;while(j-1){for(i in (n+1):(2*n)){n=ifelse(any(i%%2:(i-1)<1),n,i)};j=j-1};n

ลองออนไลน์!

ฉันยังคงทำงานกับ "เมื่อรับ n เอาต์พุต a (1), a (2) ... a (n)" ฉันคิดว่าฉันสามารถแก้ไขรหัสนี้ได้เล็กน้อย แต่ดูเหมือนว่าจะยากกว่านั้น

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