Нескінченно багато приматів


26

Починаючи з Евкліда, ми знали, що нескінченно багато праймів. Аргумент від противного: якщо існує лише кінцеве число, скажімо , p1,p2,...,pn , то точно m:=p1p2...pn+1 не ділиться жодним із цих праймес, тому його основна факторизація повинна дати новий прайм, який не був у списку. Тож припущення, що існують лише кінцеві прости, є хибним.

Тепер припустимо, що 2 є єдиним простим. Метод зверху дає 2+1=3 як новий (можливий) прайм. Застосовуючи метод знову, виходить 23+1=7 , а потім 237+1=43 , потім 23743+1=13139 , тому і 13 і 139- це нові праймери тощо. У випадку, коли ми отримуємо складене число, ми просто беремо найменше нове просте число. Це призводить до A000945 .

Виклик

Дано просте p1 і ціле n число обчислитиn -й членpn послідовності, визначеної наступним чином:

pn:=min(primefactors(p1p2...pn1+1))

Ці послідовності відомі як наслідки Евкліда- Малліна.

Приклади

Для p1=2 :

1 2
2 3
3 7
4 43
5 13
6 53
7 5
8 6221671
9 38709183810571

Для p1=5 ( A051308 ):

1 5
2 2
3 11
4 3
5 331
6 19
7 199
8 53
9 21888927391

Для p1=97 ( A051330 )

1 97
2 2
3 3
4 11
5 19
6 7
7 461
8 719
9 5

Відповіді:


10

JavaScript (ES6),  45  44 байт

Приймає введення як (n)(p1), де n - індексовано 0.

n=>g=(p,d=2)=>n?~p%d?g(p,d+1):--n?g(p*d):d:p

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

Прокоментував

n =>                // n = 0-based index of the requested term
  g = (             // g is a recursive function taking:
    p,              //   p = current prime product
    d = 2           //   d = current divisor
  ) =>              //
    n ?             // if n is not equal to 0:
      ~p % d ?      //   if d is not a divisor of ~p (i.e. not a divisor of p + 1):
        g(p, d + 1) //     increment d until it is
      :             //   else:
        --n ?       //     decrement n; if it's still not equal to 0:
          g(p * d)  //       do a recursive call with the updated prime product
        :           //     else:
          d         //       stop recursion and return d
    :               // else:
      p             //   don't do any recursion and return p right away

9

05AB1E , 6 байт

Це створює і нескінченний вихідний потік.

λλP>fW

Спробуйте в Інтернеті! (посилання включає дещо змінену версію λ£λP>fW, яка замість цього виводить першу н термінів)

Пояснення

Дуже прямо. Враховуючи p1 і н , програма виконує наступні дії:

  • Починається з p1 як початковий параметр для нескінченного потоку (який генерується за допомогою першого λ) і починає рекурсивне середовище, яке генерує новий термін після кожного наміру і додає його до потоку.
  • Другий λ, що зараз використовується всередині рекурсивного середовища, змінює свою функціональність: тепер він витягує всі створені раніше елементи (тобто список [λ0,λ1,λ2,,λн-1] ), де n являє собою поточний номер ітерації.
  • Pλ0λ1λ2λn1>fW

6

J , 15 байт

-10 байт завдяки милям!

Повернення послідовності до n (нульове значення) - завдяки @miles

(,0({q:)1+*/)^:

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

J , 25 байт

Повертає nth елемент

_2{((],0{[:q:1+*/@])^:[])

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


1
(,0({q:)1+*/)^:на 15 байт, повертаючи послідовність до n(нульового індексу)
миль

@miles Дякую!
Гален Іванов

Дуже хороша. @miles, що саме там відбувається граматично? ми ставимо дієслово і сполучник разом і отримуємо назад дієслово з діадією. Я думав, що verb conj виробив прислівник .
Іона

1
@Jonah це хитрість, яку я навчився з гольфу. Я думаю, що це одне із старих правил розбору, які досі діють
миль

@miles Я щойно зрозумів, що це прислівник (або прислівник). Вона змінює іменник зліва від неї , який «аташе» до праворуч від ^:, а потім , що стає дієсловом , який відноситься до правої арг. Я думаю, що це відбувається граматично.
Іона

5

Python 2 , 56 байт

i=input();k=1
while 1:
 k*=i;print i;i=2
 while~k%i:i+=1

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


Прокоментував

i=input() # the initial prime
k=1       # the product of all previous primes
while 1:  # infinite loop
 k*=i     # update the product of primes
 print i  # output the last prime
 i=2      # starting at two ...
 while~k%i: # find the lowest number that divides k+1
  i+=1
            # this our new prime

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


Я тільки почав з Python, але вам потрібно в int(input())іншому випадку iце str?
Антоній

2
У Python 3 це було б правдою, як input()завжди повертає рядки. У Python 2 input()намагається оцінити вхід. У цьому випадку я використовую Python 2, оскільки отриманий код трохи коротший. Для реального коду вам слід спробувати використовувати Python 3, оскільки це нова і підтримувана версія Python.
ов

Як це закінчується після n кроків?
sintax

@sintax він виводить послідовність для заданого p1 безстроково, як це дозволено правилами послідовності за замовчуванням .
ов

4

Желе , 8 байт

P‘ÆfṂṭµ¡

Повна програма (з використанням нульової індексації), яка приймає П0 і н який друкує представлення списку желе П0 до Пнвключно. (Як діадичне посилання, n=0нам буде повернуто ціле число, а не список.)

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

Як?

P‘ÆfṂṭµ¡ - Link: integer, p0; integer n
      µ¡ - repeat the monadic chain to the left n times, starting with x=p0:
P        -   product of x (p0->p0 or [p0,...,pm]->pm*...*p0)
 ‘       -   increment
  Æf     -   prime factors
    Ṃ    -   minimum
     ṭ   -   tack
         - implicit print

3

05AB1E , 8 байт

GDˆ¯P>fß

Перший вхід - н, друге - просте p.

Спробуйте в Інтернеті або в деяких інших тестових випадках (у тест-наборі відсутні тестові випадкин9, бо для p=2 і p=5вбудований fзаймає занадто багато часу).

Пояснення:

G         # Loop (implicit input) n-1 amount of times:
 Dˆ       #  Add a copy of the number at the top of the stack to the global array
          #  (which will take the second input p implicitly the first iteration)
   ¯      #  Push the entire global array
    P     #  Take the product of this list
     >    #  Increase it by 1
      f   #  Get the prime factors of this number (without counting duplicates)
       ß  #  Pop and only leave the smallest prime factor
          # (after the loop: implicitly output the top of the stack as result)

У мене був λλP>fW(6 байт) з виходом як нескінченний список і λ£λP>fW(7 байт) для першогонумови. Однак отриманнянгоповинно бути 9 байт ... Якби у нас був прапор, як £для останнього елемента!
Містер Xcoder

@ Mr.Xcoder " Якби у нас був прапор на зразок, £але для останнього елемента! ", Як ? ;) EDIT: Насправді, він не працює точно так, як £для списків. Використовуючи список, як [1,2]і результати з двома вільними елементами з останніми 1 та 2 елементами (тобто 12345стає [5,45]замість [45,3]або [3,45], з 12S.£) ..
Кевін Круїйссен,

Гм, ні, я не бачу, як λ.£має працювати. Я використовував прапор як додаткову функцію, пов'язану з λ(див. Цю розмову з Аднаном ). Я в основному хочу è, щоб такий прапор був таким, що при λè...}його запуску він буде генерувати n-й елемент, а не нескінченний потік (так само, як λ£би працював для генерації перших n елементів).
Містер Xcoder

@ Mr.Xcoder Ах вибачте, що ви використовували £для рекурсивного середовища. Так, тоді λ.£справді не вийде, мій поганий. Хороший 6-байтний незалежно. Тепер вам просто потрібно дочекатися відповіді @flawr , дозволено це чи ні (це, мабуть, так і є).
Кевін Круїссен

3

Japt , 12 11 байт

Напружився, щоб виправити це право, так що, можливо, пропустив щось, що можна пограти в гольф.

Приймає nяк перший вхід і p1як однотонний масив як другий. Повертає перші nдоданки. Змініть, hщоб gповернути замість цього n0-індексований термін.

@Z×Ä k Î}hV

Спробуй це

@Z×Ä k Î}hV     :Implicit input of integer U=n & array V=[p1]
@               :Function taking an array as an argument via parameter Z
 Z×             :  Reduce Z by multiplication
   Ä            :  Add 1
     k          :  Prime factors
       Î        :  First element
        }       :End function
         hV     :Run that function, passing V as Z, and
                : push the result to V.
                : Repeat until V is of length U

3

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

,|$
$*
"$&"{~`.+¶
$$¶_
)`\b(__+?)\1*$
$.1$*
1A`
.$

\*
,

Спробуйте в Інтернеті! Вводиться як кількість нових термінів, які потрібно додати в першому рядку, і початкові терміни (и) у другому рядку. Примітка: отримує дуже повільно, оскільки використовує одинарну факторизацію, тому їй потрібно створити рядок відповідної довжини. Пояснення:

,|$
$*

Замініть коми в насіннєвих термінах на *s та додайте a *. Це створює вираз Retina для рядка довжини добутку значень.

"$&"{
)`

Повторіть цикл кількість разів, заданих першим входом.

~`.+¶
$$¶_

Тимчасово замініть число в першому рядку на a $і додайте _до другого рядка, а потім оцініть результат як програму Retina, додавши таким чином рядок _s довжиною на 1 більше, ніж добуток значень.

\b(__+?)\1*$
$.1$*

Знайдіть найменший нетривіальний коефіцієнт числа в десяткових і додайте *готовий для наступного циклу.

1A`

Видаліть вхід ітерації.

.$

Видаліть останню *.

\*
,

Замініть решту *s на ,s.


2

JavaScript (Node.js) , 54 байти

f=(p,n,P=p,F=n=>-~P%n?F(n+1):n)=>--n?f(p=F(2),n,P*p):p

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

Безумовно

F=(p,n=2)=>            // Helper function F for finding the smallest prime factor
  p%n                  //   If n (starting at 2) doesn't divide p:
    ?F(n+1)            //     Test n+1 instead
    :n                 //   Otherwise, return n
f=(p,n,P=p)=>          // Main function f:
  --n                  //   Repeat n - 1 times:
    ?f(p=F(P+1),n,P*p) //     Find the next prime factor and update the product
    :p                 //   Return the last prime


2

Рубін 2,6, 51 байт

f=->s,n{[s,l=(2..).find{|d|~s%d<1}][n]||f[l*s,n-1]}

(2..), нескінченний діапазон починаючи з 2, ще не підтримується в TIO.

Це рекурсивна функція, яка приймає початкове значення s(може бути простим або складеним), повертає її, коли n = 0 (редагувати: зауважте, що це означає, що це нульове значення), повертає найменше число, lяке перевищує 1, і ділиться, -(s+1)коли n = 1, інакше повторюється з s=l*sі n=n-1.


1
Вам, мабуть, слід згадати, що ви робите нульовий показник; Я замінив (2..)на 2.step(всього на 1 байт довше), щоб він міг працювати над TIO, і все було вимкнено одним. Спробуйте в Інтернеті!
Значення чорнила

2

APL (розширений діалог) , 15 байт

Це досить проста реалізація алгоритму , який використовує розширені дуже корисні прості множники вбудований, . Спробуйте в Інтернеті!

{⍵,⊃⍭1+×/⍵}⍣⎕⊢⎕

Пояснення

{⍵,⊃⍭1+×/⍵}⍣⎕⊢⎕

             ⊢⎕  First get the first prime of the sequence S from input.
{         }⍣⎕    Then we repeat the code another input number of times.
     1+×/⍵       We take the product of S and add 1.
                Get the prime factors of product(S)+1.
                Get the first element, the smallest prime factor of prod(S)+1.
 ⍵,              And append it to S.




1

Perl 6 , 33 32 байти

-1 байт завдяки nwellnhof

{$_,{1+(2...-+^[*](@_)%%*)}...*}

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

Блок анонімного коду, який приймає номер і повертає лінивий список.

Пояснення:

{                              }  # Anonymous codeblock
                           ...*   # That returns an infinite list
 $_,                              # Starting with the input
    {                     }       # Where each element is
     1+(2...             )          # The first number above 2
                      %%*           # That cleanly divides
               [*](@_)                # The product of all numbers so far
            -+^                       # Plus one

1
-+^[*](@_)зберігає байт.
nwellnhof

0

Хаскелл , 49 байт

g 1
g a b=b:g(a*b)([c|c<-[2..],1>mod(a*b+1)c]!!0)

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

Повертає нескінченну послідовність у вигляді лінивого списку.

Пояснення:

g 1                                            -- Initialise the product as 1
g a b=                                         -- Given the product and the current number
       b:                                      -- Return the current number, followed by
         g                                     -- Recursively calliong the function with
          (a*b)                                -- The new product
               (                             ) -- And get the next number as
                [c|c<-[2..],             ]!!0  -- The first number above 2
                            1>mod       c      -- That cleanly divides
                                 (a*b+1)       -- The product plus one
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.