Обчисліть мінімум таким, що є простим (OEIS A051935)


12

Фон

Розглянемо таку послідовність ( A051935 в OEIS):

  • Почніть з терміна .2
  • Знайдіть найнижнє ціле число більше так що є простим.2 2 + nn22+n
  • Знайдіть найнижнє ціле число більше таке що є простим і т.д. n 2 + n + n 'nn2+n+n

Більш офіційне визначення:

an={2if n=0min{xNx>an1 and (x+i=0n1ai) is prime}otherwise

Першими кількома умовами послідовності є (будь ласка, посилайтесь на них як на тестові випадки):

2, 3, 6, 8, 10, 12, 18, 20, 22, 26, 30, 34, 36, 42, 44, 46, 50, 52, 60, 66, 72, 74, ...

Завдання

Ваше завдання - генерувати цю послідовність будь-яким із наступних способів:

  • Виведіть його умови на невизначений термін.
  • Дано n , вихід an ( nth термін, 0 або 1 індексовано).
  • Дано n , вихід {a1,a2,,an} (перші n доданків).

Ви можете змагатись на будь- якій мові програмування і можете приймати введення та надавати висновок будь-яким стандартним методом , зауважуючи, що ці лазівки заборонені за замовчуванням. Це , тому найкоротше подання (у байтах) на кожну мову виграє.


4
Поради, яких слід уникати під час написання викликів: Найпростіші числа . Ви могли б використовувати щось інше, крім первинності.
Okx

3
@Okx У мене було кілька причин, коли я обираю первинність цього разу: 1) Є кілька розумних алгоритмів, специфічних саме для цієї послідовності, як той, який реалізував Денніс. 2) Для цього вже є запис OEIS
Mr. Xcoder

Відповіді:


4

Брахілог , 13 байт

~l.<₁a₀ᵇ+ᵐṗᵐ∧

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

Вихід - це список перших n термінів послідовності.

?~l.<₁a₀ᵇ+ᵐṗᵐ∧    Full code (? at beginning is implicit)

?~l.              Output is a list whose length is the input
    <₁            Output is an increasing list
      a₀ᵇ+ᵐ       And the cumulative sum of the output
           ṗᵐ     Consists only of prime numbers
             ∧    No further constraints on output

Explanation for a₀ᵇ+ᵐ:
a₀ᵇ               Get the list of all prefixes of the list
                  Is returned in increasing order of length
                  For eg. [2, 3, 6, 8] -> [[2], [2, 3], [2, 3, 6], [2, 3, 6, 8]]
   +ᵐ             Sum each inner list  -> [2, 5, 11, 19]


4

Желе , 11 9 байт

0Ḥ_ÆnɗСI

Це повна програма, яка приймає n як аргумент і друкує перші n термінів послідовності.

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

Як це працює

0Ḥ_ÆnɗСI  Main link. Argument: n

0          Set the return value to 0.
      С   Accumulating iterate. When acting on a dyadic link d and called with
           arguments x and y, the resulting quicklink executes
           "x, y = d(x, y), x" n times, returning all intermediate values of x.
           Initially, x = 0 and  y = n.
     ɗ       Drei; combine the three links to the left into a dyadic chain.
 Ḥ             Unhalve; double the left argument.
  _            Subtract the right argument.
   Æn          Compute the next prime.
           This computes the partial sums of the sequence a, starting with 0.
        I  Increments; compute the forward differences.

3

05AB1E v2 , 10 байт

2λλOD₁+ÅNα

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

Це працює лише у не застарілій версії, переписати Elixir. Виводить нескінченний потік цілих чисел. Є деякі помилки з основним тестом, які були виправлені в останніх комісіях, але вони ще не ввійшли в TIO. Але це працює локально. Ось GIF його виконання на моїй машині, модифікований для виведення перших кількох термінів, а не всього потоку.

Як це працює

Визначає рекурсивну нескінченну послідовність з базовим випадком . Структура є одним з дуже крутих нових можливостей 05AB1E в. Коротко кажучи, вона приймає функцію , задаючи цілому аргументу, в даному випадку .a ( n ) a ( 0 ) 22λa(n)a(0)2

λO

У цій частині коду λроль Росії інша. Вже перебуваючи всередині рекурсивного середовища, він натомість формує , список усіх попередніх результатів. Потім підсумовує їх.[a(0),a(1),,a(n1)]O

D₁+

Дублюйте суму для подальшого використання та додайте до другої копії.a(n1)

ÅN

Породжує найнижчий простір суворо більше, ніж вищевказана сума.

α

Нарешті, отримайте абсолютну різницю між простим обчисленим вище та першою копією суми, обчисленої раніше (сумою всіх попередніх ітерацій).

Потім потік неявно друкується до STDOUT на невизначений термін.


2

Perl 6 , 45 байт

2,{first (*+@_.sum).is-prime,@_[*-1]^..*}...*

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

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

Пояснення:

Для цього використовується оператор Sequence, ...який визначає послідовність як:

2,  # The first element is 2
  {  # The next element is:
    first  # The first value that:
          (*+@_.sum).is-prime,  # When added to the sum is a prime
          @_[*-1]^..*  # And is larger than the previous element
  }
...*  # And continue the sequence indefinitely



2

Pyth ,12 11 байт

.f&P-;Z=-;Z

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

Збережено 1 байт завдяки isaacg.

Створює перші nтакі числа, використовуючи індекс на основі 1.

.fзнаходить перші kцілі числа, які задовольняють певному критерію, починаючи з нуля. Тут критерій полягає в тому, що попередній простір, який ми обчислили ;, плюс поточне число Z, є простим ( P). Якщо це так, ми також оновлюємо останній обчислений простим, використовуючи поведінку короткого замикання логіки та функції ( &). На жаль .f, змінна за замовчуванням - Zце вартість байта в оновлення.

Трюк, який з'ясував isaacg, полягав у тому, щоб зберігати заперечення останнього простого і перевіряти це мінус поточне значення. Це в Pyth коротше, оскільки перевірка первинності перевантажена: на позитивних числах він знаходить просте множення, а на від'ємних числах визначає, чи є додатне значення числа простим.

Це більш-менш перекладається на:

to_find = input()
last_prime = 0
current = 0
results = []
while to_find > 0:
    if is_prime( current + last_prime ):
        results.append( current )
        to_find -= 1
        last_prime += current
    current += 1
print results

Замінити _+з -і +з -по -1 байт.
isaacg

@isaacg Це досить розумно! Я відредагую це.
FryAmTheEggman

2

MATL , 21 байт

O2hGq:"t0)yd0)+_Yqh]d

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

Вихід - це перші n строків послідовності.

Пояснення:

Побудує список простих простих чисел (з початковим 0), а в кінці знаходить повернення різниць між послідовними праймерами у списку.

              % Implicit input, say n
O2h           % Push P = [0, 2] on the stack 
Gq:"          % for loop: 1 to n-1
  t0)           % Take the last element of P
                %  Stack: [[0, 2], [2]] (in first iteration)
  yd0)          % Take the difference between the last
                %   two elements of P
                %  Stack: [[0, 2], [2], [2]]
  +             % Add those up
                %  Stack: [[0, 2], [4]]
  _Yq           % Get the next prime higher than that sum
                %  Stack: [[0, 2], [5]]
  h             % Concatenate that to the list P
                %  Stack: [[0, 2, 5]]
]             % End for loop
d             % Get the differences between successive elements of
              %   the final list P

2

Haskell , 67 байт

(1#1)2 2
(p#n)s k|p`mod`n>0,n-s>k=k:(p#n)n(n-s)|w<-p*n=(w#(n+1))s k

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

(1#1)2 2це функції, які не беруть ніяких даних і видають нескінченний список.


стара відповідь:

Haskell , 88 83 78 76 байт

Тест на первинність - це відповідь та покращений Крістіаном Сіверсом (-2 байти).

-5 байт завдяки WW .

2#2
(p#s)n|n<1=p|w<-until(\m->mod(product[1..m-1])m>0)(+1)$s+p+1=(w-s)#w$n-1

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


Можна обійтися і без ^2. Це змінить предикат від тестування - це першочергове для тестування є простим чи 4 , що не має значення в цій програмі.
Крістіан Сіверс

2

05AB1E (спадщина) , 12 байт

0U[XN+DpiN,U

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

Пояснення

0U              # initialize X as 0
  [             # start an infinite loop
   XN+          # add X to N (the current iteration number)
      Dpi       # if the sum is prime:
         N,     #   print N
           U    #   and store the sum in X

Можлива пара різних 12-байтових рішень.
Цей конкретний міг би бути 10 байт, якби у нас використовувана змінна ініціалізована як 0 (замість 1 і 2).


1

Python 2 , 119 байт

f=lambda n,k=1,m=1:m%k*k>n or-~f(n,k+1,m*k*k)
def g(i):
 r=[2]
 for j in range(i):r+=[f(sum(r)+r[-1])-sum(r)]
 return r

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

Наступна функція Prime f (), взята з цієї відповіді .

Функція g () приймає невід'ємне ціле число i повертає список усіх елементів у послідовності до цього індексу.



1

Python 2 , 99 98 байт

def f(n,s=2,v=2):
 k=s-~v
 while any(k%i<1for i in range(2,k)):k+=1
 return n and f(n-1,k,k-s)or v

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

1 байт thx для містера Xcoder .


1
Я знаю ... Я знаю ... Мене та мою педантичну хитрості :) Але ви можете зберегти байт за допомогою k=s-~v.
Містер Xcoder

@Містер. Xcoder: Ваш нечестивий чарівний чаклунство ще буде кінцем вас! :)
Chas Brown

1

Haskell , 101 99 97 байт

Функція lне бере аргументів і повертає нескінченний список. Не такий короткий, як більш прямий підхід від @ovs (і я, очевидно, вкрав деякі частини, що відповідає їхній відповіді), але, можливо, все-таки пограбував?

Дякуємо @ H.PWiz за -2 байти!

import Data.List
p m=mod(product[1..m-1])m>0
l=2:[until(p.(+sum a))(+1)$last a+1|a<-tail$inits l]

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




Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.