Знайдіть прогалини


27

Простий розрив - це різниця між двома послідовними примерами. Більш конкретно, якщо p і q є прайменами з p < q і p +1, p +2, ..., q −1 не є простими буквами, то прайми p і q визначають проміжок n = q - p . Розрив, як кажуть, починається з p , і має довжину n .

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

Змагання

Враховуючи додатне ціле число n, виведіть перший простір, який починає проміжок довжини nабо більше.

Як приклад, для введення 4слід виходити 7, тому що 7 і 11 - це перші послідовні прайми, які відрізняються щонайменше на 4 (попередні проміжки - 1, від 2 до 3; 2, від 3 до 5; і 2, від 5 до 7). Для введення 3відповідь також повинна бути 7(немає проміжків довжиною 3).

Додаткові правила

Тестові справи

Input -> Output

1        2
2        3
3        7
4        7
6        23
10       113
16       523
17       523
18       523
30       1327
50       19609
100      370261
200      20831323


Під pq ви маєте на увазі qp правильно?
Erik the Outgolfer

@EriktheOutgolfer Так; виправлено, дякую!
Луїс Мендо


OEIS A002386 (Пов'язане)
Стівен

Відповіді:


3

Гая , 6 байт

zṅọ⊃∆ṇ

Це вкрай неефективно (на 16тестовий випадок на обчислення на моїй машині знадобилося більше години).

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

Пояснення

Послідовність, здається, має властивість, що a (n) <= 2 ^ n .

z       Push 2^input.
 ṅ      Get the first 2^input prime numbers.
  ọ     Get the deltas of the list.
   ⊃∆   Find the index of the first that is greater than or equal to the input.
     ṇ  Push the index-th prime number.

9

Желе , 10, 9, 8 10 байт

Æn_$:ð1#»2

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

Два байти збережено завдяки @Dennis! (а потім знову додано через кейси)

Пояснення:

Æn          #   The next prime after 'P'
  _$        #   Minus 'P'
    :       #   Divided by 'N'
            #
            # This will give a falsy value unless the distance to the next prime is >= N
            #
     ð      # Treat all of that as a single dyad (fucntion with two arguments). 
            # We'll call it D(P, N)
            #
      1#    # Find the first 'P' where D(P, input()) is truthy
        »2  # Return the maximum of that result and 2

Чи знаємо ми напевно, що результат завжди буде більшим, ніж або рівним вхідному? ( #буде рахуватись із вхідних даних тут). Це здається розумним припустити це, але я, для одного, поняття не маю, чи це припустиме припущення. EDIT: FYI, щоб виправити (за потреби) префікс за допомогою
Джонатан Аллан

5
Постулат @JonathanAllan Bertrand передбачає, що розрив у прем'єра суворо менший, ніж сам прем'єр.
Денніс

@Dennis блискуче дякую! TMYK ...
Джонатан Аллан

4

Математика, 30 байт

2//.x_ /;NextPrime@x-x<#:>x+1&

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

Математика, 35 байт

(t=2;While[NextPrime@t-t<#,t++];t)&

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

Математика, 77 байт

Prime@Min@Position[s=Differences@Prime@Range[(r=#)^3+1],#&@@Select[s,#>=r&]]&

Розумний розумний ... вам навіть не потрібно переконатися в тому, що і те, pі qвони прості ... Перший код здається недійсним, оскільки він доходить до 65535, якщо ви явно не подаєте аргумент MaxIterations.
JungHwan Min

Також -2 байти для 35- (For[t=2,NextPrime@t-t<#,t++];t)&
байтної

4

Haskell , 106 102 93 77 73 72 байт

Це формує спочатку нескінченний список простих, потім шукає прогалини. Простий список взяли звідси . Можливо, це може бути скорочено, але я ще не зрозумів як це :)

Дякуємо @BruceForte за -4 байти та @Zgrab за -1 байт!

f n=[x|(y,x)<-zip=<<tail$[n|n<-[2..],all((>0).rem n)[2..n-1]],y-x>=n]!!0

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


Звичайно, є якась магія монади, дякую :)
недолік

zip=<<tail$[...]зберігає байт.
Згарб

"Це генерує нескінченний список простих спершу, потім ...": ну, тоді ніколи не повинно відбуватися? (тобто це відбудеться лише через нескінченно довгий час, час "вперше створити" процедурно нескінченний список простих чисел)
Олів'є Дулак,

1
Haskell використовує ледачу оцінку, тому генерується лише стільки записів цього списку, скільки насправді використовується. Таким чином, ці праймери генеруються до тієї точки, де ми фактично знаходимо точки. Якщо ви спробуєте це, ви побачите, що для будь-якого nвоно зупиниться через обмежений час :) (Haskell - це не процедурна, а функціональна мова з ледачою оцінкою.)
flawr

1
Ну це нескінченний список, за визначенням він не має кінця. Те, що я описав, - це лише те, що відбувається під кришкою у звичайних перекладачах, але це не вказано як частина мови, тому ви не можете цього сказати!
flawr

3

Pyth - 14 байт

Він фільтрується з [1, inf), фільтруючи за первісністю ( P_) і що наступний прайм, відфільтрований з (n, inf), має інший> = на вхід.

f&P_T<tQ-fP_Yh

Тестовий сюїт .


3

PowerShell , 97 96 91 байт

param($n)for($a=$b=2){for(;'1'*++$b-match'^(?!(..+)\1+$)..'){if($b-$a-ge$n){$a;exit}$a=$b}}

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

Бере вхід $n, встановлює $aі $bдорівнює 2, а потім входить у нескінченний forцикл. Всередині ми замикаємося, $bпоки не дістаємося до наступного розквіту . Тоді ми перевіряємо, чи $b-$a(тобто розрив) -gперетворюється на величину eякості $n. Якщо це так, ми виводимо $aі exit. Інакше ми налаштовуємося $aна $bзбільшення $bта початок наступного пошуку.

Попередження: для великих входів це повільно . Насправді, він не може виконати 50або вищі тести протягом 60-х років у TIO. Ну добре.



3

Математика, 39 байт

(For[i=2;p=NextPrime,i+#>p@i,i=p@i];i)&
(* or *)
(For[i=1;p=Prime,p@i+++#>p@i,];p[i-1])&

33-байтна версія (не дійсна, оскільки вона піднімається лише до 65535-го простого)

p=NextPrime;2//.i_/;p@i-i<#:>p@i&



2

Математика, 37 байт

gNestWhile[p=NextPrime,2,p@#-#<g&]

Functionз першим аргументом g. Починаючи з 2, застосовує цю функцію p=NextPrimeповторно до тих пір, покиp@#-#<g& дає True(зазор між поточним простим і наступним простим рівнем менше g).


2

R + gmp, 55 байт

Використовує функцію nextprime з бібліотеки gmp

s=2;n=scan();while((x=gmp::nextprime(s))-s<n)s=x;cat(s)

Вам потрібно додати cat(s)в кінці. Неявна друк працює не в повному обсязі програм.
JAD


2

C = 141 109 байт; C ++, D = 141 байт; C #, Java = 143 байти

ПОПЕРЕДЖЕННЯ : АЛГОРИТМ низької ефективності

Цей код не зміг обчислити основний розрив g(200)протягом 10 хвилин. Для g(100)цього знадобилося 10 секунд (версія C ++)

Версія C ++ та D:

int p(int d){for(int i=2;i<=d/2;++i){if(!(d%i))return 0;}return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do{++n;}while(!p(n));}return f;}

Версія C # та Java:

int p(int d){for(int i=2;i<=d/2;++i){if(d%i==0)return 0;}return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do{++n;}while(p(n)==0);}return f;}

Версія C, -32 байти завдяки слюсарі:

i;p(d){for(i=2;d/2/i;)if(!(d%i++))return 0;return 1;}f;n;g(d){for(f=2,n=3;n-f<d;)for(f=n;!p(++n););return f;}

Відмінності між версіями C # / Java та C / C ++ / D: !p(n)<==>p(n)==0


Може реверс return 0; return 1і видалити !доp(++n)
ceilingcat

d%i==0і !(d%i)може бути d%i<0. Крім того , використовуючи двійки системи шаблонів рішення в D може бути: T p(T)(T d){for(T i=2;i<=d/2;++i)if(d%i<1)return 0;return 1;}T g(T)(T d){T f=2,n=3;while(n-f<d){f=n;do++n;while(!p(n));}return f;. (Зняття брекетів після forта, doможливо, також стосується C ++)
Zacharý

Я розмістив окрему версію D, в якій використовуються специфічні D хитрощі, яких неможливо знайти в C / C ++ / C # / Java.
Zacharý

int p(int d){for(int i=2;i<=d/2;++i)if(!(d%i))return 0;return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do++n;while(!p(n));}return f;}<- це повинно працювати для версії C ++
Zacharý

2

D, 127 125 122 байт

Попередження: низький алгоритм виконання

T p(T)(T d){T r;for(T i=2;i<=d/2;)r=d%i++<1||r;return r;}T g(T)(T d){T f=2,n=3;while(n-f<d){f=n;while(p(++n)){}}return f;}

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

Як?

Знову HatsuPointerKun, але я буду робити чародійну D специфіку.

  • Система шаблонів може робити висновки про типи T p(T)(T d)та коротша за C ++
  • r=d%i++<1||r, D конкретні шенагігани, можуть працювати в C / C ++, але я не знаю.
  • p(++n), як і вище, не впевнений, чи працює він у C / C ++
  • while(p(++n)){}, тут бачимо, чому D поганий у гольфі, його не можна використовувати ;як порожнє твердження.


1

QBIC , 28 байт

{~µs||~s-r>=:|_Xr\r=s]]s=s+1

Пояснення

{         DO
~µs||     IF s is prime THEN (note, s starts as 3)
~s-r>=:   IF the gap between s (current prime) and r (prev prime) is big enough
|_Xr      THEN QUIT, printing prev prime r
\r=s      ELSE (gap too small, but s is prime), set r to prime s
]]        END IF x2, leaving us in the WHILE
s=s+1     increment s, retest for primality ...

1

05AB1E , 9 байт

∞<ØD¥I@Ïн

Спробуйте в Інтернеті або перевірте всі тестові випадки . (Тестовий набір не містить останніх двох тестових випадків, оскільки TIO вичерпується для них.)

Оскільки інше питання є закритим як справжнє питання , я також розміщую тут свою відповідь .

Пояснення:

           # Get an infinite list in the range [1, ...]
 <          # Decrease it by one to make it in the range [0, ...]
  Ø         # Get for each the (0-indexed) n'th prime: [2,3,5,7,11,...]
   D        # Duplicate this list of primes
    ¥       # Get all deltas (difference between each pair): [1,2,2,4,2,...]
     I@     # Check for each if they are larger than or equal to the input
            #  i.e. 4 → [0,0,0,1,0,1,0,1,1,0,...]
       Ï    # Only keep the truthy values of the prime-list
            #  → [23,31,47,53,61,...]
        н   # And keep only the first item (which is output implicitly)
            #  → 23

1

Java 8, 99 92 байт

n->{int a=2,b=3,f,k;for(;b-a<n;)for(f=0,a=b;f<2;)for(f=++b,k=2;k<f;)f=f%k++<1?0:f;return a;}

Спробуйте в Інтернеті. (Найвищий тестовий випадок виключається, оскільки він закінчується у TIO.)

Пояснення:

n->{               // Method with integer as both parameter and return-type
  int a=2,b=3,     //  Prime-pair `a,b`, starting at 2,3
      f,           //  Prime-checker flag `f`, starting uninitialized
      k;           //  Temp integer, starting uninitialized
  for(;b-a         //  Loop as long as the difference between the current pair of primes
          <n;)     //  is smaller than the input
    for(f=0,       //   (Re)set the prime-checker flag to 0
        a=b;       //   Replace `a` with `b`, since we're about to search for the next prime-pair
        f<2;)      //   Inner loop as long as the prime-checker flag is still 0 (or 1)
                   //   (which means the new `b` is not a prime)
      for(f=++b,   //    Increase `b` by 1 first, and set this value to the prime-checker flag
          k=2;     //    Set `k` to 2
          k<f;)    //    Inner loop as long as `k` is still smaller than the prime-checker flag
        f=         //     Change the prime-checker flag to:
          f%k++<1? //      If the prime-checker flag is divisible by `k`
           0       //       Set the prime-checker flag to 0
          :        //      Else:
           f;      //       Leave it unchanged
                   //    (If any integer `k` in the range [2, `b`) can evenly divide `b`,
                   //     the prime-checker flag becomes 0 and the loop stops)
  return a;}       //  And finally after all the nested loops, return `a` as result

1

Охайний , 33 байти

{x:({v:⊟v<=-x}↦primes+2)@0@0}

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

Або 28 символів / 34 байти: {x:({v:⊟v≤-x}↦primes+2)@0@0}

Я поясню це за допомогою еквівалентного еквівалента ASCII:

{x:({v:(-)over v<=-x}from primes+2)@0@0}
{x:                                    }    lambda w/ parameter `x`
                          primes+2          overlapping pairs of primes
                                            [[2, 3], [3, 5], [5, 7], ...]
    {v:             }from                   select prime pairs `v = [a, b]`...
       (-)over v                            ...where `a` - `b`...
                <=-x                        is <= `x`
   (                              )@0@0     select the first element of the first pair

1

APL (NARS), 36 знаків, 72 байти

∇r←h w;k
r←2
→0×⍳w≤r-⍨k←1πr⋄r←k⋄→2
∇

1π - функція "наступний прайм"; тест:

  h¨1 2 3 4 6 10 16 17 18 30 50 100 200
2 3 7 7 23 113 523 523 523 1327 19609 370261 20831323  
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.