A083569: Найменший m, що не виникає раніше, такий, що m + n є простим


26

Визначте 1-індексовану послідовність так:

  • A083569(1) = 1
  • A083569(n)де nціле число більше, ніж 1найменше ціле число m, яке не виникає раніше, таке m+nпросте число.

Ваше завдання - взяти 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 байт

Дякуємо xnor, що запропонував зміни, які зберегли 3 байти!

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

Спробуйте в Інтернеті!

Я новачок у Haskell та Haskell golfing, відгуки високо оцінені!

Пояснення

Визначимо функцію 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
Ласкаво просимо в гольф Haskell! Це [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простим розквітом, що (за n≥3) менше, ніж 4n*log(n)за результатами Россера – Шенфельда.
Грег Мартін

Хоча @GregMartin це підтвердив, це все ще досить дике припущення зробити ...
Esolanging Fruit

4
@ Challenger5 я віддаю перевагу "освіченій здогадці".
Денніс

6

Піт - 18 17 15 байт

Дякую @isaacg за те, що врятував мені два байти!

Повернувшись на цей сайт, зайнявшись деякий час, сподіваємось, гольфу далі.

esmaYf&-TYP_+Th

Спробуйте його онлайн тут .


4
Ласкаво просимо до PPCG!
Leaky Nun

@LeakyNun Спасибі :)
Maltysen

1
-TYє на один байт коротше !/YT, а в тих самих випадках - truthy.
isaacg

Ви можете зберегти інший байт, перейшовши +hdTна +Th.
isaacg

@isaacg, о, це передає перший елемент до списку? Це справді круто.
Малтісен

3

C # (.NET Core) , 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), шукаючи перше iтаке, яке n+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

Визначає функцію, використовуючи стандартну умовність (тобто значення повернення в eax, перший аргумент в edi, всі регістри, які зберігаються абонентами, крім ebx), яка приймає непідписане 32-бітове ціле число і повертає найменше m і т.д.

Джерело:

    .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

Clojure, 158 155 байт

#(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 ())в порожньому списку також повертається нуль. Розраховується n = 1000за 48 секунд.

Оновлення: знімається nilз =перевірки, оскільки код працює правильно і без нього.



1

Пітон, 194 170 110 байт

84 байти зберегли Лікі монахині

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

Визначає функцію s (n), яка приймає число як вхідне і повертає A083569 (n).

Спробуйте в Інтернеті


1
Ви можете розглянути можливість включення цього посилання TIO .
Лина монашка

1
Ви можете використовувати p=lambda n:any(n%i<1for i in range(2,n))для перевірки первинності.
Лина монашка


1
Ви можете скористатися побітом або зберегти пару байтів:while(i in a)|any(...
mathmandan,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.