Кубинские простые


20

Учитывая натуральное число , возвратите -й кубинский премьер .NN

Кубинские простые

Кубинское простое число - это простое число вида

пзнак равноИкс3-Y3Икс-Y

где Y>0 и Иксзнак равно1+Y или Иксзнак равно2+Y

Детали

  • Вы можете использовать индексацию на основе 0 или 1, что вам больше подходит.
  • Вы можете вернуть N простое число с учетом индекса N или первых N простых чисел в возрастающем порядке, или же вы можете вернуть бесконечный список / генератор, который производит простые числа в возрастающем порядке.

Контрольные примеры

Первые несколько терминов следующие:

(#1-13)   7, 13, 19, 37, 61, 109, 127, 193, 271, 331, 397, 433, 547,
(#14-24) 631, 769, 919, 1201, 1453, 1657, 1801, 1951, 2029, 2269, 2437,
(#25-34) 2791, 3169, 3469, 3571, 3889, 4219, 4447, 4801, 5167, 5419,
(#35-43) 6211, 7057, 7351, 8269, 9241, 10093, 10267, 11719, 12097,
(#44-52) 12289, 13267, 13669, 13873, 16651, 18253, 19441, 19927, 20173

В OEIS можно найти больше терминов: они разделены на две последовательности, в зависимости от того, Иксзнак равно1+Y или Иксзнак равно2+Y : A002407 и A002648


2
Можем ли мы вернуть первые n простых чисел, не отсортированных?
J42161217

@ J42161217 Нет, простые числа должны быть в порядке возрастания.
flawr

Ответы:


23

JavaScript (V8) , 54 байта

Полная программа, которая печатает кубинские простые числа навсегда.

for(x=0;;){for(k=N=~(3/4*++x*x);N%++k;);~k||print(-N)}

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

NB. Если у вас нет бесконечной бумаги на принтере, не пытайтесь запустить ее в консоли браузера , где это print()может иметь другое значение.


JavaScript (ES6),  63 61 60  59 байт

Возвращает кубинскую простую, 1-индексированную.N

f=(n,x)=>(p=k=>N%++k?p(k):n-=!~k)(N=~(3/4*x*x))?f(n,-~x):-N

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

Как?

Это основано на том факте, что кубинские простые числа являются простыми числами вида:

пNзнак равно3N24+1,N3

Приведенная выше формула может быть записана как:

пNзнак равно{3N2+14 если N странно3N2+44 если N даже

или для любого Y>0 :

п2Y+1знак равно3(2Y+1)2+14знак равно3Y2+3Y+1
п2Y+2знак равно3(2Y+2)2+44знак равно3Y2+6Y+4

который Икс3-Y3Икс-Y дляИксзнак равноY+1иИксзнак равноY+2соответственно.


7

05AB1E , 16 12 9 байт

Создает бесконечный список.
Сохранено 4 байта с формулой порта Арно для Кевина Круйссена .
Сохранено еще 3 байта благодаря Грими

∞n3*4÷>ʒp

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

объяснение

∞          # on the list of infinite positive integers
 n3*4÷>    # calculate (3*N^2)//4+1 for each
       ʒp  # and filter to only keep primes

Вы сделали опечатку в своем объяснении: « положить копию N^2+3в стек » должно быть 3*N^2. Кроме того, почему )вместо ¯? Потому что проще набирать? И по какой-то причине я чувствую, что NnN‚3*¬sO‚может быть на 1 байт короче, но я этого не вижу. Незначительная равно байты альтернатива Nn3*DN3*+‚. Но я, наверное, просто вижу вещи, которых там нет ...;) Хороший ответ, так что +1 от меня.
Кевин Круйссен

1
Я на самом деле пытался перенести свой ответ на 05AB1E, но с треском провалился. : D
Арно

1
На самом деле, создавая бесконечный список удобнее: 9 байт с ∞n3 * 4 ÷> ʒp
Grimmy

1
ОК, я не привык к спецификациям, которые противоречат самим себе. :-)
WGroleau

6
@WGroleau Я предполагаю, что вы никогда не разрабатывали программное обеспечение профессионально. Меня больше беспокоит, когда я получаю характеристики, которые не противоречат самим себе.
MikeTheLiar

7

R , 75 73 байта

n=scan()
while(F<n)F=F+any(!(((T<-T+1)*1:4-1)/3)^.5%%1)*all(T%%(3:T-1))
T

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

-2 байта, заметив, что я могу удалить скобки, если я использую *вместо &(другой приоритет).

Выводится nкубинское простое число (1-индексируется).

Он использует тот факт (приведенный в OEIS), что кубинские простые числа имеют вид пзнак равно1+3N2 или 4пзнак равно1+3N2 для некоторого N , т.е. Nзнак равноaп-13 является целым числом дляaзнак равно1илиaзнак равно4.

Хитрость в том, что простое число не может иметь форму 2пзнак равно1+3N2 или 3пзнак равно1+3N2 (*), поэтому мы можем сохранить 2 байта, проверив формулу для a{1,2,3,4} ( 1:4) вместо a{1,4} ( c(1,4)).

Слегка неутешная версия кода:

# F and T are implicitly initialized at 0 and 1
# F is number of Cuban primes found so far
# T is number currently being tested for being a Cuban prime
n = scan()                       # input
while(F<n){
  T = T+1                        # increment T 
  F = F +                        # increment F if
    (!all(((T*1:4-1)/3)^.5 %% 1) # there is an integer of the form sqrt(((T*a)-1)/3)
     & all(T%%(3:T-1)))          # and T is prime (not divisible by any number between 2 and T-1)
  }
T                                # output T

(*) Простое число не может иметь форму 3пзнак равно1+3N2 , иначе 1знак равно3(п-N2) будет делиться на 3 .

Никакое простое число, кроме пзнак равно2 (которое не является кубинским простым), может иметь вид 2пзнак равно1+3N2 : N должно быть нечетным, то есть Nзнак равно2К+1 . Расширение дает 2пзнак равно4+12К(К+1) , следовательно, пзнак равно2+6К(К+1) и п будет четным.


как насчет того, чтобы избежать цикла, используя верхнюю границу n-го кубинского простого числа?
Сиань

@ Сиань, я думал об этом, но не мог придумать такой границы. У тебя есть?
Робин Райдер

5

Wolfram Language (Mathematica) , 66 65 56 байт

(f=1+⌊3#/4#⌋&;For[n=i=0,i<#,PrimeQ@f@++n&&i++];f@n)&

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

  • J42161217 -1 с использованием ⌊ ⌋вместоFloor[ ]

  • attinat

    • -1 используя ⌊3#/4#⌋вместо⌊3#^2/4⌋
    • -8 для For[n=i=0,i<#,PrimeQ@f@++n&&i++]вместоn=2;i=#;While[i>0,i-=Boole@PrimeQ@f@++n]

1
65 байтов . Добро пожаловать в PPCG. Хороший первый ответ! +1
J42161217

Благодарность! (Долгое время скрывался.) Я не мог разобрать ваш существующий ответ, поэтому я написал свой, и он оказался немного короче. Я мог бы сделать Python один тоже.
спидстайл


@attinat Я думал, что формула Арно работает только для n> 2, поэтому я не начинал с 0 - хотя, как в вашем примере, он работает для всех n (потому что он начинается с 1 1 4 7 13 ... поэтому простые числа 7 13. ..)
speedstyle

3

Java 8, 94 88 86 84 байта

v->{for(int i=3,n,x;;System.out.print(x<1?++n+" ":""))for(x=n=i*i++*3/4;~n%x--<0;);}

-6 байт с помощью Java- праймера @SaraJ , так что убедитесь, что проголосовали за нее!
-2 байта благодаря @ OlivierGrégoire . Так как первое число, которое мы проверяем, это то 7, что мы можем отбросить трейлинг %nот прайм- чека Сары, который должен завершить цикл n=1.
-2 байта благодаря @ OlivierGrégoire путем переноса ответа @Arnauld .

Выводы разделены пробелом на неопределенный срок.

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

Пояснение (старой 86-байтовой версии): TODO: обновить объяснение

пNзнак равно3N24+1,N3

v->{                     // Method with empty unused parameter and no return-type
  for(int i=3,           //  Loop-integer, starting at 3
          n,x            //  Temp integers
      ;                  //  Loop indefinitely:
      ;                  //    After every iteration:
       System.out.print( //     Print:
        n==x?            //      If `n` equals `x`, which means `n` is a prime:
         n+" "           //       Print `n` with a space delimiter
        :                //      Else:
         ""))            //       Print nothing
    for(n=i*i++*3/4+1,   //   Set `n` to `(3*i^2)//4+1
                         //   (and increase `i` by 1 afterwards with `i++`)
        x=1;             //   Set `x` to 1
        n%++x            //   Loop as long as `n` modulo `x+1`
                         //   (after we've first increased `x` by 1 with `++x`)
             >0;);}      //   is not 0 yet
                         //   (if `n` is equal to `x`, it means it's a prime)

Я не думаю, что это возможно, но другой способ найти кубинские простые числа использует эту формулу: v->{for(int n=7,i=3,p,x,d,r=0;;i+=++r%2*3,n+=i,System.out.print(x>1?x+" ":""))for(x=n,d=1;++d<n;x=x%d<1?0:n);}может быть, кто-то может использовать это для игры в гольф? Я не мог
Оливье Грегуар

1
@ OlivierGrégoire Вы можете сыграть в свой гольф немного больше, удалив неиспользованное ,pи изменив i+=++r%2*3,n+=iна n+=i+=++r%2*3, но тогда я все равно получу 106 байтов. Использование Java 11 - й String#repeatс прайм-регулярным выражением составляет 105 байт: v->{for(int n=7,i=3,r=0;;n+=i+=++r%2*3)if(!"x".repeat(n).matches(".?|(..+?)\\1+"))System.out.println(n);}.
Кевин Круйссен

Да, я догадывался, что это не очень хорошо для игры в гольф, несмотря на мои (теперь очевидные) ошибки. Спасибо, что подвезли;)
Оливье Грегуар

@ OlivierGrégoire Может быть, вам тоже полезно это знать, но в Java, по-видимому, более короткий цикл первичной проверки. См. Мое редактирование и ответ по первичной проверке Сараджа.
Кевин Круйссен

Я могу ошибаться, но последнее %nне обязательно, не так ли?
Оливье Грегуар




1

Пробел , 180 байт

[S S S T    S N
_Push_2][S N
S _Duplicate][N
S S N
_Create_Label_OUTER_LOOP][S N
N
_Discard_top_stack][S S S T N
_Push_1][T  S S S _Add][S N
S _Duplicate][S N
S _Duplicate][T S S N
_Multiply][S S S T  T   N
_Push_3][T  S S N
_Multiply][S S S T  S S N
_Push_4][T  S T S _Integer_divide][S S S T  N
_Push_1][T  S S S _Add][S S S T N
_Push_1][S N
S _Duplicate_1][N
S S S N
_Create_Label_INNER_LOOP][S N
N
_Discard_top_stack][S S S T N
_Push_1][T  S S S _Add][S N
S _Duplicate][S N
S _Duplicate][S T   S S T   T   N
_Copy_0-based_3rd][T    S S T   _Subtract][N
T   S T N
_Jump_to_Label_PRINT_if_0][S T  S S T   S N
_Copy_0-based_2nd][S N
T   _Swap_top_two][T    S T T   _Modulo][S N
S _Duplicate][N
T   S S S N
_Jump_to_Label_FALSE_if_0][N
S N
S N
_Jump_to_Label_INNER_LOOP][N
S S T   N
_Create_Label_PRINT][T  N
S T _Print_as_integer][S S S T  S T S N
_Push_10_(newline)][T   N
S S _Print_as_character][S N
S _Duplicate][N
S S S S N
_Create_Label_FALSE][S N
N
_Discard_top_stack][S N
N
_Discard_top_stack][N
S N
N
_Jump_to_Label_OUTER_LOOP]

Буквы S(пробел), T(табуляция) и N(новая строка) добавляются только как подсветка.
[..._some_action]добавлено только в качестве объяснения.

Выводит символ новой строки на неопределенный срок.

Попробуйте онлайн (только с необработанными пробелами, вкладками и новыми строками).

Объяснение в псевдокоде:

пNзнак равно3N24+1,N3

Integer i = 2
Start OUTER_LOOP:
  i = i + 1
  Integer n = i*i*3//4+1
  Integer x = 1
  Start INNER_LOOP:
    x = x + 1
    If(x == n):
      Call function PRINT
    If(n % x == 0):
      Go to next iteration of OUTER_LOOP
    Go to next iteration of INNER_LOOP

function PRINT:
  Print integer n
  Print character '\n'
  Go to next iteration of OUTER_LOOP

1

Питон 3 , 110 108 102 байта

Метод, аналогичный моему ответу Mathematica (т. Е.isPrime(1+⌊¾n²⌋) else n++ ), Использующий эту простейшую проверку и возвращающий анонимный бесконечный генератор

from itertools import*
(x for x in map(lambda n:1+3*n**2//4,count(2)) if all(x%j for j in range(2,x)))

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

  • mypetlion -2, потому что возможно разрешены анонимные генераторы, чем именованные
  • -6 , начиная countс 2 +1, так что and x>1в заимствованной мною первичной проверке нет необходимости -7

Ответ, входящий в переменную, обычно не считается допустимой формой «вывода». Не могли бы вы переработать свой ответ так, чтобы результат либо выводился на стандартный вывод, либо возвращался функцией?
mypetlion

1
так как анонимные функции разрешены, а вызов явно разрешает бесконечный генератор, я удалил g=. Я включил его только в первую очередь, потому что он позволял быстро визуализировать с TIO print(next(g) for i in range(52)).
Спидстайл

1

Japt , 14 13 байт

Адаптировано из формулы Арно . 1-индексироваться.

@µXj}f@Ò(X²*¾

Попытайся

1 байт сохранен благодаря EmbodimentOfIgnorance.


13 байт? Хотя не проверено полностью.
Воплощение Неведения

Спасибо, @EmbodimentofIgnorance. Я попробовал это, но это не сработало; Оказывается, я забыл (.
Лохматый


1

Python 3 , 83 байта

печатает кубинские простые числа навсегда.

P=k=1
while 1:P*=k*k;x=k;k+=1;P%k>0==((x/3)**.5%1)*((x/3+.25)**.5%1-.5)and print(k)

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

Иксзнак равно1+YИксзнак равно2+Y

пзнак равно(1+Y)3-Y3(1+Y)-Yзнак равно1+3Y+3Y2Yзнак равно-12±14+п-13

пзнак равно(2+Y)3-Y3(1+Y)-Yзнак равно4+6Y+3Y2Yзнак равно-1±п-13
Y±-1


1

Perl 6 , 33 31 байт

-2 байта благодаря Грими

{grep &is-prime,1+|¾*$++²xx*}

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

Блок анонимного кода, который возвращает бесконечный список кубинских простых чисел. При этом используется формула Арно для генерации возможных кубинских простых чисел, а затем &is-primeдля их фильтрации.

Объяснение:

{                           }  # Anonymous code block
 grep &is-prime,               # Filter the primes from
                         xx*   # The infinite list
                   ¾*          # Of three quarters
                     $++²      # Of an increasing number squared
                1+|            # Add one by ORing with 1

1
1+0+|может быть просто1+|
Grimmy


0

APL (NARS), 98 символов, 196 байтов

r←h w;y;c;v
r←c←y←0⋄→4
→3×⍳∼0πv←1+3×y×1+y+←1⋄r←v⋄→0×⍳w≤c+←1
→2×⍳∼0πv+←3×y+1⋄c+←1⋄r←v
→2×⍳w>c

с отступом:

r←h w;y;c;v
r←c←y←0⋄→4
    →3×⍳∼0πv←1+3×y×1+y+←1⋄r←v⋄→0×⍳w≤c+←1
    →2×⍳∼0πv+←3×y+1⋄c+←1⋄r←v
    →2×⍳w>c

тестовое задание:

  h ¨1..20
7 13 19 37 61 109 127 193 271 331 397 433 547 631 769 919 1201 1453 1657 1801 
  h 1000
25789873
  h 10000
4765143511

он основан на: если у в N, один из возможных кубинских премьер

S1=1+3y(y+1)

следующий возможный кубинский премьер будет

S2=3(y+1)+S1
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.