Bertrand'ın Asalları


24

Bertrand's Postulate , her n ≥ 1 tamsayısı için en az bir asal p olduğunu, öyle ki n <p ≤ 2n olduğunu belirtir . Bu teoremi n <4000 için doğrulamak için 4000 vakayı kontrol etmemize gerek yoktur: Landau numarası , bunu kontrol yeterli olduğunu söylüyor

2, 3, 5, 7, 13, 23, 43, 83, 163, 317, 631, 1259, 2503, 5003

hepsi asal. Çünkü bu sayıların her biri, öncekinin iki katından daha az olduğundan, her aralık {y: n <y ≤ 2n} , bu asal sayıların en az birini içerir.

Bu sayı dizisi Bertrand Primes (OEIS A006992) 'dir ve şöyle tanımlanır:

a(1) = 2
a(n) = largest prime below 2a(n-1)

Meydan okuma

Bu sırayı uygulayın. Yazabilirsin

  • n dönüşü veren bir fonksiyon veya program bir (n) (endeksli 0 veya 1),
  • bazı n veren bir işlev veya program ilk n'yi (veya n-1 veya n + 1'i döndürür) bu dizinin ) girişlerini ,
  • dilinizdeki sonsuz bir liste veya akış veya jeneratör veya benzeri bir eşdeğeri.

Yanıtlar:


8

Oktav , 32 bayt

k=2
do k=primes(k+k)(end)until 0

Değerleri süresiz olarak yazdırmaya devam eder (her değerden önce gelir k =).

Çevrimiçi deneyin!


Oktav , 42 bayt

k=2
for i=2:input('')k=primes(k+k)(end)end

Alır N girdi olarak alır ve çıktı olarak , n (her değer öncesinde ilk değerleri k =).

Çevrimiçi deneyin!


Octave , 51 bayt

k=2;for i=2:input('')k=primes(k+k)(end);end
disp(k)

Benzer Luis Mendo en Matl cevap . Alır N girdi olarak alır ve çıktı olarak bir (n) (1 endeksli).

Çevrimiçi deneyin!


Oktav , 60 bayt

k=2;for i=2:input('')k*=2;while~isprime(--k)
end
end
disp(k)

Alır N girdi olarak alır ve çıktı olarak bir (n) (1 endeksli).

Çevrimiçi deneyin!


7

J , 11 bayt

_4&(p:+:)2:

Çevrimiçi deneyin!

0 endeksli.

_4&(p:+:)2:  Input: integer n
         2:  Constant 2
_4&(    )    Repeat n times
      +:       Double
_4  p:         Find the largest prime less than the double


6

05AB1E , 14 7 6 bayt

$F·.ØØ

Çevrimiçi deneyin!


1 indeksli cevap (0'ın 1 çıkması beklenmiyorsa), açıklama:

$       # Push 1 and input (n)...
 F      # n-times do... 
  ·     # Double the current prime (first iteration is 1*2=2).
   .ØØ  # Find prime slightly less than double the current prime.

1 indeksli çünkü tüm yinelemelerin 'kukla' yinelemeleri var n=1.


Fx.ØØçok yakın ... Yukarıdaki her şey için çalışıyor n > 2.
Magic Octopus Urn,

1
$F·ÅPθAynı bayt sayısı için de vardı .
Emigna

@Emigna vardı? Aynı haha% 0 gibi. Yani, teknik olarak aynı, ama değil. Hala gönderebilir miydi?
Magic Octopus Urn


5

Jöle , 6 bayt

2ḤÆp$¡

Çevrimiçi deneyin!

0 endeksli.

açıklama

2ḤÆp$¡  Main link. Input: n
2       Constant 2
    $¡  Repeat n times
 Ḥ        Double
  Æp      Find the largest prime less than the double

şimdi başka bir bayta ihtiyacınız olduğunu dürtmek ;) ...
Magic Octopus Urn

@ MagicOctopusUrn 0'ın bir girişi 2, 1, 3 vb. Döndürür. Ben bir sorun görmüyorum.
mil

Demek istediğim, kazanmak için bu cevaba bir bayt kaydetmeniz gerekiyor, çünkü sizi 6 bayt'a bağladım, cevabınız iyi.
Magic Octopus Urn

5

MATL , 9 bayt

1i:"EZq0)

N girişi , 1 indeksli bir ( n ) çıkışı verir .

Çevrimiçi deneyin!

açıklama

1       % Push 1
i       % Push input n
:"      % Do the following that many times
  E     %   Multiply by 2
  Zq    %   Primes up to that
  0)    %   Get last entry
        % End (implicit). Display (implicit)

5

Stax , 10 bayt

ü☼┌τ,æ▒ìn(

Test durumlarını çalıştır

Bu problem, stax'ın uygulanmasında :p, girdilerinden daha büyük bir üssü alan bir talimat olan bir hataya neden oldu . Doğru çalıştıysa, 5 6 baytlık bir çözüm olurdu . Ama ne yazık ki, değil ve yok. Dilin yaratıcısı olarak, onu düzelteceğim, ancak sorun yayınlandıktan sonra onu düzeltmek ve kullanmak biraz ucuz görünüyor.

Her neyse, burada yukarıdaki programın karşılık gelen ascii gösterimi.

ODH{|p}{vgs

Sorun bildiriminin nispeten basit bir uygulamasıdır. Bu konuda muhtemelen ilginç olan tek şey, gsjeneratör formunun kullanılmasıdır. Jeneratörler, bir veya daha fazla tatmin edici değer üretmek için başlangıç ​​koşulunu, dönüşümü ve filtreyi birleştiren bir yapı ailesidir. Bu durumda, verilen :ptalimatın yerine kullanılır .

O               Push integer 1 underneath the input number.
 D              Pop the input and repeat the rest of the program that many times.
  H             Double number.
   {|p}         Predicate block: is prime?
       {vgs     Decrement until the predicate is satisfied.
                Output is implicitly printed.

Düzenleme: İşte 6 baytlık çözüm, ancak yalnızca bu zorluğun yayınlanmasından sonra uygulanan bir hata düzeltmesi gerektiriyor.


Güzel dil! Bunu golf sopası listeme ekledim . Yanlış bir şey görürseniz veya eklemek istediğiniz başka bir şey varsa bana bildirin.
ETHProductions

@ETHproductions: Güzel, teşekkürler! Sakıncası yoksa, tercüman URL'sini staxlang.xyz olarak değiştirebilir misiniz? Bunun için bir etki alanı almaya karar verdim.
özyinelemeli

1
Vay, sadece bir golf dili için bütün bir etki alanı? Şanslı esolang;) Güncelleme!
ETHProductions

@recursive WOW, her xyz alan adı için 1,99 ABD doları?
Magic Octopus Urn

4

Python 2,63 bayt

r=m=k=P=2
while k:
 P*=k;k+=1
 if k>m:print r;m=r*2
 if P%k:r=k

Çevrimiçi deneyin!

Sonsuza dek yazdırır.

Bu problem için ileri primer üretme zor olsa da, Wilson'un Teorem üssü üretecini kullanır. Şu andaki en büyük prime rve iki kat sınırını izlerm .

İki bayt normalden P*=kziyade yapmaktan ziyade tasarruf P*=k*kedilir, çünkü tek etki 4'ün asal olduğunu iddia etmek ve iki katlama dizisi onu özlüyor.


4

CJam (15 bayt)

2{2*{mp},W=}qi*

Çevrimiçi demo . Bunun 0 indeksli olduğunu unutmayın.


Daha etkili bir yaklaşım geriye doğru arama yapmak olacaktır, ancak bu bir karakterden daha fazlasını gerektirir çünkü örtük ,(aralık) kullanamaz.

2{2*,W%{mp}=}qi*

4

Japt , 16 14 13 12 bayt

Her ikisi de 1 indeksli bir fiyat için iki çözüm.


8. Yarıyıl

Sonunda, bir meydan okuma kullanmak için çalışan bir çözüm yazabilirim F.g().

_ôZ fj Ì}g°U

Dene

                 :Implicit input of integer U
_       }g       :Starting with the array [0,1] take the last element (Z),
                 :pass it through the following function
                 :and push the returned value to the array
 ôZ              :  Range [Z,Z+Z]
    fj           :  Filter primes
       Ì         :  Get the last item
          °U     :Repeat that process U+1 times and return the last element in the array

İlk N Terimleri

ÆV=ôV fj ̪2

Dene

                 :Implicit input of integer U
                 :Also makes use of variable V, which defaults to 0
Æ                :Create range [0,U) and pass each through a function
  ôV             :  Range [V,V+V]
     fj          :  Filter primes
        Ì        :  Get the last item
         ª2      :  Logical OR with 2, because the above will return undefined on the first iteration
 V=              :  Assign the result of the above to V




2

Python 2 2,68 bayt

Diziyi süresiz olarak yazdırır (yürütmeyi durdurmak için ikinci kez "Çalıştır" ı tıklamanız gerekir).

k=2
while 1:
 print k;k+=k
 while any(k%u<1for u in range(2,k)):k-=1

Çevrimiçi deneyin!

Python 3 , 90 bayt

N. Terimi döndürür .

f=lambda n,i=1,p=1:n*[0]and p%i*[i]+f(n-1,i+1,p*i*i) 
a=lambda n:n and f(2*a(n-1))[-1]or 1

Çevrimiçi deneyin!


2

C (gcc) , 97 87 86 80 79 bayt

  • Bir birincil olmayan kontrol işlevinin satırını çizerek on bayt kaydedildi P ana döngüye girmesiyle .
  • Taşıyarak bir bayt kaydedildi printfAramayı .
  • Döndürerek altı bayt kaydedildi iHiç bitmeyen bir akış çıktısı yerine -th dizisi girişini (0 indeksli) .
  • Ceilingcat sayesinde bir bayt kaydedildi .
f(p,r,i,m,e){for(r=2;p--;)for(e=0,i=r+r;e=m=!e;r=i--)for(;i-++m;e=e&&i%m);p=r;}

Çevrimiçi deneyin!


@ceilingcat Teşekkürler.
Jonathan Frech

1

Ataşesi , 38 bayt

{If[_,Last[Series[Prime,2*$[_-1]]],2]}

Çevrimiçi deneyin!

0 tabanlı; nBertrand üssünü döndürür .

Şu anda önceki / sonraki asalları bulamazsınız, bu yüzden Seriesyerleşik olan tüm astarları hesaplamak için kullanıyorum 2*$[_-1]. Bu son ifade $, yineleme ilişkisini kolayca tanımlamak için örtük yinelemeyi (buna bağlı ) kullanır . İf koşulu bir baz koşulu belirlemek için kullanılır.



1

Retina , 39 bayt

.K`_
"$+"{`_
__
+`^(?=(..+)\1+$).

*\`_

Çevrimiçi deneyin! Açıklama:

.K`_

1 ile başlayın.

"$+"{`

Girdiyi döngü sayısı olarak kullanarak döngü tekrarlayın.

_
__

Değeri ikiye katlayın.

+`^(?=(..+)\1+$).

Değerden daha yüksek olan en yüksek primi bulun.

*\`_

Yazdır.


0

Ruby , 51 + 7 (-rprime) = 58 bayt

->n{x=2
n.times{x=(x..2*x).select(&:prime?)[-1]}
x}

Çevrimiçi deneyin!

Bertrand üssünü kabul nedip iade eden nth, 0 indeksli bir lamba . Burada fazla bir şey yok, ama yine de ungolf edeyim:

->n{
  x=2                       # With a starting value of 2
  n.times{                  # Repeat n times:
    x=(x..2*x)              # Take the range from x to its double
      .select(&:prime?)[-1] # Filter to only primes, and take the last
  }
  x                         # Return
}

Ruby , 48 + 7 = 55 bayt

x=2
loop{puts x
x*=2
loop{(x-=1).prime?&&break}}

Çevrimiçi deneyin!

Eğlence için, işte sonsuz döngü çözümü. Çalışırken yazdırır ve bir kesinti gerektirir. Kesin olarak kesinti yaptığınız zamana bağlı olarak, çıktıyı görebilirsiniz veya görmeyebilirsiniz. Ungolfed:

x=2
loop{
  puts x
  x*=2
  loop{
    (x-=1).prime? && break
  }
}

0

APL (Dyalog Genişletilmiş) , 12 bayt

Kullanıcıdan N olarak girdi alır, dizinin Nth elemanını döndürür (0-indexed).

42×⍵}⍣⎕⊢2

Çevrimiçi deneyin!

Açıklama:

42×⍵}⍣⎕⊢2  Full program
              Get input from user - call it 'N'
          2  Repeat the left function N times, beginning with 2
    2×⍵        Double the function input
 ¯4           Find the largest prime less than above

0

R, , 87 bayt

Verilen nçıktılara(n)

j=scan();n=2;while(j-1){for(i in (n+1):(2*n)){n=ifelse(any(i%%2:(i-1)<1),n,i)};j=j-1};n

Çevrimiçi deneyin!

Hala "Verilen n (a), bir (2) ... a (n)" üzerinde çalışıyorum. Bu kodu biraz değiştirebileceğimi düşündüm, ama bundan daha zor görünüyor.

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.