Tìm các số nguyên tố đệ quy


17

Các số nguyên tố đệ quy là một chuỗi các số nguyên tố sao cho

p(1) = 2
p(n) = the p(n-1)th prime

Dưới đây là một ví dụ về cách người ta có thể tính Prime Prime đệ quy thứ 4.

p(4) = the p(3)th prime
p(3) = the p(2)th prime
p(2) = the p(1)th prime
p(1) = 2
p(2) = the 2nd prime
p(2) = 3
p(3) = the 3rd prime
p(3) = 5
p(4) = the 5th prime
p(4) = 11

Bạn nên viết một chương trình hoặc hàm mà khi được cho n, sẽ xuất ra Prime đệ quy thứ n.

Bạn có thể chọn sử dụng lập chỉ mục dựa trên 0 nếu bạn muốn trong trường hợp nào bạn phải chỉ ra như vậy trong câu trả lời của mình.

Đây là vì vậy mục tiêu là giảm thiểu số byte của bạn.


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

1 -> 2
2 -> 3
3 -> 5
4 -> 11
5 -> 31
6 -> 127
7 -> 709
8 -> 5381
9 -> 52711

Mục nhập OEIS có liên quan: OEIS A007097

Câu trả lời:


13

Ốc đảo , 3 byte

Chương trình được lập chỉ mục 0 . Mã số:

<q2

Sử dụng công thức: a (n) = nth_prime (a (n-1) - 1) , với trường hợp cơ sở a (0) = 2 .

Mã giải thích:

  2   = a(0)

<     # Decrement a(n - 1) to get a(n - 1) - 1
 q    # prime(a(n - 1) - 1)

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



8

Toán học, 16 byte

Nest[Prime,1,#]&

Chức năng ẩn danh. Lấy một số làm đầu vào và trả về một số làm đầu ra.


5

Thạch , 5 4 byte

1 byte nhờ @Dennis.

1ÆN¡

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

Giải trình

1        Starting with n = 1,
 ÆN      replace n by the nth prime
   ¡     (input) times.

Bạn không cần .
Dennis

@Dennis Vì vậy, ¡chỉ chấp nhận nilad là sự lặp lại và mặc định cho đầu vào nếu không tìm thấy?
PurkkaKoodari

<f><n>¡vui vẻ chấp nhận các nguyên tử monadic hoặc dyadic cho <n>. Tuy nhiên, nếu <f>là một nilad, một cái gì đó phải sai, vì vậy nó được phân tích cú pháp <f>¡thay vào đó và lấy đầu vào cuối cùng (đối số dòng lệnh cuối cùng, STDIN không có) <n>thay vào đó.
Dennis

5

JavaScript (ES6), 71 byte

p=(n,x=1)=>n?p(n-1,(N=y=>x?N(++y,x-=(P=z=>y%--z?P(z):z==1)(y)):y)(1)):x

Ungolfed, bạn có ba chức năng đệ quy riêng biệt:

P=(n,x=n)=>n%--x?P(n,x):x==1
N=(n,x=1)=>n?N(n-P(++x),x):x
p=(n,x=1)=>n?p(n-1,N(x)):x
  • Pxác định xem có phải nlà số nguyên tố hay không;
  • Ntìm số nnguyên tố thứ;
  • pđệ quy chạy Ntrên 1 nthời gian đầu vào .

4

MATL , 6 byte

1i:"Yq

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

Giải trình

1      % Push 1
i      % Input n
:      % Range [1 2 ... N]
"      % For each (that is, do the following N times)
  Yq   %   k-th prime, where k is the input
       % End for each (implicit)
       % Display stack (implicit)

3

R, 98 93 byte

5 byte nhờ @smci

Đây là một giải pháp đệ quy không hiệu quả khủng khiếp:

f<-function(m,n=1){j<-1;for(i in 1:n){j<-numbers::nextPrime(j)};a<-ifelse(m==0,j,f(m-1,j));a}

Đầu ra thử nghiệm:

f(6)
[1] 127

f(10)        ### takes almost a minute... YIKES!!!
[1] 648391

1
Bạn có thể cạo râu một chút bằng cách thực hiệna<-ifelse(m==0,j,f(m-1,j))
smci


@Giuseppe, bạn nên đăng nó như một câu trả lời ... đó là một sự giảm đáng kể !!! Tôi chưa bao giờ thấy ifđược sử dụng như vậy trước đây ... khá tuyệt !!
Joseph Wood

@JosephWood nah, đó chỉ là những sân golf tiêu chuẩn; thuật toán cốt lõi không thay đổi. Tôi khuyên bạn nên đọc các mẹo chơi golf trong R để biết một số mẹo chơi golf thú vị hơn (mặc dù thông thường chúng là kiểu R khủng khiếp).
Giuseppe

2

Bash + tiện ích chung, 55

Vì chúng tôi đang thực hiện các số nguyên tố đệ quy, đây là một câu trả lời đệ quy:

((SHLVL-2<$1))&&primes 2|sed -n "`$0 $1`{p;q}"||echo 1

Vì việc đếm mức đệ quy được dựa trên $SHLVLbiến tích hợp, nên câu trả lời có thể bị tắt nếu bạn đã ở một vài mức độ sâu. Đây có lẽ là lý do tại sao câu trả lời này không hoạt động trên TIO.


Nếu điều đó không tốt, thì đây là một câu trả lời thông thường hơn:

Bash + tiện ích chung, 58

for((i=$1;i--;));{
n=`primes 2|sed -n "$n{p;q}"`
}
echo $n

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


1

Haskell , 58 byte

1 chỉ mục

f 1=2;f n=[x|x<-[2..],all((>)2.gcd x)[2..x-1]]!!(f(n-1)-1)

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

Giải trình:

Sử dụng thủ thuật truy cập danh sách chính được lập chỉ mục 0 giống như câu trả lời của Adnan .
Về cơ bản, thẳng lên theo các đặc điểm kỹ thuật khác.

f 1=2; -- base case
f n= -- main case
    [x|x<-[2..],all((>)2.gcd x)[2..x-1]]             -- list of all primes
    [x|x<-[2..],                                     -- consider all numbers
                               [2..x-1]              -- consider all smaller numbers
                all((>)2.gcd x)                      -- is coprime with them?
                    (>)2.                            -- 2 is greater than
                         gcd x                       -- gcd(x,lambda input)
                                        !!(f(n-1)-1) -- access the
                                                     -- f(n-1)-th 1-indexed prime


0

Kỳ quan , 23 byte

p\.{1\2@:^(- p -#0 1)1P

1 chỉ mục. Sử dụng:

p\.{1\2@:^(- p -#0 1)1P}; p 3

Giải trình

p\.{                #. Pattern matching syntax
  1\2               #. Base case p(1)=2
  @:^(- p -#0 1)1P  #. Other cases p(n)=nthprime(p(n-1)-1)
                    #. nthprime is 0-indexed
}                   #. Trailing bracket is optional in this case
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.