Найти простые пробелы

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, верно?
Эрик Outgolfer
@EriktheOutgolfer Да; исправлено, спасибо!
Луис Мендо
OEIS A104138
Луис Мендо
OEIS A002386 (Связанный)
Стивен

Ответы:

3

Gaia , 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
DJMcMayhem
источник
Знаем ли мы наверняка, что результат всегда будет больше или равен входному? ( #отсчитаем от ввода здесь) Кажется разумным предположить это, но я, например, понятия не имею, является ли это допустимым предположением. РЕДАКТИРОВАТЬ: FYI исправить (если необходимо) префикс с
Джонатан Аллан
5
Постулат @JonathanAllan Bertrand подразумевает, что разрыв простого числа строго меньше самого простого.
Деннис
@ Денис, блестящий, большое спасибо! TMYK ...
Джонатан Аллан
4

Mathematica, 30 байт

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

Попробуйте онлайн!

Mathematica, 35 байт

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

Попробуйте онлайн!

Mathematica, 77 байт

Prime@Min@Position[s=Differences@Prime@Range[(r=#)^3+1],#&@@Select[s,#>=r&]]&
J42161217
источник
Умный умный ... вам даже не нужно проверять и то, pи другое q- простое ... Однако первый код кажется неверным, потому что он поднимается только до 65535, если вы явно не передаете аргумент MaxIterations.
JungHwan Мин.
Кроме того, -2 байта для 35-байтовой версии:(For[t=2,NextPrime@t-t<#,t++];t)&
JungHwan Мин.
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

Попробуйте онлайн!

flawr
источник
Конечно, есть немного волшебства монады, спасибо :)
flawr
zip=<<tail$[...]сохраняет байт.
Згарб
«Это порождает бесконечный список простых чисел, а затем ...»: ну, тогда никогда не должно произойти? (т. е. это произойдет только через бесконечно долгое время, время для «первого генерирования» процедурно бесконечного списка простых чисел)
Оливье Дюлак
1
Haskell использует ленивую оценку, поэтому генерируется только столько записей из этого списка, сколько фактически используется. Таким образом, эти простые числа генерируются до точки, где мы на самом деле находим точки. Если вы попробуете это, вы увидите, что для любого nэто прекратится через некоторое время :) (Haskell - не процедурный, а функциональный язык с ленивой оценкой.)
flawr
1
Ну, это бесконечный список, по определению у него нет конца. То, что я описал, - это просто то, что происходит под капотом обычных переводчиков, но это не указано как часть языка, поэтому вы не можете этого сказать!
flawr
3

Pyth - 14 байт

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

f&P_T<tQ-fP_Yh

Тестовый пакет .

Maltysen
источник
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}}

Попробуйте онлайн!

Принимает input $n, устанавливает $aи $bравняется 2, затем входит в бесконечный forцикл. Внутри мы зацикливаемся, $bпока не доберемся до следующего прайма . Затем мы проверяем, является ли $b-$a(то есть, разрыв) -gповторным или eкачественным $n. Если это так, мы выводим $aи exit. В противном случае мы устанавливаем $aбыть $bи прибавка $bи начать наш следующий поиск.

Предупреждение: это медленно для большого ввода. Фактически, он не может завершить 50или более высокие тесты в течение тайм-аута 60-х на TIO. Ну что ж.

AdmBorkBork
источник
3

Mathematica, 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

Mathematica, 37 байт

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

Functionс первым аргументом g. Начиная с 2, применяет функцию p=NextPrimeмногократно, пока p@#-#<g&дает True(разрыв между текущим простым и следующим простым меньше, чем g).

ngenisis
источник
2

R + gmp, 55 байт

Использует функцию nextprime из библиотеки gmp

s=2;n=scan();while((x=gmp::nextprime(s))-s<n)s=x;cat(s)
MickyT
источник
Вы должны добавить cat(s)в конце. Неявная печать не работает в полных программах.
JAD
2

С = 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 байта, благодаря floorcat:

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

HatsuPointerKun
источник
Можно повернуть вспять return 0; return 1и убрать !доp(++n)
потолок кошка
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.
Захари
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 плохо играет в гольф, его нельзя использовать ;как пустое утверждение.
Zachary
источник
2

Perl 6 , 41 37 байт

{+(1...(^$_+*)>>.is-prime eqv!<<^$_)}

Попробуйте онлайн!

объяснение

{                                   }  # Block taking n as $_
   1...   # Sequence 1,2,... until
       (^$_+*)  # Range [i,i+n)
              >>.is-prime  # is-prime for each
                          eqv!<<^$_  # Equals (True,False,False,False,...)?
 +(                                )  # Length of sequence
nwellnhof
источник
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 ...
steenbergh
источник
1

05AB1E , 9 байтов

∞<ØD¥I@Ïн

Попробуйте онлайн или проверьте все контрольные примеры . (Test Suite не содержит последние два тестовых случая, потому что время ожидания 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  
RosLuP
источник