Sınırsız sayıda asal


26

Öklid'den beri, sonsuz sayıda asal olduğunu biliyoruz. Argüman çelişki gereğidir: sadece sonlu sayıda varsa, diyelim p1,p2,...,pn , sonra kesinlikle m:=p1p2...pn+1 , bu asal sayılardan hiçbiriyle bölünemez; bu nedenle asal çarpanlara ayırma, listede bulunmayan yeni bir asal üretmelidir. Bu yüzden, sadece son derece primerlerin var olduğu varsayımı yanlıştır.

Şimdi 2 tek asal olduğunu varsayalım . Yukarıdaki yöntem, yeni (olası) bir asal olarak 2+1=3 verir . Uygulama yöntemi, yeniden elde edilir 23+1=7 ve 237+1=43 , daha sonra 23743+1=13139 , her ikisi de çok 13 ve 139yeni asal sayılardır, vb. Kompozit bir sayı almamız durumunda, en az yeni asal sayıyı alırız. Bu A000945 ile sonuçlanır .

Meydan okuma

Bir asal verilen p1 ve bir tam sayı n hesaplamak n -inci süreli pn , aşağıdaki gibi tanımlanmış sekansın:

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

Bu diziler, Euclid-Mullin dizileri olarak bilinir .

Örnekler

İçin :p1=2

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

İçin ( A051308 ):p1=5

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

İçin ( A051330 )p1=97

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

Yanıtlar:


10

JavaScript (ES6),  45  44 bayt

0 indeksli (n)(p1)olduğu durumlarda girişi alır .n

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

Çevrimiçi deneyin!

Yorumlananlar

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 bayt

Bu üretir ve sonsuz çıkış akışı.

λλP>fW

Çevrimiçi deneyin! (bağlantı λ£λP>fW, bunun yerine ilk terimini çıkartan hafifçe değiştirilmiş bir sürüm içerir )n

açıklama

Çok basit. ve verildiğinde , program aşağıdakileri yapar:p1n

  • Sonsuz akış için ilk parametre olarak ile (ilkini kullanarak üretilir ) ve her etkileşimin ardından yeni bir terim üreten ve onu akışa özyinelemeli bir ortam başlatır .p1λ
  • İkinci λartık kullanılan, içinde yinelemeli bir ortamda, onun işlevselliğini değiştirir: Şimdi, daha önce oluşturulan elemanları alır (yani, liste ), burada mevcut yineleme sayısını temsil eder.[λ0,λ1,λ2,,λn1]n
  • Gerisi önemsiz: Pürünü alır ( ), bu ürüne bir tane ekler ve minimum asal çarpanı alır.λ0λ1λ2λn1>fW

6

J , 15 bayt

-10 byte mil sayesinde!

Diziyi n'ye (sıfır indeksli) döndürmek - miles sayesinde

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

Çevrimiçi deneyin!

J , 25 bayt

nTh öğesini döndürür

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

Çevrimiçi deneyin!


1
(,0({q:)1+*/)^:15 bayt için, diziyi n(sıfır dizine) kadar döndürür
mil

@miles Teşekkürler!
Galen Ivanov

Çok hoş. @miles Orada tam olarak ne oluyor gramer oluyor? birlikte bir fiil ve bir bağlaç koyarız ve tekrar bir fiil çekeriz. verb conj Bir zarf üretildiğini sanıyordum .
Jonah

1
@Jonah golf oynamaktan öğrendiğim bir numara. Bence hala geçerli olan eski ayrıştırma kurallarından biri
mil

@miles Ben sadece bir zarf (veya adnoun) olduğunu fark ettim. Bu sağındaki onun solunda, "ataşeler" için isim değiştirir ^:, sonra ve bu doğru arg için geçerli olan bir fiil haline gelir. Sanırım gramerde olan bu.
Jonah

5

Python 2 , 56 bayt

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

Çevrimiçi deneyin!


Yorumlananlar

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

Çevrimiçi deneyin!


Sadece Python ile başladı, ama ihtiyacınız yapmak int(input())aksi ibir olduğunu str?
Anthony

2
Python 3'te bu input()her zaman dizeleri döndürdüğü için doğru olacaktır . Python'da 2 input()girişi değerlendirmeye çalışır. Bu durumda Python 2 kullanıyorum çünkü elde edilen kod biraz daha kısa. İçin gerçek kod bunu Python daha yeni ve daha fazla desteklenen versiyonu olarak Python 3 kullanmaya çalışmalısınız.
ovs

N adımdan sonra bu nasıl sonlanır?
sintax

@ sintax, belirli bir p1 dizisini , varsayılan dizilim kurallarının izin verdiği şekilde, süresiz olarak verir .
ovs

4

Jöle , 8 bayt

P‘ÆfṂṭµ¡

ve kabul eden tam bir program (sıfır indeksleme kullanarak) , ila dahil üzere listesinin bir Jöle temsilini basar . (İkili bir Bağlantı olarak, bir liste ile değil, bir tamsayı geri verilecektir.)P0nP0Pnn=0

Çevrimiçi deneyin!

Nasıl?

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 bayt

GDˆ¯P>fß

İlk giriş , ikincisi asıl .np

Çevrimiçi deneyin veya çok daha fazla test durumu (test paketi için test , çünkü ve için yerleşik çok uzun sürüyor).n9p=2p=5f

Açıklama:

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)

Ben λλP>fWsonsuz liste olarak çıkış ve (6 bayt) λ£λP>fWbirinci (7 bayt) açısından. Ancak 9 bayt olmalı ... Keşke sonuncu eleman gibi bir bayrak da olsa! n thnnth£
Bay Xcoder

"Mr.Xcoder @ biz böyle bir bayrak vardı Keşke £ama geçen elemanı için! " Gibi ? ;) DÜZENLEME: Aslında, tam olarak böyle çalışmıyor £.. listeler için böyle bir listesini kullanarak [1,2]ile yani (son 1 ve 2 öğelerle iki gevşek öğeler sonuçların 12345olur [5,45]yerine [45,3]ya [3,45]sahip 12S.£) ..
Kevin Cruijssen

Hayır, nasıl λ.£çalışmalıyım anlamıyorum . Bayrakla ilişkili ek işlevlerde olduğu gibi kullandım λ( bu sohbete Adnan ile bakınız ). Temel olarak bazı bayrakların èçalıştırılmasını λè...}sağlarken, sonsuz akıştan ziyade n-inci elemanını üretmesini istiyorum (tıpkı λ£ilk n elemanlarını üretmek için çalışacağı gibi ).
Bay Xcoder

@ Mr.Xcoder Ah üzgünüm, £özyinelemeli çevre için kullandınız . Evet, o λ.£zaman gerçekten işe yaramayacak, benim hatam. Ne olursa olsun güzel 6-byter. Şimdi, sadece izin verilen olsun olmasın @flawr'ın cevabını beklemelisiniz (muhtemelen öyledir).
Kevin Cruijssen

3

Japt , 12 11 bayt

Bunu doğru yapmak için uğraştığımız için, golf oynayabilecek bir şeyi kaçırmış olabilirsiniz.

Alır nilk girdi olarak alır ve p1ikinci olarak, a tek bir dizi olarak,. İlk nterimleri döndürür . Değişim hiçin gdönmek nyerine Th 0-endeksli vadeli.

@Z×Ä k Î}hV

Dene

@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

Retina , 56 bayt

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

\*
,

Çevrimiçi deneyin! İlk satıra eklenecek yeni terim sayısı ve ikinci satıra ekim terimi olarak girdi alır. Not: Tekli çarpanlara ayırma kullandığından dolayı çok yavaş olur, bu nedenle ilgili uzunlukta bir dize oluşturması gerekir. Açıklama:

,|$
$*

Tohum terimlerindeki virgülleri *s ile değiştirin ve a ekleyin *. Bu, değerlerin ürününün uzunluğu için bir Retina ifadesi oluşturur.

"$&"{
)`

Döngüyü ilk giriş tarafından verilen kaç kez tekrarlayın.

~`.+¶
$$¶_

Geçici bir süre için, bir birinci hat numarasını değiştirmek $ve bir öne eklemek _daha sonra bu şekilde bir dizi ekleme, bir Retina programı olarak sonucunu değerlendirmek, ikinci hatta _daha değerleri ürün daha uzunluğu 1 s.

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

Ondalık sayıdaki en küçük önemsiz faktör bulun ve bir *sonraki döngü için hazır ekleyin .

1A`

Yineleme girişini silin.

.$

Sonuncuyu sil *.

\*
,

Kalan *s'yi s ile değiştirin ,.


2

JavaScript (Node.js) , 54 bayt

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

Çevrimiçi deneyin!

Ungolfed

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

bash + GNU coreutils, 89 bayt

IFS=\*;n=$1;shift;for((;++i<n;));{ set $@ `factor $["$*+1"]|cut -d\  -f2`;};echo ${@: -1}

TIO


2

Yakut 2.6, 51 bayt

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

(2..)2'den başlayan sonsuz aralık, henüz TIO'da desteklenmiyor.

Bu, başlangıç ​​değeri alan s(asal veya bileşik olabilir), özyinelemeli bir işlevdir, n = 0 olduğunda döndürür (düzenle: bunun sıfır indeksli olduğu anlamına gelir), l1'den büyük en az sayıyı verir ve -(s+1)n olduğunda böler = 1, ve aksi halde s=l*sve ile birlikte alır n=n-1.


1
Muhtemelen sıfır indeksli yaptığınızdan bahsetmelisiniz; Ben yerini (2..)ile 2.stepTIO üzerinde çalışmaya izin vermek (artık sadece 1 byte) ve her şey birer kapalı idi. Çevrimiçi deneyin!
Değerli Mürekkep

2

APL (Dyalog Genişletilmiş) , 15 bayt

Bu, Extended'ın yerleşik çok yardımcı temel faktörlerini kullanan algoritmanın oldukça basit bir uygulamasıdır . Çevrimiçi deneyin!

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

açıklama

{⍵,⊃⍭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 bayt

Nwellnhof sayesinde -1 bayt

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

Çevrimiçi deneyin!

Sayı alan ve tembel bir liste döndüren adsız kod bloğu.

Açıklama:

{                              }  # 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
-+^[*](@_)bir bayt kaydeder.
nwellnhof

0

Haskell , 49 bayt

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

Çevrimiçi deneyin!

Sonsuz diziyi tembel liste olarak döndürür.

Açıklama:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.