Кубинські прими


20

З огляду на натуральне число n , поверніть nкубічний простір .

Кубинські прими

Кубинський прайм - це просте число форми

p=x3y3xy

де y>0 і x=1+y або x=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: Вони розбиваються на дві послідовності, залежно від того, чи x=1+y або x=2+y : A002407 та A002648


2
Чи можемо ми повернути перші n простих простих?
J42161217

@ J42161217 Ні, праймери повинні бути в порядку зростання.
дефект

Відповіді:


23

JavaScript (V8) , 54 байти

Повна програма, яка друкує кубічні праймери назавжди.

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

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

Примітка: Якщо у вас принтер нескінченний, не намагайтеся запускати це на консолі браузера , де це print()може мати інше значення.


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

Повертає n -й кубічний простір, 1-індексований.

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

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

Як?

Це ґрунтується на тому, що кубічні праймери є простими формами:

pn=3n24+1,n3

Вищеописану формулу можна записати так:

pn={3n2+14 if n is odd3n2+44 if n is even

або для будь-якого y>0 :

p2y+1=3(2y+1)2+14=3y2+3y+1
p2y+2=3(2y+2)2+44=3y2+6y+4

що становить x3y3xy дляx=y+1іx=y+2відповідно.


7

05AB1E , 16 12 9 байт

Створює нескінченний список.
Збережено 4 байти з формулою порту Кевіна Круїссена з Арнольдса .
Збережено ще 3 байти завдяки Grimy

∞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-індексований).

p=1+3n24p=1+3n2nn=ap13a=1a=4

2p=1+3n23p=1+3n2a{1,2,3,4}1:4a{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

3p=1+3n21=3(pn2)3

p=22p=1+3n2nn=2k+12p=4+12k(k+1)p=2+6k(k+1)p


як щодо уникнення циклу, використовуючи верхню межу на n-му кубинському простір?
Сіань

@ Xi'an Я думав про це, але не міг придумати таку межу. У вас є такий?
Робін Райдер

5

Мова Вольфрама (Mathematica) , 66 65 56 байт

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

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

  • J42161217 -1 , використовуючи ⌊ ⌋замістьFloor[ ]

  • аттинат

    • -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.
speedstyle


@attinat Я вважав, що формула Арнаульда працює лише для n> 2, тому я не починав з 0 - хоча, як у вашому прикладі, він працює для всіх n (тому що він починається 1 1 4 7 13 ... тому прайми дорівнюють 7 13. ..)
швидкісний стиль

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: Оновлення пояснення

pn=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 існує коротший цикл для попередньої перевірки. Дивіться мою редагування та відповідь на попередню перевірку SaraJ.
Кевін Круїссен

Я можу помилятися, але останнє %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]додано лише як пояснення.

Виводиться з новим рядком без обмежень.

Спробуйте це в Інтернеті (лише із необробленими пробілами, вкладками та новими рядками).

Пояснення в псевдокоді:

pn=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

Python 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

Відповідь, що надходить у змінну, зазвичай не вважається допустимою формою "вихід". Чи можете ви переробити свою відповідь, щоб результат був або виведений у stdout, або повернувся функцією?
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)

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

x=1+yx=2+y

p=(1+y)3y3(1+y)y=1+3y+3y2y=12±14+p13

p=(2+y)3y3(1+y)y=4+6y+3y2y=1±p13
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

вона заснована на: якщо y в N, можливим є кубинський прайм

S1=1+3y(y+1)

наступним можливим кубинським прем'єром буде

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