A083569: Kleinstes m, das nicht früher auftritt, so dass m + n eine Primzahl ist

26

Definieren Sie eine 1-indizierte Sequenz wie folgt:

  • A083569(1) = 1
  • A083569(n)wobei neine ganze Zahl größer ist als 1, ist die kleinste ganze Zahl m, die nicht früher auftritt, so dass m+nes sich um eine Primzahl handelt.

Ihre Aufgabe ist es, aufzunehmen nund zurückzukehren 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

Weitere Testfälle finden Sie hier . Die Originalsequenz zu OEIS finden Sie hier .

Das ist . Kürzeste Antwort in Bytes gewinnt. Es gelten Standardlücken .

Undichte Nonne
quelle
@ Mr.Xcoder "Definieren Sie eine 1-indizierte Sequenz wie folgt"
Leaky Nun

Antworten:

14

Haskell , 87 86 83 80 74 69 Bytes

Vielen Dank an xnor für die Vorschläge zu Änderungen, mit denen 3 Byte eingespart wurden!

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

Probieren Sie es online!

Ich bin neu in Haskell und Haskell Golf, Feedback wird geschätzt!

Erläuterung

Wir definieren eine Funktion f n. Wir definieren f nals erstes Element !!0der Liste:

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

Aufgeschlüsselt ist das:

[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
Weizen-Assistent
quelle
3
Willkommen bei Haskell Golf! Das [2,3..]kann nur sein [2..], es wird standardmäßig um 1 hochgezählt. Es gibt eine eingebaute notElem.
xnor
@ xnor Danke! Am Ende habe ich einen besseren Weg gefunden, notElemaber der erste Tipp war hilfreich und ich werde sicherstellen, dass der zweite in meiner Gesäßtasche bleibt.
Weizen-Assistent
Es sieht so aus, als ob Ihre neue Revision f 1falsch wird. Sie sollte am 1.
20.
@xnor Behoben, leider auf Kosten von 3 Bytes.
Weizen-Assistent
6

Jelly , 16-15 Bytes

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

Dies setzt A083569 (n) ≤ n² voraus (die Sequenz scheint linear zu wachsen).

Probieren Sie es online!

Wie es funktioniert

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.
Dennis
quelle
4
In der Tat A083569(n)ist höchstens die nth-Primzahl größer als nnach ihrer Definition, die höchstens die 2nth-Primzahl ist, die (für n≥3) weniger ist als 4n*log(n)nach Ergebnissen von Rosser-Schönfeld.
Greg Martin
Während @GregMartin es verifiziert hat, ist es immer noch eine ziemlich wilde Annahme ...
Esolanging Fruit
4
@ Challenger5 Ich bevorzuge "gebildete Vermutung".
Dennis
6

Pyth - 18 17 15 Bytes

Vielen Dank an @isaacg, dass du mir zwei Bytes gespart hast!

Zurück auf dieser Seite, nach einer Weile beschäftigt, wird hoffentlich dieses weiter Golf spielen.

esmaYf&-TYP_+Th

Probieren Sie es hier online aus .

Maltysen
quelle
4
Willkommen zurück bei PPCG!
Undichte Nonne
@LeakyNun Danke :)
Maltysen
1
-TYist ein Byte kürzer als !/YTund in den gleichen Fällen wahr.
Isaacg
Sie können , indem ein weiteres Byte speichern +hdTzu +Th.
Isaacg
@isaacg, oh, wirft es das erste Element in eine Liste? Das ist wirklich cool.
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;}}

Probieren Sie es online!

Bei weitem die meisten ineffizienter Weg , um die Ergebnisse zu berechnen, bitte so Refrain aus der Berechnung f(n)für n>=30mit diesem Code. Der erste Schritt ist , um rekursiv die Werte zu berechnen , die von f(1)zu f(n-1)und dann zu berechnen , geht f(n)durch die ersten Benutzer , iso dass eine n+iPrimzahl ist , und iist nicht auf der vorherige Werte - Liste.

Charlie
quelle
3

x86-64-Assembly, 57-55 Byte

Ich bin neu im Golfsport, daher sind Kommentare / Rückmeldungen erwünscht.

Hinweis: Dies ist für die Länge des Maschinencodes optimiert, nicht für die Länge der Quelle.

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

Definiert eine Funktion unter Verwendung der Standardkonvention (dh Rückgabewert in eax, erstes Argument in edi, alle vom Aufrufer gespeicherten Register außer ebx), die eine vorzeichenlose 32-Bit-Ganzzahl verwendet und das kleinste m usw. zurückgibt.

Quelle:

    .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

Probieren Sie es online!

ObsequiousNewt
quelle
1

Clojure, 158 155 Bytes

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

Dies könnte noch etwas Fett haben, mit dem ich nicht ganz zufrieden bin, (+ 1 i j)aber dies war der einfachste Weg, mit dem Basisfall n = 1und dem Rest umzugehen. ((set r)j)Gibt zurück, nilwenn jes sich nicht in der Menge befindet, und (seq ())in einer leeren Liste gibt es auch null zurück. Berechnet n = 1000in 48 Sekunden.

Update: entfernt nilvon =Kontrolle , da der Code korrekt auch ohne es funktioniert.

NikoNyrh
quelle
1

Python, 194 170 110 Bytes

84 Bytes von Leaky Nun gespeichert

2 Bytes von Mathmandan gespeichert

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

Definiert eine Funktion s (n), die eine Zahl als Eingabe annimmt und A083569 (n) zurückgibt.

Probieren Sie es online

Madison Silver
quelle
1
Sie könnten erwägen, diesen TIO-Link einzuschließen .
Undichte Nonne
1
Sie können p=lambda n:any(n%i<1for i in range(2,n))für die Primalitätsprüfung verwenden.
Undichte Nonne
1
110 Bytes
Undichte Nonne
1
Sie können bitweise oder ein paar Bytes speichern:while(i in a)|any(...
Mathmandan