Chương trình sẽ tìm số nguyên tố tiếp theo


15

Giới thiệu:


Bạn vô tình làm hỏng dòng thời gian với một thiết bị bạn tạo ra để giải trí, hóa ra đó là một cỗ máy thời gian. Kết quả là, bạn đã bị đẩy đến tương lai xa. Bạn nhận ra rằng điện toán, sức mạnh xử lý và máy tính nói chung đã được phát triển bởi một lượng lớn, một lượng vô hạn là chính xác . Vì vậy, bạn lấy cho mình một máy tính với bộ nhớ vô hạn và sức mạnh xử lý. Bạn không biết làm thế nào nó có thể có bộ nhớ vô hạn và khả năng xử lý vô hạn, nhưng bạn chỉ chấp nhận nó và trở về hiện tại.

Thử thách:


Bạn nghe nói rằng người phát hiện ra số tiền lớn nhất hiện tại 2^74,207,281 − 1đã được trả 100.000 đô la. Bạn quyết định thực hiện một chương trình tìm ra số nguyên tố tiếp theo, vì bạn muốn lấy lại số tiền bạn đã chi cho máy tính. Bạn tạo một số lấy đầu vào của một số và tìm số nguyên tố tiếp theo, bằng cách bruteforcing hoặc bất kỳ phương thức nào khác.

Làm rõ: Bạn có một máy giả định với bộ nhớ và khả năng xử lý vô hạn. Chương trình của bạn KHÔNG được giới hạn (ví dụ: int của C # có thể lưu trữ từ -2,147,483,648đến 2,147,483,647), chương trình của bạn phải có khả năng lưu trữ và hoạt động với bất kỳ số lượng nào. Bạn có tài nguyên vô hạn, vì vậy bạn không nên quan tâm nếu bạn sẽ hết bộ nhớ nếu bạn cho phép điều đó.

Ví dụ I / O:
Đầu vào: Số nguyên tố được phát hiện lớn nhất hiện tại với 22.338.618 chữ số.
Đầu ra: Chính xác là số nguyên tố tiếp theo

Rõ ràng, bạn không phải chứng minh rằng nó hoạt động, vì sẽ mất rất nhiều thời gian để tính toán trong một máy vật lý. Nhưng nếu bạn chuyển chương trình của mình sang một máy giả định có sức mạnh / bộ nhớ xử lý vô hạn, nó sẽ tính toán ngay lập tức.


Tìm số nguyên tố tiếp theo và kiểm tra xem một số có phải là số nguyên tố không, là hai điều hoàn toàn khác nhau


1
Nó có phải đặc biệt là thủ tướng tiếp theo ? Rất nhiều thuật toán tìm kiếm chính cho các số nguyên tố lớn chỉ tìm kiếm một số loại số nhất định và do đó đôi khi bỏ lỡ các số nguyên tố ...
FlipTack

10
Tôi nghĩ bạn nên thêm một số trường hợp thử nghiệm nghiêm trọng.
FlipTack

3
" Chương trình của bạn KHÔNG bị giới hạn " nhưng trên cơ sở ví dụ tôi nghi ngờ rằng mọi ngôn ngữ trong sự tồn tại đều được tính là hạn chế nếu không phù hợp với lý do nào khác ngoài việc sử dụng một loại hữu hạn để giải quyết bộ nhớ.
Peter Taylor


2
@ mbomb007 tại sao? Tất cả các câu trả lời ngoại trừ các câu hỏi dựng sẵn được nhìn thấy chỉ cần thêm một trình bao bọc bổ sung.
Đăng Rock Garf Hunter

Câu trả lời:



8

Python 3 , 45 byte

f=lambda n,k=1,m=1:m%k*k>n or-~f(n,k+1,m*k*k)

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


3
Tôi tin rằng đây là Định lý của Wilson được ngụy trang. kbằng với kết quả cuối cùng, mchứa (k-1)!^2. Vì (k-1)! = -1 mod k chỉ giữ khi k là số nguyên tố, ta có (k-1)! (K-1)! = 1 mod k, mà khi nhân với k sẽ là k chính nó. Bạn tính toán hình vuông để thoát khỏi ngoại lệ duy nhất của (k-1)! = 0 mod k cho k tổng hợp, xảy ra với k = 4. Đúng không?
orlp

Vâng, đó là chính xác.
Dennis

Điều này ném RecursionError: maximum recursion depth exceeded in comparisonchof(1000)
ovs

5
@ovs Câu hỏi nói rằng chúng ta có bộ nhớ vô hạn. Do đó, chúng ta có thể giả sử giới hạn độ sâu đệ quy cao vô hạn, và do đó không phải lo lắng RecursionError.
FlipTack

6

Python 2, 78 77 76 74 byte

def f(n):
 while 1:
    n+=1
    if[i for i in range(1,n)if n%i<1]==[1]:return n

-1 byte nhờ @KritixiLithos
-1 byte nhờ @FlipTack
-2 byte nhờ @ElPedro


n%i<1ngắn hơnn%i==0
Kritixi Lithos

Bạn không cần khoảng trắng sau đó if.
FlipTack

Tôi nghĩ ý bạn là<1
Jonathan Allan

Tôi nghĩ rằng bạn có thể sử dụng một tab thay vì 2 khoảng trắng cho các mức thụt cấp thứ hai nhưng tôi không thể kiểm tra tại thời điểm này.
ElPedro

1
@ElPedro đã đúng. Bạn có thể thay đổi 2 khoảng trắng ở phía trước n+=1ifthành các tab và lưu 2 byte



4

Bash + coreutils, 52 byte

for((n=$1,n++;`factor $n|wc -w`-2;n++)){ :;};echo $n

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

Tài liệu về bash và hệ số không chỉ định giá trị số nguyên tối đa mà chúng có thể xử lý (mặc dù, trong thực tế, mỗi lần thực hiện có giá trị số nguyên tối đa). Có lẽ, trong GNU của tương lai trên các máy lớn vô hạn của bạn, bash và hệ số sẽ có số nguyên kích thước không giới hạn.


Trên thực tế, các tài liệu chỉ định cho yếu tố rằng nếu được xây dựng mà không có gnu mp thì chỉ có độ chính xác duy nhất được hỗ trợ.
Dani_l

1
@Dani_l Chà, mục nhập của bash chỉ nói: "Đánh giá được thực hiện trong các số nguyên có chiều rộng cố định mà không kiểm tra tràn, mặc dù chia cho 0 bị kẹt và bị gắn cờ là lỗi." Nó không chỉ định chiều rộng. (Như tôi nhớ lại, việc triển khai bash trên máy của tôi sử dụng số nguyên có chữ ký 64 bit, nhưng tôi không thể kiểm tra ngay bây giờ.) Về yếu tố, chắc chắn nó sẽ được cập nhật: các máy tính tương lai của OP có tài nguyên vô hạn sẽ có yếu tố được biên dịch với gnu_up để có độ chính xác không giới hạn :).
Spector Mitchell

3

Tối đa, 10 byte

next_prime

Một hàm trả về số nguyên tố nhỏ nhất lớn hơn đối số của nó.



3

Python với sympy, 28 byte

import sympy
sympy.nextprime

sympy.nextprimelà một chức năng thực hiện những gì nó nói trên tin. Hoạt động cho tất cả các phao.

thay thế


Python, 66 59 byte

-4 byte nhờ Lynn (sử dụng -~)
-3 byte nhờ FlipTack (sử dụng andor, cho phép ...==1chuyển sang ...-1điều kiện.)

f=lambda n:sum(-~n%-~i<1for i in range(n))-1and f(n+1)or-~n

thay thế

Một hàm đệ quy đếm ngược ncho đến khi tìm thấy một số nguyên tố bằng cách kiểm tra rằng chỉ có một số tồn tại để n-1chia nó (tức là 1). Hoạt động cho tất cả các số nguyên, gây ra lỗi cho số float.

Hoạt động trên 2.7.8 và 3.5.2, không hoạt động trên 3.3.3 (lỗi cú pháp do thiếu khoảng cách giữa ==1else)


(n+1)%(i+1)-~n%-~i, tôi nghĩ vậy
Lynn

Đó là, cảm ơn ... Tôi đã cố gắng thực hiện một bài ngắn hơn bằng định lý Wilson.
Jonathan Allan

Có ngắn mạch and/ orlàm việc, chẳng hạn như f=lambda n:sum(-~n%-~i<1for i in range(n))==1and-~n or f(n+1)?
FlipTack

Trên thực tế, điều đó ^ có thể được chơi thànhf=lambda n:sum(-~n%-~i<1for i in range(n))-1and f(n+1)or-~n
FlipTack

@FlipTack Ban đầu tôi đã tránh chúng để nó có thể vượt qua 0, nhưng nó sẽ hoạt động - đó là tiết kiệm ba byte!
Jonathan Allan

2

Python, 114 83 byte

def g(b):
 while 1:
  b+=1
  for i in range(2,b):
   if b%i<1:break
  else:return b

Nếu không có nội dung, nếu có.

-30 bằng cách xóa khoảng trắng và -1 bằng cách thay đổi b%i==0thànhb%i<1


3
Điều này sẽ không tìm thấy số nguyên tố tiếp theo nếu bạn đặt vào1
FlipTack

Bây giờ nó giả định rằng b> 2
sagiksp

Bạn không thể tạo ra các quy tắc của riêng mình ... bạn cần tuân theo các đặc điểm kỹ thuật thách thức. Không nơi nào nói rằng bạn có thể giả sử giới hạn của đầu vào.
FlipTack

Ngay cả với giả định đó, điều này thất bại cho tất cả các đầu vào có giá trị.
FlipTack

Tôi là một thằng ngốc, tôi đọc sai nó. Đã sửa nó. @FlipTack
sagiksp

2

Perl 6 , 25 byte

{first *.is-prime,$_^..*}

Làm thế nào nó hoạt động

{                       }  # A lambda.
                  $_ ..*   # Range from the lambda argument to infinity,
                    ^      # not including the start point.
 first           ,         # Iterate the range and return the first number which
       *.is-prime          # is prime.

Perl 6 , 32 byte

{first {all $_ X%2..^$_},$_^..*}

Với thử nghiệm nguyên thủy tùy chỉnh không hiệu quả.

Làm thế nào nó hoạt động

Cấu trúc bên ngoài giống như trên, nhưng vị từ được truyền tới first(để quyết định xem một số đã cho có phải là số nguyên tố hay không), bây giờ là:

{               }  # A lambda.
     $_            # Lambda argument (number to be tested).
          2..^$_   # Range from 2 to the argument, excluding the end-point.
        X          # Cartesian product of the two,
         %         # with the modulo operator applied to each pair.
 all               # Return True if all the modulo results are truthy (i.e. non-0).

Tôi đã hy vọng để có được một cái gì đó ngắn hơn với Perl 5 nhưng thật khó để đánh bại một built-in .is-prime;)
Zaid

2

Pyke, 8 7 byte

~p#Q>)h

Hãy thử nó ở đây!

4 byte, không lọc

(Thông dịch viên được cập nhật kể từ khi thử thách được đăng)

~p<h

Hãy thử nó ở đây!

~p   -   primes_iterator()
  <  -  filter(^, input() < i)
   h - ^[0]

Tại sao không phải là thứ hai? Tôi không hiểu đủ.
theonlygusti

@theonlygusti: Thông thường, lý do chính đáng duy nhất để đánh dấu một bài nộp không được soạn thảo ở đây (trái ngược với việc không gửi nó) là vì bạn đã sửa một lỗi hoặc thêm một tính năng trong ngôn ngữ mà chương trình viết vào và điều đó giúp bạn vượt qua thử thách . (Tôi có xu hướng viết nó dưới dạng "thách thức ngôn ngữ hậu kỳ" để rõ ràng hơn.)

@theonlygusti làm rõ
Màu xanh

1

J, 4 byte

4&p:

Đơn giản được xây dựng cho thủ tướng tiếp theo.


1

05AB1E , 16 13 byte (Emigna @ -3 byte)

2•7£?ÿ•o[>Dp#

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

2•7£?ÿ•o        # Push current largest prime.
        [   #    # Until true..
         >Dp    # Increment by 1, store, check primality.
                # After infinite loop, implicitly return next prime.

Sẽ không [>Dp#làm việc?
Emigna

Bạn vẫn có thể cắt thêm 8 byte vì chương trình sẽ lấy một số nguyên tố làm đầu vào và đầu ra là số nguyên tố tiếp theo.
Emigna

@Emigna thì câu hỏi này là trùng lặp.
Bạch tuộc ma thuật Urn

Đó là có thể có.
Emigna

1

Perl, 30 byte (29 +1 cho -p):

(1x++$_)=~/^(11+?)\1+$/&&redo

Sử dụng

Nhập số sau khi nhấn return (đầu vào 12345 trong ví dụ bên dưới, đầu ra 12347):

$ perl -pe '(1x++$_)=~/^(11+?)\1+$/&&redo'
12345
12347

Làm thế nào nó hoạt động

  • Xác định một chuỗi 1có độ dài ++$_, $_ban đầu là giá trị đầu vào
  • Regex kiểm tra xem chuỗi của 1s có độ dài không chính không (giải thích ở đây ).
  • Nếu độ dài chuỗi không phải là số nguyên tố, kiểm tra được đánh giá lại cho số nguyên tiếp theo ( ++$_)
  • Nếu độ dài chuỗi là số nguyên tố, whilevòng lặp ẩn sẽ thoát và -pin giá trị của$_
  • Lưu ý: không cần xử lý trường hợp cạnh "1"có độ dài 1 vì nó sẽ không bao giờ được sử dụng cho các giá trị nhỏ hơn 1, theo thông số kỹ thuật.

1

Java 7, 373 343 334 303 268 byte

import java.math.*;class M{public static void main(String[]a){BigInteger n,i,o,r=new BigInteger(a[0]);for(r=r.add(o=r.ONE);;r=r.add(o)){for(n=r,i=o.add(o);i.compareTo(n)<0;n=n.mod(i).compareTo(o)<0?r.ZERO:n,i=i.add(o));if(n.compareTo(o)>0)break;}System.out.print(r);}}

-75 byte cảm ơn @Poke

Ung dung:

import java.math.*;
class M{
  public static void main(String[] a){
    BigInteger n,
               i,
               o,
               r = new BigInteger(a[0]);
    for(r = r.add(o = r.ONE); ; r = r.add(o)){
      for(n = r, i = o.add(o); i.compareTo(n) < 0; n = n.mod(i).compareTo(o)< 0
                                                        ? r.ZERO
                                                        : n,
                                                   i = i.add(o));
      if(n.compareTo(o) > 0){
        break;
      }
    }
    System.out.print(r);
  }
}

Hãy thử nó ở đây.

Một số ví dụ đầu vào / đầu ra:

7 -> 11
1609 -> 1613
104723 -> 104729

@Poke Tôi đã đánh gôn thêm 31 byte bằng cách thêm staticvào trường và phương thức p, nhưng xóa tham số của phương thức cp.
Kevin Cruijssen

0

QBIC , 34 byte

:{a=a+1[2,a/2|~a%b=0|b=a]]~a<b|_Xa

Dựa trên thử nghiệm nguyên thủy QBIC này . Giải trình:

:{a=a+1    Read 'a' from the command line, start an infinite loop 
           and at the start of each iteration increment 'a'
[2,a/2|    FOR b = 2, b <= a/2, b++
~a%b=0|    IF b cleanly divides a, we're no prime
b=a]]      so, break out of the FOR loop ( ]] = End if, NEXT )
~a<b|      If the FOR loop completed without breaking
_Xa        then quit, printing the currently tested (prime) number
           The second IF and the DO-loop are implicitly closed by QBIC.

0

JavaScript (ES7), 61 byte

a=>{for(;a++;){for(c=0,b=2;b<a;b++)a%b||c++;if(!c)return a;}}

Sử dụng

f=a=>{for(;a++;){for(c=0,b=2;b<a;b++)a%b||c++;if(!c)return a;}}
f(2)

Đầu ra

3

Đẹp, nhưng tôi không nghĩ rằng nó sẽ hoạt động, vì chính JavaScript (không phải máy tính) sẽ mất độ chính xác chỉ sau 2 ^ 53.
Sản phẩm ETH

Bạn nói đúng, nhưng tôi không nghĩ có thể tránh được giới hạn đó, ngay cả khi chúng tôi chia số lượng thành 32 phần trong một mảng, vì cuối cùng, số này cần phải được xử lý toàn bộ. Nếu bạn có một ý tưởng về cách giải quyết điều này, xin vui lòng cho tôi biết.
Lu-ca

1
Có các thư viện JS cho toán học chính xác tùy ý - tôi thậm chí đã xây dựng một thư viện tại một số điểm - vì vậy tôi chắc chắn điều đó là có thể. Tôi sẽ đi lần sau khi tôi ở máy tính của mình
Sản phẩm ETH

Tôi đã làm một số việc, và nó có vẻ thú vị. Tôi cũng sẽ bắn nó.
Lu-ca

0

MATL, 3 byte

_Yq 

Hàm Yqtrả về số nguyên tố tiếp theo của giá trị tuyệt đối của đầu vào nếu đầu vào âm nên chúng tôi ngầm lấy đầu vào, phủ định nó ( _) và tìm số nguyên tố tiếp theo bằng cách sử dụng Yq.

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


0

Haskell, 42 46 43 byte

f n=[i|i<-[n..],all((>0).rem i)[2..i-1]]!!1

mã thông thường cho lực lượng vũ phu.

Tất nhiên điều này tìm thấy số nguyên tố nhỏ nhất tiếp theo sau n. Không có số nguyên tố lớn nhất.

Hoạt động với n > 0 .

chỉnh sửa: Giả sử nlà số nguyên tố. Cảm ơn lời khuyên của @Laikoni trong các bình luận .


Bạn có thể lưu một byte bằng cách thay thế head[...]bằng [...]!!0. Tuy nhiên tôi nghĩ người ta có thể cho rằng đó nlà số nguyên tố, vì vậy bạn có thể sử dụng [n..]thay vì [n+1..]và sau đó lấy phần tử thứ hai với [...]!!1.
Laikoni

0

SimpleTemplate, 132 byte

Thuật toán rất tệ, vì tôi phải tự làm mã để kiểm tra xem một số có phải là số nguyên tố hay không.
Nó đã được chứng minh là khủng khiếp, nhưng hoạt động.

{@setY argv.0}{@setX 1}{@whileX}{@setX}{@set+T Y,-1}{@for_ from2 toT}{@ifY is multiple_}{@incX}{@/}{@/}{@ifX}{@incY}{@/}{@/}{@echoY}

Nhận số làm đối số đầu tiên, xuất kết quả.


Ung dung:

{@set number argv.0}
{@set remainder 1}
{@while remainder}
    {@set remainder 0}
    {@set+ tmp number, -1}
    {@for divisor from 2 to tmp}
        {@if number is multiple divisor}
            {@inc by 1 remainder}
        {@/}
    {@/}
    {@if remainder}
        {@inc by 1 number}
    {@/}
{@/}
{@echo number}

Bất kỳ lời khuyên về làm thế nào để loại bỏ cuối cùng @if?


0

Lua, 876 byte

function I(a)a.s=a.s:gsub("(%d)(9*)$",function(n,k)return tostring(tonumber(n)+1)..("0"):rep(#k)end)end function D(a)a.s=a.s:gsub("(%d)(0*)$",function(n,k)return tostring(tonumber(n)-1)..("9"):rep(#k)end):gsub("^0+(%d)","%1")end function m(a,b)local A=K(a)local B=K(b)while V(0,B)do D(A)D(B)end return A end function M(a,b)local A=K(a)local B=K(b)while V(m(B,1),A)do A=m(A,B)end return A end function l(n)return#n.s end function p(a)local A=K(a)local i=K(2)while V(i,A)do if V(M(A,i),1)then return false end I(i)end return true end function V(b,a)A=K(a)B=K(b)if l(A)>l(B)then return true end if l(B)>l(A)then return false end for i=1,l(A)do c=A.s:sub(i,i)j=B.s:sub(i,i)if c>j then return true elseif c<j then return false end end return false end function K(n)if(type(n)=='table')then return{s=n.s}end return{s=tostring(n)}end P=K(io.read("*n"))repeat I(P)until p(P)print(P.s)

Lua, không giống như một số ngôn ngữ khác, có Kích thước số nguyên tối đa. Khi một số lớn hơn 2 32 , mọi thứ sẽ ngừng hoạt động chính xác và Lua bắt đầu cố gắng ước tính thay vì các giá trị chính xác.

Do đó, tôi đã phải thực hiện một phương pháp lưu trữ số mới, cụ thể là tôi đã lưu trữ chúng dưới dạng chuỗi Base10, vì Lua không có giới hạn kích thước đối với Chuỗi, ngoại trừ kích thước của bộ nhớ.

Tôi cảm thấy câu trả lời này nhiều hơn đối với Linh của câu hỏi, vì nó phải tự thực hiện các số nguyên chính xác tùy ý, cũng như một bài kiểm tra chính.

Giải thích

-- String Math
_num = {}

_num.__index = _num

-- Increase a by one.
-- This works by grabbing ([0-9])999...$ from the string.
-- Then, increases the first digit in that match, and changes all the nines to zero.
-- "13", only the "3" is matched, and it increases to 1.
-- "19", firstly the 1 is turned to a 2, and then the 9 is changed to a 0.
-- "9" however, the 9 is the last digit matched, so it changes to "10"
function _num.inc(a)
    a.str = a.str:gsub("(%d)(9*)$",function(num,nines)
            return tostring(tonumber(num)+1)..("0"):rep(#nines)
        end)
end


-- Decrease a by one
-- Much like inc, however, uses ([0-9])0...$ instead.
-- Decrements ([0-9]) by one and sets 0... to 9...
-- "13" only the "3" is matched, and it decreases by one.
-- "10", the "1" is matched by the ([0-9]), and the 0 is matched by the 0..., which gives 09, which is clipped to 9.
function _num.dec(a)
    a.str = a.str:gsub("(%d)(0*)$",function(num,zeros)
        return tostring(tonumber(num)-1)..("9"):rep(#zeros)
    end)         :gsub("^0+(%d)","%1")
end

-- Adds a and b
-- Makes A and B, so that the original values aren't modified.
-- B is then decremented until it hits 0, and A is incremented.
-- A is then returned.
function _num.__add(a,b)
    local A = str_num(a)
    local B = str_num(b)
    while B > 0 do
        A:inc()
        B:dec()
    end
    return A
end

-- Subs b from a
-- Works just like Addition, yet Dec's A instead of Incs.
function _num.__sub(a,b)
    local A = str_num(a)
    local B = str_num(b)
    while B > 0 do
        A:dec()
        B:dec()
    end
    return A
end

-- A % B
-- Makes A and B from a and b
-- Constantly subtracts B from A until A is less than B
function _num.__mod(a,b)
    local A = str_num(a)
    local B = str_num(b)
    while A >= B do
        A = A - B
    end
    return A
end

-- #a
-- Useful for golfiness
function _num.__len(n)
    return #n.str
end

-- Primacy Testing
-- Generates A from a and i from 2.
-- Whilst i is less than A, i is incremented by one, and if A % i == 0, then it's not a prime, and we return false.
-- Once that finishes, we return true.
function _num.isprime(a)
    local A = str_num(a)
    local i = str_num(2)
    while i < A do
        if A%i < 1 then
            return false
        end
        i:inc()
    end
    return true
end

-- b < a
-- A and B are generated from a and b
-- Fristly, if the length of A and B aren't equal, then that result is output.
-- Otherwise, each character is searched from left to right, the moment they are unequal, the difference is output.
-- If all the characters match, then it's equal. Return false.
function _num.__lt(b,a)
    A=str_num(a)
    B=str_num(b)
    if #A > #B then
        return true
    end
    if #B > #A then
        return false
    end
    for i=1, #A.str do
        As = A.str:sub(i,i)
        Bs = B.str:sub(i,i)
        if As > Bs then
            return true
        elseif As < Bs then
            return false
        end
    end
    return false
end


-- b <= a
-- Same as b < a, but returns true on equality.
function _num.__le(b,a)
    A=str_num(a)
    B=str_num(b)
    if #A > #B then
        return true
    end
    if #B > #A then
        return false
    end
    for i=1, #A.str do
        As = A.str:sub(i,i)
        Bs = B.str:sub(i,i)
        if As > Bs then
            return true
        elseif As < Bs then
            return false
        end
    end
    return true
end

-- Just straight up returns it's string component. Endlessly faster than the int equivalent, mostly because it never is anything _but_ the string form.
function _num.__tostring(a)
    return a.str
end

-- Just set up the metatable...
function str_num(n)
    if(type(n)=='table')then
        return setmetatable({str = n.str}, _num)
    end
    return setmetatable({str = tostring(n)}, _num)
end

-- Generate a new str_num from STDIN
Prime = str_num(io.read("*n"))

-- This is handy, because it will call Prime:inc() atleast once, and stop at the next prime number it finds.
-- Basically, if it weren't for all that overhead of making the math possible, that's all this would be.
repeat
    Prime:inc()
until Prime:isprime()
print(Prime)

Mặc dù ở trên sử dụng Metatables, thay vì chỉ các chức năng thông thường như câu trả lời thực tế, hoạt động nhỏ hơn.


0

Ruby, 28 + 6 = 34 byte

Sử dụng -rprimecờ.

f=->i{i+=1;i.prime??i :f[i]}

Phiên bản không đệ quy cho 31 + 6 = 37 byte:

->i{i+=1;i+=1 while i.prime?;i}

0

Python + primefac , 34 32 byte

Không hoàn toàn ngắn như sử dụng sympy(một câu trả lời khác đã sử dụng điều đó), nhưng nó vẫn khá ngắn và nhanh hơn nhiều .

import primefac as p
p.nextprime

Dùng thử trực tuyến

Đầu vào 2**2000hoàn thành trong một vài giây.


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.