Số nguyên tố của Bertrand


24

Định đề của Bertrand nói rằng với mọi số nguyên n 1, có ít nhất một số nguyên tố p sao cho n <p 2n . Để xác minh định lý này cho n <4000, chúng tôi không phải kiểm tra 4000 trường hợp: Thủ thuật Landau nói rằng nó đủ để kiểm tra xem

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

đều là số nguyên tố Bởi vì mỗi số này nhỏ hơn hai lần so với tiền thân của nó, mỗi khoảng {y: n <y 2n} chứa ít nhất một trong các số nguyên tố đó.

Dãy số này là các số nguyên tố Bertrand (OEIS A006992) và chúng được định nghĩa như sau:

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

Thử thách

Thực hiện trình tự này. Bạn có thể viết

  • một hàm hoặc chương trình đã cho một số n trả về a (n) (0 hoặc 1 được lập chỉ mục),
  • một hàm hoặc chương trình đã cho một số n trả về các mục n (hoặc n-1 hoặc n + 1 ) đầu tiên của chuỗi này,
  • một danh sách vô hạn hoặc luồng hoặc trình tạo hoặc tương đương trong ngôn ngữ của bạn.

Câu trả lời:


8

Octave , 32 byte

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

Tiếp tục in các giá trị vô thời hạn (mỗi giá trị được đi trước k =).

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


Octave , 42 byte

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

Lấy n làm đầu vào và xuất ra n giá trị đầu tiên (mỗi giá trị được đặt trước k =).

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


Octave , 51 byte

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

Tương tự như câu trả lời MATL của Luis Mendo . Lấy n làm đầu vào và đầu ra a (n) (1 chỉ mục).

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


Octave , 60 byte

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

Lấy n làm đầu vào và đầu ra a (n) (1 chỉ mục).

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


7

J , 11 byte

_4&(p:+:)2:

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

Chỉ số 0.

_4&(p:+:)2:  Input: integer n
         2:  Constant 2
_4&(    )    Repeat n times
      +:       Double
_4  p:         Find the largest prime less than the double


6

05AB1E , 14 7 6 byte

$F·.ØØ

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


Câu trả lời 1 chỉ mục (trừ khi 0 được cho là đầu ra 1), giải thích:

$       # 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.

Nó được lập chỉ mục 1 vì tất cả các lần lặp đều có lần lặp 'giả' n=1.


Fx.ØØrất gần ... Hoạt động cho bất cứ điều gì ở trên n > 2.
Bạch tuộc ma thuật Urn

1
Tôi đã có $F·ÅPθcùng số byte.
Emigna

@Emigna đã có? Giống như 0% giống nhau haha. Ý tôi là, về mặt kỹ thuật giống nhau, nhưng không. Vẫn có thể đăng nó; P.
Bạch tuộc ma thuật Urn


5

Thạch , 6 byte

2ḤÆp$¡

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

Chỉ số 0.

Giải trình

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

chọc bạn cần một byte khác ngay bây giờ;) ...
Magic Octopus Urn

@MagicOctopusUrn Một đầu vào 0 trả về 2, 1 trả về 3, v.v. Tôi không thấy bất kỳ vấn đề.
dặm

Tôi có nghĩa là bạn cần lưu một byte vào câu trả lời này để giành chiến thắng vì tôi đã buộc bạn ở mức 6 byte, bản thân câu trả lời của bạn vẫn ổn.
Bạch tuộc ma thuật Urn

5

MATL , 9 byte

1i:"EZq0)

Đầu vào n , đầu ra a ( n ), 1 chỉ mục.

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

Giải trình

1       % Push 1
i       % Push input n
:"      % Do the following that many times
  E     %   Multiply by 2
  Zq    %   Primes up to that
  0)    %   Get last entry
        % End (implicit). Display (implicit)

5

Stax , 10 byte

ü☼┌τ,æ▒ìn(

Chạy thử trường hợp

Vấn đề này đã bộc lộ một lỗi trong quá trình triển khai của stax :p, đây là một hướng dẫn có số nguyên tố lớn nhất ít hơn đầu vào của nó. Nếu nó hoạt động chính xác, sẽ có một giải pháp 5 6 byte. Nhưng than ôi, nó không, và không có. Là người tạo ra ngôn ngữ, tôi sẽ sửa nó, nhưng có vẻ như nó rẻ để sửa và sử dụng nó sau khi vấn đề được đăng.

Dù sao, đây là đại diện ascii tương ứng của chương trình trên.

ODH{|p}{vgs

Đó là một triển khai tương đối đơn giản của báo cáo vấn đề. Điều duy nhất có thể thú vị về nó là việc sử dụng gsmẫu máy phát điện. Máy phát điện là một nhóm các công trình kết hợp một điều kiện ban đầu, một biến đổi và một bộ lọc, để tạo ra một hoặc nhiều giá trị thỏa mãn. Trong trường hợp này, nó được sử dụng thay cho :phướng dẫn bị hỏng .

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.

Chỉnh sửa: đây là giải pháp 6 byte, nhưng nó yêu cầu sửa lỗi chỉ được áp dụng sau khi thử thách này được đăng.


Ngôn ngữ tốt đẹp! Tôi đã thêm nó vào danh sách các gậy đánh gôn . Hãy cho tôi biết nếu bạn thấy bất cứ điều gì sai, hoặc nếu có bất cứ điều gì khác mà bạn muốn thêm.
Sản phẩm ETH

@ETHproductions: Đẹp, cảm ơn! Nếu bạn không phiền, bạn có thể thay đổi url trình thông dịch thành staxlang.xyz tôi đã quyết định lấy một tên miền cho nó.
đệ quy

1
Wow, cả một miền chỉ dành cho một ngôn ngữ chơi golf? May mắn esolang;) Cập nhật!
Sản phẩm ETH

@recursive WOW, $ 1.99 cho mỗi tên miền xyz? Tôi đang ở đây
Bạch tuộc ma thuật Urn

4

Python 2 , 63 byte

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

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

In mãi mãi.

Sử dụng trình tạo định lý Định lý Wilson của Wilson mặc dù việc tạo các số nguyên tố chuyển tiếp là khó khăn cho vấn đề này. Theo dõi số nguyên tố lớn nhất hiện tại nhìn thấy rvà ranh giới nhân đôi m.

Hai byte được lưu làm P*=k thay vì P*=k*knhư bình thường, vì hiệu ứng duy nhất là tuyên bố rằng 4 là số nguyên tố và chuỗi nhân đôi bỏ lỡ nó.


4

CJam (15 byte)

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

Bản demo trực tuyến . Lưu ý rằng đây là 0 chỉ mục.


Một cách tiếp cận hiệu quả hơn sẽ là tìm kiếm ngược, nhưng điều này đòi hỏi nhiều hơn một ký tự vì nó không thể sử dụng ẩn ,(phạm vi):

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

4

Japt , 16 14 13 12 byte

Hai giải pháp cho giá của một, cả hai chỉ số.


Học kỳ thứ n

Cuối cùng, một thách thức tôi có thể viết một giải pháp làm việc cho việc sử dụng F.g().

_ôZ fj Ì}g°U

Thử nó

                 :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

Điều khoản N đầu tiên

ÆV=ôV fj ̪2

Thử nó

                 :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

C (gcc) , 97 87 86 80 79 byte

  • Đã lưu mười byte bằng cách đặt một hàm kiểm tra không nguyên thủy Pvào vòng lặp chính.
  • Đã lưu một byte bằng cách di chuyển printfcuộc gọi.
  • Đã lưu sáu byte bằng cách trả về mục ithứ tự -th (0-index) thay vì xuất ra một luồng không bao giờ kết thúc.
  • Lưu một byte nhờ trần .
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;}

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


@ceilingcat Cảm ơn bạn.
Jonathan Frech

1

Tùy viên , 38 byte

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

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

Dựa trên 0; trả về số nnguyên tố Bertrand.

Hiện tại không có nội dung nào để tìm các số nguyên tố trước / tiếp theo, vì vậy tôi sử dụng Seriesnội dung để tính tất cả các số nguyên tố lên đến 2*$[_-1]. Biểu thức cuối cùng này sử dụng đệ quy ngầm (ràng buộc $) để dễ dàng xác định mối quan hệ lặp lại. Điều kiện if được sử dụng để xác định điều kiện cơ sở.



1

Võng mạc , 39 byte

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

*\`_

Hãy thử trực tuyến! Giải trình:

.K`_

Bắt đầu với 1.

"$+"{`

Lặp lại vòng lặp bằng cách sử dụng đầu vào là số vòng lặp.

_
__

Nhân đôi giá trị.

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

Tìm số nguyên tố cao nhất nhỏ hơn giá trị.

*\`_

In nó ra.


0

Ruby , 51 + 7 (-rprime) = 58 byte

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

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

Một lamba chấp nhận nvà trả lại nththủ tướng Bertrand, 0 chỉ số. Không có nhiều ở đây, nhưng hãy để tôi không biết điều đó:

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

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

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

Để giải trí, đây là một giải pháp vòng lặp vô hạn. Nó in khi nó đi, và yêu cầu một ngắt. Tùy thuộc vào chính xác khi bạn ngắt, bạn có thể thấy hoặc không thấy đầu ra. Ung dung:

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

0

APL (Dyalog mở rộng) , 12 byte

Lấy đầu vào từ người dùng là N, trả về phần tử thứ N của chuỗi (được lập chỉ mục 0).

42×⍵}⍣⎕⊢2

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

Giải trình:

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 byte

Cho nđầu raa(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

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

Tôi vẫn đang làm việc với "Cho n đầu ra a (1), a (2) ... a (n)". Tôi nghĩ rằng tôi chỉ có thể sửa đổi mã này một chút, nhưng có vẻ khó khăn hơn thế.

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.