Бермандські Прими


24

Постулат Бертрана стверджує, що для кожного цілого числа n ≥ 1 існує принаймні один простий p такий, що n <p ≤ 2n . Для перевірки цієї теореми для n <4000 нам не потрібно перевіряти 4000 випадків: Трюк Ландау говорить, що достатньо перевірити, що

2, 3, 5, 7, 13, 23, 43, 83, 163, 317, 631, 1259, 2503, 5003

всі прості. Оскільки кожне з цих чисел менше, ніж удвічі перевищує його попередника, кожен інтервал {y: n <y ≤ 2n} містить щонайменше одне з цих простих чисел.

Ця послідовність чисел є Бермандською Праймою (OEIS A006992) і визначається наступним чином:

a(1) = 2
a(n) = largest prime below 2a(n-1)

Виклик

Реалізуйте цю послідовність. Ви можете написати

  • функція або програма, яка дала кілька n повертає a (n) (0 або 1 індексовано),
  • функція або програма, яка дала деякий п, повертає перші n (або n-1 або n + 1 ) записів цієї послідовності,
  • нескінченний список, потік або генератор або подібний еквівалент у вашому мовному мовою.

Відповіді:


8

Октава , 32 байти

k=2
do k=primes(k+k)(end)until 0

Тримає друк значень нескінченно (кожному значенню передує k =).

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


Октава , 42 байти

k=2
for i=2:input('')k=primes(k+k)(end)end

Приймає n як вхід і виводить n перших значень (кожному значенню передує k =).

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


Октава , 51 байт

k=2;for i=2:input('')k=primes(k+k)(end);end
disp(k)

Схожий на відповідь Луїса Мендо MATL . Приймає n як вхід і виводить a (n) (1-індексований).

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


Октава , 60 байт

k=2;for i=2:input('')k*=2;while~isprime(--k)
end
end
disp(k)

Бере n як вхід і виводить a (n) (1-індексований).

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




6

05AB1E , 14 7 6 байт

$F·.ØØ

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


1-індексована відповідь (якщо 0 не передбачається виведення 1), пояснення:

$       # Push 1 and input (n)...
 F      # n-times do... 
  ·     # Double the current prime (first iteration is 1*2=2).
   .ØØ  # Find prime slightly less than double the current prime.

Він 1-індексований, тому що всі ітерації мають ітерацію "фіктивного" n=1.


Fx.ØØтак близько ... Працює на все, що вище n > 2.
Чарівний восьминіг Урна

1
У мене було $F·ÅPθтаке ж число байтів.
Емінья

@Emigna мав? Це як 0% того ж ха-ха. Я маю на увазі, технічно те саме, але ні. Можна ще розмістити його; P.
Чарівний восьминога Урна


5

Желе , 6 байт

2ḤÆp$¡

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

0-індексований.

Пояснення

2ḤÆp$¡  Main link. Input: n
2       Constant 2
    $¡  Repeat n times
 Ḥ        Double
  Æp      Find the largest prime less than the double

ткнути, тобі зараз потрібен ще один байт ;) ...
Чарівний восьминіг Урна

@MagicOctopusUrn Вхід 0 повертає 2, 1 повертає 3 тощо. Я не бачу жодної проблеми.
милі

Я мав на увазі, що вам потрібно зберегти байт на цій відповіді, щоб виграти, тому що я прив’язав вас до 6-байтових, сама ваша відповідь чудова.
Чарівний восьминога Урна


5

Стакс , 10 байт

ü☼┌τ,æ▒ìn(

Запустити тестові справи

Ця проблема виявила помилку при застосуванні stax :p, що є інструкцією, яка отримує найбільшу перевагу менше, ніж її вклад. Якби це працювало правильно, було б рішення 5 6 байтів. Але на жаль, це не так, і немає. Як творець мови, я виправлю це, але здається, що це виправдано виправити та використовувати його після опублікування проблеми.

Так чи інакше, ось відповідне представлення програми ascii вище.

ODH{|p}{vgs

Це відносно прямо реалізація постановки проблеми. Єдине, що, можливо, цікаво про це - це використання gsформи генератора. Генератори - це сімейство конструкцій, що поєднують початкову умову, перетворення та фільтр, щоб отримати одне або більше задовольняючих значень. У цьому випадку він використовується замість зламаної :pінструкції.

O               Push integer 1 underneath the input number.
 D              Pop the input and repeat the rest of the program that many times.
  H             Double number.
   {|p}         Predicate block: is prime?
       {vgs     Decrement until the predicate is satisfied.
                Output is implicitly printed.

Редагувати: ось 6-байтне рішення, але воно потребує виправлення помилок, застосованого лише після опублікування цього виклику.


Гарна мова! Я додав його до мого списку гольфів . Повідомте мене, якщо ви бачите щось не так або якщо ви хочете щось додати.
ETHproductions

@ETHproductions: Приємно, дякую! Якщо ви не заперечуєте, чи можете ви змінити адресу інтерпретатора на staxlang.xyz, я вирішив отримати домен для цього.
рекурсивна

1
Вау, цілий домен лише для мови для гольфу? Вдалий езоланг;) Оновлено!
ETHproductions

@recursive WOW, $ 1,99 для кожного домену xyz? Я в.
Чарівний восьминога Урн

4

Python 2 , 63 байти

r=m=k=P=2
while k:
 P*=k;k+=1
 if k>m:print r;m=r*2
 if P%k:r=k

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

Друкує назавжди.

Використовує основний генератор теореми Вілсона, навіть якщо генерування праймерів вперед непросто для цієї проблеми. Відстежує поточний найбільший розстріл rта межу подвоєння m.

Два байти зберігаються, роблячись P*=kне P*=k*kяк зазвичай, оскільки єдиним ефектом є стверджувати, що 4 є простим, а послідовність подвоєння пропускає його.


4

CJam (15 байт)

2{2*{mp},W=}qi*

Інтернет демо . Зауважте, що це 0-індексується.


Більш ефективним підходом було б пошук назад, але для цього потрібен ще один символ, оскільки він не може використовувати неявне ,(діапазон):

2{2*,W%{mp}=}qi*

4

Japt , 16 14 13 12 байт

Два рішення за ціною одного, обидва 1-індексованого.


N-й строк

Нарешті, завдання, я можу написати робоче рішення для використання F.g().

_ôZ fj Ì}g°U

Спробуй це

                 :Implicit input of integer U
_       }g       :Starting with the array [0,1] take the last element (Z),
                 :pass it through the following function
                 :and push the returned value to the array
 ôZ              :  Range [Z,Z+Z]
    fj           :  Filter primes
       Ì         :  Get the last item
          °U     :Repeat that process U+1 times and return the last element in the array

Перші N Умови

ÆV=ôV fj ̪2

Спробуй це

                 :Implicit input of integer U
                 :Also makes use of variable V, which defaults to 0
Æ                :Create range [0,U) and pass each through a function
  ôV             :  Range [V,V+V]
     fj          :  Filter primes
        Ì        :  Get the last item
         ª2      :  Logical OR with 2, because the above will return undefined on the first iteration
 V=              :  Assign the result of the above to V




2

Python 2 , 68 байт

Друкує послідовність нескінченно (для зупинки виконання потрібно вдруге натиснути кнопку "Виконати").

k=2
while 1:
 print k;k+=k
 while any(k%u<1for u in range(2,k)):k-=1

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

Python 3 , 90 байт

Повертає n- й доданок.

f=lambda n,i=1,p=1:n*[0]and p%i*[i]+f(n-1,i+1,p*i*i) 
a=lambda n:n and f(2*a(n-1))[-1]or 1

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


2

C (gcc) , 97 87 86 80 79 байт

  • Збережено десять байтів, увімкнувши функцію перевірки первинності P в основний цикл.
  • Збережено байт переміщенням printf виклик.
  • Збережено шість байтів, повернувши i запис-й послідовності (0-індексований) замість виведення нескінченного потоку.
  • Збережено байт завдяки плафоні .
f(p,r,i,m,e){for(r=2;p--;)for(e=0,i=r+r;e=m=!e;r=i--)for(;i-++m;e=e&&i%m);p=r;}

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


@ceilingcat Дякую
Джонатан Фрех

1

Attache , 38 байт

{If[_,Last[Series[Prime,2*$[_-1]]],2]}

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

На основі 0; повертає nпростий бертранд.

Наразі не існує вбудованого, щоб знайти попередній / наступний праймес, тому я використовую Seriesвбудований для обчислення всіх простих розмірів до 2*$[_-1]. Цей останній вираз використовує неявну рекурсію (зв'язану з $), щоб легко визначити відношення рецидивів. Умова if використовується для визначення базової умови.



1

Сітківка , 39 байт

.K`_
"$+"{`_
__
+`^(?=(..+)\1+$).

*\`_

Спробуйте в Інтернеті! Пояснення:

.K`_

Почніть з 1.

"$+"{`

Повторіть цикл, використовуючи вхід як кількість циклу.

_
__

Подвійне значення.

+`^(?=(..+)\1+$).

Знайдіть найвищий прайм менше значення.

*\`_

Роздрукуйте його.


0

Ruby , 51 + 7 (-rprime) = 58 байт

->n{x=2
n.times{x=(x..2*x).select(&:prime?)[-1]}
x}

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

Ягня, що приймає nта повертає nthпрайм Бертрана, 0-індексований. Тут не так багато, але дозвольте мені все-таки зняти гольф:

->n{
  x=2                       # With a starting value of 2
  n.times{                  # Repeat n times:
    x=(x..2*x)              # Take the range from x to its double
      .select(&:prime?)[-1] # Filter to only primes, and take the last
  }
  x                         # Return
}

Ruby , 48 + 7 = 55 байт

x=2
loop{puts x
x*=2
loop{(x-=1).prime?&&break}}

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

Для задоволення, ось рішення нескінченного циклу. Він друкує, як йде, і вимагає перерви. Залежно від того, коли саме ви перериваєтесь, ви можете або не побачите вихід. Безголівки:

x=2
loop{
  puts x
  x*=2
  loop{
    (x-=1).prime? && break
  }
}

0

APL (Dyalog Extended) , 12 байт

Приймає дані від користувача як N, повертає N-й елемент послідовності (0-індексується).

42×⍵}⍣⎕⊢2

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

Пояснення:

42×⍵}⍣⎕⊢2  Full program
              Get input from user - call it 'N'
          2  Repeat the left function N times, beginning with 2
    2×⍵        Double the function input
 ¯4           Find the largest prime less than above

0

R , 87 байт

Дані nрезультатиa(n)

j=scan();n=2;while(j-1){for(i in (n+1):(2*n)){n=ifelse(any(i%%2:(i-1)<1),n,i)};j=j-1};n

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

Я все ще працюю над "Дано n вихід a (1), a (2) ... a (n)". Я думав, що міг би трохи змінити цей код, але це здається складнішим за це.

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