A083569 : m + n이 소수가되도록 가장 일찍 발생하지 않는 m


26

다음과 같이 1 색인 순서를 정의하십시오.

  • A083569(1) = 1
  • A083569(n)여기서 n보다 큰 1정수 m+n는 소수 인 초기에 발생하지 않는 가장 작은 정수 m 입니다.

당신의 임무는 n들어와 돌아 오는 것 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

더 많은 테스트 케이스는 여기 에서 찾을 수 있습니다 . OEIS의 원래 순서는 여기 에서 찾을 수 있습니다 .

이것은 입니다. 바이트 단위의 최단 답변이 이깁니다. 표준 허점이 적용됩니다.


@ Mr.Xcoder "다음과 같이 1- 인덱스 시퀀스를 정의하십시오"
Leaky Nun

답변:


14

하스켈 , 87 86 83 80 74 69 바이트

3 바이트를 절약 한 일부 변경 사항을 제안 해 주신 xnor에게 감사드립니다!

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

온라인으로 사용해보십시오!

나는 Haskell을 처음 사용하고 Haskell 골프는 피드백에 감사드립니다!

설명

우리는 함수를 정의합니다 f n. 우리 는 목록 f n의 첫 번째 요소 !!0로 정의 합니다.

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

세분화 :

[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
하스켈 골프에 오신 것을 환영합니다! 은 [2,3..]단지 할 수있다 [2..](1)에 의해 계산하는 것은 기본이다. 내장되어 notElem있습니다.
xnor

@xnor 감사합니다! 나는 사용하는 데 더 나은 방법을 찾았 notElem지만 첫 번째 팁이 도움이되었고 두 번째 팁을 뒷주머니에 보관해야합니다.
밀 마법사

새 개정이 f 1잘못 된 것 같습니다. 1이어야합니다.
xnor

@xnor 불행히도 3 바이트의 비용으로 수정되었습니다.
밀 마법사

6

젤리 , 16 15 바이트

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

이것은 A083569 (n) ≤ n²을 가정합니다 ( 시퀀스가 선형으로 증가하는 것으로 나타남).

온라인으로 사용해보십시오!

작동 원리

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
실제로, 정의에 의한 것보다 A083569(n)기껏해야 세 n번째 큰 n수는 기껏해야 세 2n번째이며, 이는 Rosser-Schoenfeld의 결과 n≥3보다 적습니다 4n*log(n).
Greg Martin

@GregMartin이 그것을 확인하는 동안, 그것은 여전히 ​​꽤 야생 가정입니다 ...
Esolanging Fruit

4
@ Challenger5 "교육받은 추측"을 선호합니다.
Dennis

6

Pyth- 18 17 15 바이트

2 바이트를 절약 해 주신 @isaacg에게 감사드립니다!

잠시 동안 바쁘게 돌아온 후이 사이트로 돌아와서이 골프장을 한층 더 골프화 시키십시오.

esmaYf&-TYP_+Th

여기에서 온라인으로 사용해보십시오 .


4
PPCG에 다시 오신 것을 환영합니다!
Leaky Nun

@LeakyNun 감사합니다 :)
Maltysen 2016 년

1
-TY는 1 바이트보다 짧으며 !/YT같은 경우에는 진실합니다.
isaacg 2016 년

로 변경 +hdT하여 다른 바이트를 저장할 수 있습니다 +Th.
isaacg 2016 년

@ isaacg, 오 첫 번째 요소를 목록으로 캐스팅합니까? 정말 멋지다.
Maltysen

3

C # (. NET 코어) , 169 바이트

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;}}

온라인으로 사용해보십시오!

결과를 계산하는 가장 비효율적 인 방법이므로이 코드 f(n)n>=30사용 하여 계산하지 마십시오 . 첫 번째 단계는에서 f(1)까지 의 값을 재귀 적으로 계산 f(n-1)한 다음 이전 값 목록에없는 f(n)첫 번째 값 을 검색 하여 계산을 진행하는 in+i입니다 i.


3

x86-64 어셈블리, 57 55 바이트

나는 골프를 처음 사용하므로 의견 / 피드백을 부탁드립니다.

참고 : 이것은 소스 길이가 아닌 머신 코드 길이에 최적화되어 있습니다.

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

부호없는 32 비트 정수를 사용하고 가장 작은 m 등을 반환하는 표준 규칙 (예 : eax의 반환 값, edi의 첫 번째 인수, ebx를 제외한 모든 레지스터는 호출자가 저장 한)을 사용하여 함수를 정의합니다.

출처:

    .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

온라인으로 사용해보십시오!


1

클로저, 158155 바이트

#(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))))

이것은 여전히 ​​약간의 지방이있을 수 있지만, 나는 행복하지 (+ 1 i j)않지만 이것은 기본 사례 n = 1와 나머지 를 처리하는 가장 쉬운 방법이었습니다 . ((set r)j)반환 nil경우 j집합에없는, 그리고 (seq ())빈리스트를 반환뿐만 아니라 nil을에. n = 100048 초 안에 계산합니다 .

업데이트 : 코드가 없어도 코드가 올바르게 작동하므로 검사 nil에서 제거되었습니다 =.



1

파이썬 194 170 110 바이트

Leaky Nun이 저장 한 84 바이트

mathmandan이 저장 한 2 바이트

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

숫자를 입력으로 받아서 A083569 (n)를 반환하는 함수 s (n)을 정의합니다.

온라인으로 사용해보십시오


1
이 TIO 링크 포함을 고려할 수 있습니다 .
Leaky Nun

1
p=lambda n:any(n%i<1for i in range(2,n))우선 순위 점검에 사용할 수 있습니다 .
Leaky Nun


1
비트 단위를 사용하거나 몇 바이트를 저장할 수 있습니다.while(i in a)|any(...
mathmandan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.