Asal boşlukları bulun


27

Bir birinci boşluk , iki ardışık asal arasındaki farktır. Daha spesifik olarak, eğer p ve q , p < q ve p + 1, p +2, ..., q −1 olan primerler ise, pr ve p ve q , n = q - p aralığını tanımlar . Boşluk olduğu söylenen ait göre p ve olması uzunluğu n .

Keyfi olarak büyük ana boşlukların olduğu bilinmektedir. Başka bir deyişle, n verildiğinde, n veya daha büyük bir uzunluk aralığı vardır . Bununla birlikte, tam uzunluktaki bir ana boşluk n olmayabilir (ancak daha büyük bir tek olacaktır).

Meydan okuma

Olumlu bir tamsayı verildiğinde n, uzunluk nveya daha büyük bir boşluk başlatan ilk prime çıktı .

Örnek olarak, girdi 4için çıktı şöyle olmalıdır 7, çünkü 7 ve 11, en az 4 farklı olan ilk ardışık primerlerdir (önceki boşluklar 1, 2 ila 3; 2, 3 ila 5 ve 2, 5'tir) 7'ye). Girdi 3için cevap da olmalıdır 7(3 uzunluk aralığında boşluk yoktur).

Ek kurallar

Test durumları

Input -> Output

1        2
2        3
3        7
4        7
6        23
10       113
16       523
17       523
18       523
30       1327
50       19609
100      370261
200      20831323


Pq ile demek istiyorsun, değil mi?
Outgolfer Erik,

@EriktheOutgolfer Evet; düzeltildi, teşekkürler!
Luis Mendo


Yanıtlar:


3

Gaia , 6 bayt

zṅọ⊃∆ṇ

Bu son derece yetersiz ( 16test durumunun makinemde hesaplanması bir saatten fazla sürdü).

Çevrimiçi deneyin!

açıklama

Sıra, bir (n) <= 2 ^ n özelliğine sahip görünüyor .

z       Push 2^input.
 ṅ      Get the first 2^input prime numbers.
  ọ     Get the deltas of the list.
   ⊃∆   Find the index of the first that is greater than or equal to the input.
     ṇ  Push the index-th prime number.

9

Jöle , 10, 9, 8 10 bayt

Æn_$:ð1#»2

Çevrimiçi deneyin!

@Dennis sayesinde iki bayt kurtarıldı! (ve kenar davaları nedeniyle tekrar geri eklendi)

Açıklama:

Æn          #   The next prime after 'P'
  _$        #   Minus 'P'
    :       #   Divided by 'N'
            #
            # This will give a falsy value unless the distance to the next prime is >= N
            #
     ð      # Treat all of that as a single dyad (fucntion with two arguments). 
            # We'll call it D(P, N)
            #
      1#    # Find the first 'P' where D(P, input()) is truthy
        »2  # Return the maximum of that result and 2

Sonuçların girdilere her zaman eşit veya eşit olacağından emin miyiz? ( #buradaki girdiden sayılacaktır) Bunu varsaymak makul gözükebilir, ancak geçerli bir varsayım olup olmadığı hakkında bir fikrim yok. EDIT: FYI ile (gerekirse) öneki düzeltmek için
Jonathan Allan

5
@ JonathanAllan Bertrand'ın önerisi , bir asalın boşluğunun kesinlikle asalın kendisinden daha az olduğu anlamına gelir.
Dennis,

@Dennis parlak çok teşekkür ederim! TMYK ...
Jonathan Allan,

4

Mathematica, 30 bayt

2//.x_ /;NextPrime@x-x<#:>x+1&

Çevrimiçi deneyin!

Mathematica, 35 bayt

(t=2;While[NextPrime@t-t<#,t++];t)&

Çevrimiçi deneyin!

Mathematica, 77 bayt

Prime@Min@Position[s=Differences@Prime@Range[(r=#)^3+1],#&@@Select[s,#>=r&]]&

Zeki Zeki ... hatta emin olmak gerekir hem yok pve qasal ... Açıkça argüman beslemek sürece sadece 65535 yükseldiği için ilk kod olsa da, geçersiz görünüyor MaxIterations.
JungHwan Min,

Ayrıca, 35 bayt sürümü için -2 bayt:(For[t=2,NextPrime@t-t<#,t++];t)&
JungHwan Min

4

Haskell , 106 102 93 77 73 72 bayt

Bu, ilk önce sonsuz bir primler listesi oluşturur, ardından asal boşlukları arar. Asıl liste buradan alındı . Muhtemelen kısaltılabilir, ama henüz nasıl olduğunu çözemedim :)

-4 bayt için @BruceForte ve -1 bayt için @Zgrab'a teşekkürler!

f n=[x|(y,x)<-zip=<<tail$[n|n<-[2..],all((>0).rem n)[2..n-1]],y-x>=n]!!0

Çevrimiçi deneyin!


Tabii ki bazı monad sihir var, teşekkürler :)
kusurları

zip=<<tail$[...]bir bayt kaydeder.
Zgarb

“Bu önce sonsuz bir primler listesi oluşturur , sonra…”: peki, o zaman asla olmamalı mı? (yani, yalnızca çok uzun bir süre sonra, prosedürel olarak sonsuz bir primer listesi "ilk üretme" zamanı gelecektir)
Olivier Dulac

1
Haskell tembel değerlendirme kullanıyor, bu yüzden sadece bu listenin pek çok girişi gerçekte kullanıldığı gibi üretiliyor. Böylece bu primiler, noktaları bulduğumuz noktaya kadar oluşturulur. Eğer denerseniz, herhangi nbir süre için belirli bir süre sonra duracağını göreceksiniz :) (Haskell bir prosedür değil, tembel değerlendirme ile işlevsel bir dildir.)
kusur

1
Sonsuz bir liste, tanımı gereği bir sonu yok. Açıkladığım şey, her zamanki tercümanlarda kaputun altında olan şeydir, ancak bu dilin bir parçası olarak belirtilmez, bu yüzden bunu söyleyemezsiniz!
kusur

3

Pyth - 14 bayt

[1, inf) 'ten filtreler, ilke ( P_)' e göre filtreleme yapar ve (n, inf) 'ten filtrelenen bir sonraki prime girdiden farklı bir> = olur.

f&P_T<tQ-fP_Yh

Test Takımı .


3

PowerShell , 97 96 91 bayt

param($n)for($a=$b=2){for(;'1'*++$b-match'^(?!(..+)\1+$)..'){if($b-$a-ge$n){$a;exit}$a=$b}}

Çevrimiçi deneyin!

Girdiyi alır $n, ayarlar $ave $beşittir 2, sonra sonsuz bir fordöngüye girer . İçeride, bir sonraki prime$b ulaşana kadar devam ederiz . Sonra biz kontrol (yani boşluk) 'dir reaterthanor için qual . Eğer durum bu ise, biz çıktı ve . Aksi halde olmaya karar veririz ve arttırır ve bir sonraki aramaya başlarız.$b-$a-ge$n$aexit$a$b$b

Uyarı: Bu yavaş büyük girişi için. Aslında, 5060'ların TIO'daki zaman aşımı süresi içinde veya daha yüksek testleri tamamlayamaz . Oh iyi.


3

Kabuğu , 13 11 10 bayt

´ȯ!V≥⁰Ẋ-İp

Çevrimiçi deneyin!

´       İp  -- with the primes
 ȯ!         -- get the value at position
      Ẋ-    -- where the difference of the current and next prime
   V≥⁰      -- is greater or equal than the input N

3

Mathematica, 39 bayt

(For[i=2;p=NextPrime,i+#>p@i,i=p@i];i)&
(* or *)
(For[i=1;p=Prime,p@i+++#>p@i,];p[i-1])&

33 byte sürümü (geçerli değil çünkü yalnızca 65535'inci prime kadar)

p=NextPrime;2//.i_/;p@i-i<#:>p@i&



2

Mathematica, 37 bayt

gNestWhile[p=NextPrime,2,p@#-#<g&]

Functionilk argümanla g. İle başlayarak 2, fonksiyonu uygular p=NextPrimetekrar tekrar sürece p@#-#<g&verir True(bu astar ve sonraki astar arasındaki boşluk daha az olan g).


2

R + gmp, 55 bayt

Gmp kütüphanesindeki nextprime işlevini kullanır

s=2;n=scan();while((x=gmp::nextprime(s))-s<n)s=x;cat(s)

cat(s)Sonuna eklemelisin . Örtük yazdırma tam programlarda çalışmaz.
JAD,


2

C = 141 109 bayt; C ++, D = 141 bayt; C #, Java = 143 bayt

UYARI : DÜŞÜK PERFORMANS ALGORİTMASI

Bu kod, asıl boşluğu g(200)10 dakika içinde hesaplayamadı . İçin g(100)(C ++ versiyonu) 10 saniye sürdü,

C ++ ve D versiyonu:

int p(int d){for(int i=2;i<=d/2;++i){if(!(d%i))return 0;}return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do{++n;}while(!p(n));}return f;}

C # ve Java sürümü:

int p(int d){for(int i=2;i<=d/2;++i){if(d%i==0)return 0;}return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do{++n;}while(p(n)==0);}return f;}

C tipi, tavan tipi sayesinde -32 bayt:

i;p(d){for(i=2;d/2/i;)if(!(d%i++))return 0;return 1;}f;n;g(d){for(f=2,n=3;n-f<d;)for(f=n;!p(++n););return f;}

C # / Java ve C / C ++ / D versiyonu arasındaki farklar: !p(n)<==>p(n)==0


Önce tersine çevirip return 0; return 1kaldırabilirsiniz!p(++n)
ceilingcat

d%i==0ve !(d%i)olabilir d%i<0. Aynı zamanda, D'nin şablon sistemi kullanılarak D çözüm olabilir: T p(T)(T d){for(T i=2;i<=d/2;++i)if(d%i<1)return 0;return 1;}T g(T)(T d){T f=2,n=3;while(n-f<d){f=n;do++n;while(!p(n));}return f;. ( fordo
Sonradan

C / C ++ / C # / Java'da bulunamayan D'ye özgü püf noktaları kullanan ayrı bir D versiyonunu yayınladım.
Zacharý

int p(int d){for(int i=2;i<=d/2;++i)if(!(d%i))return 0;return 1;}int g(int d){int f=2,n=3;while(n-f<d){f=n;do++n;while(!p(n));}return f;}<- bu C ++ sürümü için çalışmalı
Zacharý

2

D, 127 125 122 bayt

UYARI: DÜŞÜK PERFORMANS ALGORİTMASI !!

T p(T)(T d){T r;for(T i=2;i<=d/2;)r=d%i++<1||r;return r;}T g(T)(T d){T f=2,n=3;while(n-f<d){f=n;while(p(++n)){}}return f;}

Çevrimiçi deneyin!

Nasıl?

HatsuPointerKun tekrar, ama D belirli büyücülük yapacağım.

  • Şablon sistemi türleri çıkartabilir T p(T)(T d)ve C ++ 'dan daha kısa
  • r=d%i++<1||r, D belirli shenanigan, C / C ++ 'de çalışabilir, ama bilmiyorum.
  • p(++n), yukarıdakiyle aynı, C / C ++ ile çalışıp çalışmadığından emin değil
  • while(p(++n)){}Burada, D neden golf oynamakta kötü görünüyor, biri ;boş ifade olarak kullanılamıyor.

2

Perl 6 , 41 37 bayt

{+(1...(^$_+*)>>.is-prime eqv!<<^$_)}

Çevrimiçi deneyin!

açıklama

{                                   }  # Block taking n as $_
   1...   # Sequence 1,2,... until
       (^$_+*)  # Range [i,i+n)
              >>.is-prime  # is-prime for each
                          eqv!<<^$_  # Equals (True,False,False,False,...)?
 +(                                )  # Length of sequence

1

QBIC , 28 bayt

{~µs||~s-r>=:|_Xr\r=s]]s=s+1

açıklama

{         DO
~µs||     IF s is prime THEN (note, s starts as 3)
~s-r>=:   IF the gap between s (current prime) and r (prev prime) is big enough
|_Xr      THEN QUIT, printing prev prime r
\r=s      ELSE (gap too small, but s is prime), set r to prime s
]]        END IF x2, leaving us in the WHILE
s=s+1     increment s, retest for primality ...

1

05AB1E , 9 bayt

∞<ØD¥I@Ïн

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın . (Test Paketi son iki test senaryosunu içermiyor çünkü TIO bunun için zaman aşımına uğradı.)

Yana diğer soru, bu birinin dupe olarak kapalıdır , ben post ediyorum cevabımı burada da.

Açıklama:

           # Get an infinite list in the range [1, ...]
 <          # Decrease it by one to make it in the range [0, ...]
  Ø         # Get for each the (0-indexed) n'th prime: [2,3,5,7,11,...]
   D        # Duplicate this list of primes
    ¥       # Get all deltas (difference between each pair): [1,2,2,4,2,...]
     I@     # Check for each if they are larger than or equal to the input
            #  i.e. 4 → [0,0,0,1,0,1,0,1,1,0,...]
       Ï    # Only keep the truthy values of the prime-list
            #  → [23,31,47,53,61,...]
        н   # And keep only the first item (which is output implicitly)
            #  → 23

1

Java 8, 99 92 bayt

n->{int a=2,b=3,f,k;for(;b-a<n;)for(f=0,a=b;f<2;)for(f=++b,k=2;k<f;)f=f%k++<1?0:f;return a;}

Çevrimiçi deneyin. (En büyük test durumu TIO'da zaman aşımına uğradığı için hariç tutulmuştur.)

Açıklama:

n->{               // Method with integer as both parameter and return-type
  int a=2,b=3,     //  Prime-pair `a,b`, starting at 2,3
      f,           //  Prime-checker flag `f`, starting uninitialized
      k;           //  Temp integer, starting uninitialized
  for(;b-a         //  Loop as long as the difference between the current pair of primes
          <n;)     //  is smaller than the input
    for(f=0,       //   (Re)set the prime-checker flag to 0
        a=b;       //   Replace `a` with `b`, since we're about to search for the next prime-pair
        f<2;)      //   Inner loop as long as the prime-checker flag is still 0 (or 1)
                   //   (which means the new `b` is not a prime)
      for(f=++b,   //    Increase `b` by 1 first, and set this value to the prime-checker flag
          k=2;     //    Set `k` to 2
          k<f;)    //    Inner loop as long as `k` is still smaller than the prime-checker flag
        f=         //     Change the prime-checker flag to:
          f%k++<1? //      If the prime-checker flag is divisible by `k`
           0       //       Set the prime-checker flag to 0
          :        //      Else:
           f;      //       Leave it unchanged
                   //    (If any integer `k` in the range [2, `b`) can evenly divide `b`,
                   //     the prime-checker flag becomes 0 and the loop stops)
  return a;}       //  And finally after all the nested loops, return `a` as result

1

Düzenli , 33 bayt

{x:({v:⊟v<=-x}↦primes+2)@0@0}

Çevrimiçi deneyin!

Veya, 28 karakter / 34 bayt: {x:({v:⊟v≤-x}↦primes+2)@0@0}

Bunu eşdeğer bir ASCII eşdeğeri kullanarak açıklayacağım:

{x:({v:(-)over v<=-x}from primes+2)@0@0}
{x:                                    }    lambda w/ parameter `x`
                          primes+2          overlapping pairs of primes
                                            [[2, 3], [3, 5], [5, 7], ...]
    {v:             }from                   select prime pairs `v = [a, b]`...
       (-)over v                            ...where `a` - `b`...
                <=-x                        is <= `x`
   (                              )@0@0     select the first element of the first pair

1

APL (NARS), 36 karakter, 72 bayt

∇r←h w;k
r←2
→0×⍳w≤r-⍨k←1πr⋄r←k⋄→2
∇

1π, “sonraki üssü” işlevidir; Ölçek:

  h¨1 2 3 4 6 10 16 17 18 30 50 100 200
2 3 7 7 23 113 523 523 523 1327 19609 370261 20831323  
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.