Asal Sayıların Yalnızlığı


24

Geçenlerde , ana karakterlerin ikiz asal sayılarla karşılaştırıldığında "Asal Sayıların Yalnızlığı" adlı romanını okudum (" her zaman birlikte, ancak asla dokunmadan ").

Bir ikiz asal -örneğin bir asal sayı, çift ana çifti (41, 43) 2 daha az ya da 2 doğalarında bir asal sayıdır. Başka bir deyişle, ikiz bir asal, ikilik asal boşluğa sahip bir asaldır. Bazen ikiz asal terimi bir çift ikiz asal için kullanılır; Bunun için alternatif bir isim asal ikiz veya asal çift. Vikipedi

Her ne kadar iç karartıcı romanı pek sevmedim ve son zamanlarda PPCG'ye girdiğimden beri, bu aklımda bir soru sordu ...

Görev:

N> 4 pozitif bir tam sayı verildiğinde , ikiz asalların en yakın çiftleri arasındaki yalnız asal sayıları (AKA yalıtımlı asal sayılar ) bulun .

Lütfen, bu durumda yalnız asal sayılar terimi ile, ikiz asal olmayan ve çift asal çiftlerin arasındaki tüm asal sayıları kastediyorum . Bu yüzden N> 4 çünkü asal sayıların ilk iki çifti (3, 5) ve (5, 7).

Örnek:

  1. N = 90
  2. İkiz primerin ilk iki çiftini <N ve> N bul. Bunlar: (71, 73) ve (101, 103).
  3. > 73 ve <101 aralığında yalnız astarları bulun .
  4. Onlar: 79, 83, 89, 97.

Özel durumlar:

  • N, iki ikiz asal sayı arasındaysa, ikiz primerlerin en yakın çiftini> N + 1 ve <N-1 olarak bulun. Örnek: N = 72,> 73 ve <71 ikiz primerlerin en yakın çiftlerini bulun ve ardından 71 ve 73 listesinden çıkarlar çünkü yalnız prime değildirler . N = 72 için beklenen sonuç şudur: 67, 71 , 73 , 79, 83, 89, 97
  • N birkaç ikiz prime aitse, örneğin N = 73 ise, ikiz primerlerin en yakın çiftleri (71, 73) ve (101, 103) 'dir. N = 71 ise ikiz primerlerin en yakın çiftleri (59, 61) ve (71, 73) 'dir.

Test durumları:

N = 70   >  Lonely primes are:  67
N = 71   >  Lonely primes are:  67
N = 72   >  Lonely primes are:  67, 79, 83, 89, 97 (not the twins 71 and 73)
N = 73   >  Lonely primes are:  79, 83, 89, 97 
N = 90   >  Lonely primes are:  79, 83, 89, 97
N = 201  >  Lonely primes are:  211, 223
N = 499  >  Lonely primes are:  467, 479, 487, 491, 499, 503, 509

Kurallar:

  • Standart girişten N sayısını alacak olan tam bir program veya işlev yazın.
  • Çıkış listesini yalnız asal vb CSV, liste, dizi olarak okunabilir bir biçimde
  • En kısa kod kazanır.
  • Lütfen (mümkün olduğunda) test edilebilir bir çevrimiçi keman ekleyin.

4
71, 72 veya 73 gibi girdiler için beklenen çıktı nedir?
Martin Ender

1
Yalnız Başbakan AKA İzole Başbakan
Dijital Travma

@MartinEnder Sorumu özel durumlarla genişlettim. Açıklama için teşekkürler.
Mario

1
Özel davaları zorluğu biraz bozuyor (ve bazı cevaplar daha önce yayınlandığında eklendi)
Luis Mendo

1
@JonathanAllan Evet, N> 4'ü düşünebilirsiniz, çünkü ikiz asal sayıların ilk iki çifti (3, 5) ve (5, 7) 'dir. Herkese açıklık getirmek için şartname ekledim.
Mario

Yanıtlar:


2

Aslında, 47 bayt

Dava ile Bu çözüm fırsatlar nolmadığını kontrol ederek, iki ikiz asal arasındadır alt sınır olan büyük ikiz asal bir çift (bizim alt sınır olmaktan bizi sola ikiz asal ortadan kaldırarak) ve eğer üst sınır DİR Daha küçük (bizim üst sınır olmaktan bize sağındaki ikiz asal ortadan kaldırarak) ikiz asal bir çift. Biz alt ve üst sınırlar içermez kez bizim aralığına dahil edilmesini ikiz asal önlemek için, asal kaldırmak gerekir pnerede p-2VEYA p+2kodunda dolayısıyla YA mantıklı ve inkâr, asal vardır.

Bu biraz uzun ve muhtemelen daha fazla golf oynayabilir. Golf önerileri kabul edilir. Çevrimiçi deneyin!

╗1`╜+;⌐p@p&`╓F╜+1`╜-;¬p@p&`╓F╜-x`;;¬p@⌐p|Y@p&`░

Ungolfing

╗         Store implicit input n in register 0.

1`...`╓   Get the first value x for which the following function f returns a truthy value.
  ╜         Push n from register 0.
  +         Add x to n.
  ;⌐        Duplicate n+x and add 2 to a copy of n+x.
  p         Check if n+x+2 is prime.
  @p        Swap n+x to TOS and check if n+x is prime.
  &         Logical AND the two results.
F         Push the first (and only) result of previous filtering
╜+        Add that result to n to get the upper bound for our solitude.

1`...`╓   Get the first value x for which the following function f returns a truthy value.
  ╜         Push n from register 0.
  -         Subtract x from n.
  ;¬        Duplicate n-x and subtract 2 from a copy of n-x.
  p         Check if n-x-2 is prime.
  @p        Swap n-x to TOS and check if n-x is prime.
  &         Logical AND the two results.
F         Push the first (and only) result of previous filtering.
╜-        Subtract that result from n to get the lower bound for our solitude.

x`...`░   Push values of the range [a...b] where f returns a truthy value. Variable m.
  ;;        Duplicate m twice.
  ¬p        Check if m-2 is prime.
  @⌐p       Check if m+2 is prime. 
  |Y        Logical OR the results and negate.
             This eliminates any numbers with neighboring primes.
  @p        Check if m is prime.
  &         Logical AND primality_check(m) and the previous negation.
             This keeps every other prime number in the range.

23Giriş 24yapıldığında beklenen çıktı elde edemiyorum . İkiz asal sınırları olmalı 17 / 19ve 29 / 31ve 23aralıkta izole bir asal 19 .. 29.
AdmBorkBork 28:16

@TimmyD Oh, esolanjların aşkı için. Ya hata pdiyor 25asal henüz sabit değil, ya Dennis hata düzeltme beri Aslında çekmemiş olmasıdır. Kontrol edeyim.
Sherlock9

@TimmyD Hata düzeltme işlemi zaten tamamlandığından, bu cevap ana tercüman çalıştığı halde hala geçerlidir. Sadece çevrimiçi tercüman olan Try It Online'ın henüz güncellenmemiş olduğu durumdu. O zamandan beri güncellendi ve TIO şimdi çalışmalı.
Sherlock9

Yep - açıklama için teşekkürler!
AdmBorkBork 29:16

8

PowerShell v2 +, 237 149 147 231 216 181 174 169 166 bayt

param($n)filter f($a){'1'*$a-match'^(?!(..+)\1+$)..'}for($i=$n;!((f $i)-and(f($i+2)))){$i++}for(){if(f(--$i)){if((f($i-2))-or(f($i+2))){if($i-lt$n-1){exit}}else{$i}}}

Girdi alır $n. Yeni bir işlevi regex prime işlevi folarak tanımlar (giriş bir asal ya da değil ise burada bir Boole döndürür).

Sonraki parça $ieşit olacak şekilde ayarlanır $n, sonra ikiz asal çiftimizin alt yarısını üst sınır bulana kadar yukarı doğru döner. Örneğin, giriş için 90bu durur $i=101.

Daha sonra üst sınırdan aşağıya doğru döngülenir. Biliyorum, sonsuz bir döngüye benziyor, ama sonunda bitecek.

Mevcut sayısı bir asal (varsa f(--$i)), ancak onun +/- 2 değil bir başbakan, biz eklemek $iboru hattına. Bununla birlikte, eğer +/- 2bir üsse, bizden daha düşük olup olmadığımızı kontrol ederiz $n-1(yani ikiz bir asal çiftin içindeki durumu hesaba katmak için), hangi noktada biz exit. Program tamamlandığında, boru hattı ekranla örtük olarak yazdırılır Write-Output.

Not - Döngü yapısı nedeniyle astarları azalan sırayla yazdırır. OP bunun yolunda olduğunu netleştirdi.

Örnekler

Buradaki çıktı, boşlukla ayrılmıştır, çünkü bir dizinin varsayılan dize yöntemidir.

PS C:\Tools\Scripts\golfing> 70,71,72,73,90,201,499,982|%{"$_ --> "+(.\the-solitude-of-prime-numbers.ps1 $_)}
70 --> 67
71 --> 67
72 --> 97 89 83 79 67
73 --> 97 89 83 79
90 --> 97 89 83 79
201 --> 223 211
499 --> 509 503 499 491 487 479 467
982 --> 1013 1009 997 991 983 977 971 967 953 947 941 937 929 919 911 907 887

4

Haskell, 105 bayt

p x=all((>0).mod x)[2..x-1]
a%x=until(\z->p z&&p(z+2*a))(+a)x
f n=[x|x<-[(-1)%n+1..1%n-1],p x,1%x>x,(-1)%x<x]

Çevrimiçi Deneyin


3

JavaScript, 186 183 168 158 Bayt

// solution:
function d(d){function p(n){for(i=n;n%--i;);return!--i}u=d;for(;!p(d--)||!p(--d););for(;!p(u++)||!p(++u););for(;++d<u;)if(p(d)&&!p(d-2)&&!p(d+2))console.log(d)}

// runnable test cases:
console.info('Test ' + 70);
d(70);
console.info('Test ' + 71);
d(71);
console.info('Test ' + 72);
d(72);
console.info('Test ' + 73);
d(73);
console.info('Test ' + 90);
d(90);
console.info('Test ' + 201);
d(201);
console.info('Test ' + 499);
d(499);


PPCG'ye Hoşgeldiniz! Güzel ilk cevap.
AdmBorkBork

2

PHP, 207 bayt

is_primePHP'nin sahip olmadığı fonksiyon için 47 54 bayt . Mathematica'yı o olmadan yenerdim. :-D

function p($n){for($i=$n>1?$n:4;$n%--$i;);return$i<2;}if(p($n=$argv[1])&p($n+2)|$z=p($n-1)&p($n+1))$n-=2;for($n|=1;!p($n)|!p($n-2);$n--);for($z++;$z--;$n+=2)for(;$n+=2;)if(p($n)){if(p($n+2))break;echo"$n,";}

ile koş -r. sonunda virgül basar.

Yıkmak

// is_prime function:
// loops from $n-1 down to 1, breaks if it finds a divisor.
// returns true if divisor is <2 (==1)
// special case $n==1: initialize $i=4 to prevent warnings
function p($n){for($i=$n>1?$n:4;$n%--$i;);return$i<2;}

// is $n between primes?
if($z=p(1+$n=$argv[1])&p($n-1)) // set $z to go to the _second_ twin pair above
    $n-=2;
// no:
else
    if(p($n)&p($n+2))$n-=2;     // $n is part of the upper pair
    // p($n)&p($n-2):           // $n is part of the lower pair
    // else:                    // this is a lonely (isolated) prime

// 1. find closest twins <=$n
for($n|=1;!p($n)|!p($n-2);$n--);

// 2. list primes until the next twin primes
L:
for(;$n+=2;)if(p($n))
    if(p($n+2))break;       // next twin primes found: break loop
    else echo"$n,";         // isolated prime: print

// 3. if ($z) repeat (once)
$n+=2;  // skip twin pair
if($z--)goto L;

Not :

is_primeİşlev aslında döner trueiçin $n<2; ama en azından bir uyarı vermiyor. Düzeltmek için $n=önce ekleyin $n>1.


php.net/manual/en/function.gmp-nextprime.php bu kütüphane yardımcı olabilir mi?
Jörg Hülsermann

@ JörgHülsermann: En az 11 bayt verirseniz, gmp standart kurulumda olsaydı. Dene.
Titus

1

Mathematica, 169 157 bayt

Select[PrimeQ]@Sort@Flatten@{If[q@#,0,#],Most@NestWhileList[i-=2;#+i&,#,!q@#&]&/@(i=3;q=PrimeQ@#&&Or@@PrimeQ[{2,-2}+#]&;#+{1,-1}(1+Boole@PrimeQ[{1,-1}+#]))}&

1

Raket 228 bayt

(λ(n)(let*((t 0)(lr(λ(l i)(list-ref l i)))(pl(drop(reverse(for/list((i(in-naturals))#:when(prime? i)#:final(and(> i n)
(= 2(- i t))))(set! t i)i))2)))(for/list((i(length pl))#:break(= 2(-(lr pl i)(lr pl(add1 i)))))(lr pl i))))

Bu sürümün dezavantajı, yalnızca N etrafındakileri değil, N'ye kadar tüm asal sayıları bulmasıdır.

Ungolfed versiyonu:

(define (f n)
  (let* ((t 0)
         (lr (λ(l i) (list-ref l i)))
         (pl (drop(reverse  
                   (for/list ((i (in-naturals))
                              #:when (prime? i)
                              #:final (and
                                       (> i n)
                                       (= 2 (- i t))))
                     (set! t i)
                     i)) 2)))
    (for/list ((i (length pl))
               #:break (= 2 (- (lr pl i) (lr pl (add1 i)))) )
      (lr pl i)))
)

Test yapmak:

(f 90)

Çıktı:

'(97 89 83 79)

1

Raket 245 bayt

(λ(n)(let((pl(reverse(let lp((n n)(t 0)(ol '()))(set! t(prev-prime n))(if(and(>(length ol)0)
(= 2(-(car ol)t)))(cdr ol)(lp t 0(cons t ol)))))))(let lq((n n)(t 0)(ol pl))(set! t(next-prime n))
(if(= 2(- t(car ol)))(cdr ol)(lq t 0(cons t ol))))))

Ungolfed versiyonu:

(require math)
(define f
  (lambda(n)
    (let ((pl 
           (reverse
            (let loop ((n n) (t 0) (ol '()))
              (set! t (prev-prime n))
              (if (and
                   (> (length ol) 0)
                   (= 2 (- (car ol) t)))
                  (cdr ol)
                  (loop t 0 (cons t ol)))))))
      (let loop2 ((n n) (t 0) (ol pl))
        (set! t (next-prime n))
        (if (= 2 (- t (car ol)))
            (cdr ol)
            (loop2 t 0 (cons t ol))))))
  )

(f 90)

Çıktı:

'(97 89 83 79)

1

Python 2.7: 160 bayt

t=lambda n:all(n%d for d in range(2,n))
def l(n):
 i=n
 while t(i)*t(i+2)-1:i+=1
 while t(n)*t(n-2)-1:n-=1
 print[x for x in range(n,i)if t(x)&~(t(x-2)|t(x+2))]

öneri bekliyoruz :)

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.