A083569: M nhỏ nhất không xảy ra sớm hơn sao cho m + n là số nguyên tố


26

Xác định chuỗi 1 chỉ mục như sau:

  • A083569(1) = 1
  • A083569(n)trong đó nmột số nguyên lớn hơn 1, là số nguyên m nhỏ nhất không xảy ra trước đó m+nlà số nguyên tố.

Nhiệm vụ của bạn là nhận nvà trả lại A083569(n).

 n  A083569(n)
 1  1
 2  3
 3  2
 4  7
 5  6
 6  5
 7  4
 8  9
 9  8
10 13
11 12
12 11
13 10
14 15
15 14
16 21
17 20
18 19
19 18
20 17

Nhiều testcase có thể được tìm thấy ở đây . Trình tự ban đầu trên OEIS có thể được tìm thấy ở đây .

Đây là . Câu trả lời ngắn nhất trong byte thắng. Tiêu chuẩn áp dụng.


@ Mr.Xcoder "Xác định chuỗi 1 chỉ mục như sau"
Leaky Nun

Câu trả lời:


14

Haskell , 87 86 83 80 74 69 byte

Cảm ơn xnor đã gợi ý một số thay đổi đã lưu 3 byte!

f n=[m|m<-[1..],all((>0).mod(n+m))[2..n+m-1],all((/=m).f)[1..n-1]]!!0

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

Tôi mới biết về Haskell và chơi golf Haskell, phản hồi được đánh giá cao!

Giải trình

Chúng tôi xác định một chức năng f n. Chúng tôi xác định f nlà yếu tố đầu tiên !!0của danh sách:

[m|m<-[1..],all((>0).mod(n+m))[2..n+m-1],all((/=m).f)[1..n-1]]

Bị hỏng đó là:

[m|          # Numbers m
m<-[1..],    # From the integers greater than 0
all          # Forall x
(>0).mod(n+m)# n+m mod x is not zero
[2..n+m-1]   # from the integers from 2 to n+m-1
all          # Forall
((/=m).f)    # when f is applied the result is not m
[1..n-1]     # from the integers from 1 to n-1

3
Chào mừng bạn đến với golf Haskell! Chỉ [2,3..]có thể là [2..], đếm lên 1 là mặc định. Có tích hợp sẵn notElem.
xnor

@xnor Cảm ơn! Cuối cùng tôi đã tìm ra cách tốt hơn để sử dụng notElemnhưng mẹo đầu tiên rất hữu ích và tôi chắc chắn sẽ giữ cái thứ hai đó trong túi sau của mình.
Phù thủy lúa mì

Có vẻ như bản sửa đổi mới của bạn bị f 1sai, nên là 1.
xnor

@xnor Đã sửa, không may với chi phí là 3 byte.
Thuật sĩ lúa mì

6

Thạch , 16 15 byte

Rɓ²R+⁸ÆPTḟḢṭµ/Ṫ

Điều này giả sử A083569 (n) n² (chuỗi dường như đang phát triển tuyến tính).

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

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

Rɓ²R+⁸ÆPTḟḢṭµ/Ṫ  Main link. Argument: n

R                Range; yield [1, ..., n].
 ɓ               Begin a dyadic chain with swapped arguments.
            µ/   Reduce the range by that chain.
                 If we call the chain f, this computes f(2,1), then f(3,f(2,1)),
                 then f(4,f(3,f(2,1)), etc.
                 The left argument is an integer k, the right one an array A.
  ²                Square; yield k².
   R               Range; yield [1, ..., k²].
    +⁸             Add k, yielding [1+k, ..., k²+k].
      ÆP           Test each sum for primality.
        T          Truth; get all indices of 1‘s. This finds all m in [1, ..., k²]
                   such that m+k is prime.
         ḟ         Filterfalse; remove all resulting elements that appear in A.
          Ḣ        Head; extract the first remaining result.
           ṭ       Tack; append the extracted integer to A.
                 This computes the first n elements of the sequence.
              Ṫ  Tail; extract the last, n-th element.

4
Thật vậy, A083569(n)nhiều nhất là nsố nguyên tố lớn hơn nđịnh nghĩa của nó, nhiều nhất là 2nsố nguyên tố thứ nhất, mà ( n≥3ít hơn) so với 4n*log(n)kết quả của Rosser tựa Schoenfeld.
Greg Martin

Mặc dù @GregMartin đã xác minh nó, nhưng đây vẫn là một giả định khá hoang dã để thực hiện ...
Esolanging Fruit

4
@ Challenger5 Tôi thích "phỏng đoán có giáo dục".
Dennis

6

Pyth - 18 17 15 byte

Cảm ơn @isaacg đã tiết kiệm cho tôi hai byte!

Trở lại trang web này, sau khi bận rộn một thời gian, hy vọng sẽ chơi golf này hơn nữa.

esmaYf&-TYP_+Th

Hãy thử trực tuyến tại đây .


4
Chào mừng trở lại PPCG!
Rò rỉ Nun

@LeakyNun Cảm ơn :)
Maltysen

1
-TYlà một byte ngắn hơn !/YTvà trung thực trong các trường hợp tương tự.
isaacg

Bạn có thể lưu một byte khác bằng cách thay đổi +hdTthành +Th.
isaacg

@isaacg, oh nó có đưa phần tử đầu tiên vào danh sách không? Điều đó thật tuyệt.
Maltysen

3

C # (.NET Core) , 169 byte

n=>{if(n<2)return 1;var p=new int[n-1];int i=0,j,s;for(;i<n-1;)p[i]=f(++i);for(i=1;;i++){for(j=2,s=i+n;j<s&&s%j++>0;);if(j==s&!System.Array.Exists(p,e=>e==i))return i;}}

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

Do sự xa cách hiệu quả nhất để tính toán kết quả, vì vậy xin vui lòng điệp khúc từ tính f(n)cho n>=30với mã này. Bước đầu tiên là tính toán đệ quy các giá trị từ f(1)đến f(n-1)và sau đó tiến hành tính toán f(n)bằng cách tìm kiếm đầu tiên isao cho n+ilà số nguyên tố và ikhông có trong danh sách giá trị trước đó.


3

Hội x86-64, 57 55 byte

Tôi mới chơi golf, vì vậy ý ​​kiến ​​/ phản hồi được đánh giá cao.

Lưu ý: điều này được tối ưu hóa cho chiều dài mã máy, không phải chiều dài nguồn.

0: 89 f8 ff cf 74 32 97 89 fe 89 f1 ff c6 89 f0 99
1: f7 f1 85 d2 e0 f7 85 c9 75 ed 89 f9 ff c9 56 29
2: fe 56 57 51 89 fc e8 d3 ff ff ff 59 5f 5e 39 c6
3: e0 ef 96 5e 74 d1 c3

Xác định hàm, sử dụng quy ước chuẩn (nghĩa là giá trị trả về trong eax, đối số đầu tiên trong edi, tất cả các thanh ghi người gọi được lưu ngoại trừ ebx) lấy một số nguyên 32 bit không dấu và trả về m nhỏ nhất, v.v.

Nguồn:

    .globl a083569
    // edi = original, probably don't touch
    // esi = candidate prime, if it's not a repeat we return edi-this
a083569:
    mov %edi, %eax
    dec %edi
    jz end
    xchg %eax, %edi
    mov %edi, %esi
primecheck:
    mov %esi, %ecx
    inc %esi
primeloop:
    mov %esi, %eax
    cdq
    div %ecx
    test %edx, %edx
    loopnz primeloop
/* end */
    // if esi isn't prime, then ecx is now one or greater.
    test %ecx, %ecx
    jnz primecheck
    // esi is now our target prime: check if it's not already one
    mov %edi, %ecx
    dec %ecx
    push %rsi   /* we need a flag-safe way to restore this later */
    sub %edi, %esi
chkdup:
    push %rsi
    push %rdi
    push %rcx
    mov %ecx, %edi
    call a083569
    pop %rcx
    pop %rdi
    pop %rsi
    cmp %eax, %esi
    loopne chkdup
/* end loop - chkdup */
    xchg %esi, %eax
    pop %rsi
    je primecheck
/* end outer loop - primecheck */
end:
    ret

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


1

Clojure, 158 155 byte

#(loop[r[0 1]i 1](if(= i %)(last r)(recur(conj r(nth(for[j(range):when(=((set r)j)(seq(for[k(range 2(+ 1 i j)):when(=(mod(+ 1 i j)k)0)]j)))]j)0))(inc i))))

Điều này có thể vẫn còn một số chất béo, tôi không hoàn toàn hài lòng (+ 1 i j)nhưng đây là cách dễ nhất để xử lý trường hợp cơ bản n = 1và phần còn lại. ((set r)j)trả về nilnếu jkhông có trong tập hợp và (seq ())trên danh sách trống cũng trả về nil. Tính n = 1000trong 48 giây.

Cập nhật: loại bỏ nilkhỏi =kiểm tra vì mã hoạt động chính xác mà không có nó.



1

Python, 194 170 110 byte

84 byte được lưu bởi Leaky Nun

2 byte được lưu bởi mathmandan

def s(n):
 a=[s(j)for j in range(1,n)];i=1
 while(i in a)|any((i+n)%j<1for j in range(2,i+n)):i+=1
 return i

Xác định hàm s (n) lấy một số làm đầu vào và trả về A083569 (n).

Dùng thử trực tuyến


1
Bạn có thể xem xét bao gồm liên kết TIO này .
Leaky Nun

1
Bạn có thể sử dụng p=lambda n:any(n%i<1for i in range(2,n))để kiểm tra tính nguyên thủy.
Rò rỉ Nun


1
Bạn có thể sử dụng bitwise hoặc để lưu một vài byte:while(i in a)|any(...
mathmandan
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.