素数の孤独


24

最近、私は小説「素数の孤独」を読みましたそこでは、主人公は双子の素数と幾分比較されます(「常に一緒ですが、触れない」)。

双子素数は、例えば-for別の素数、双子素数対(41、43)よりも2少ない又は2以上のいずれかである素数です。言い換えれば、双子素数は2の素数ギャップを持つ素数です。ツインプライムという用語は、ツインプライムのペアに使用されることがあります。これの別名は、プライムツインまたはプライムペアです。ウィキペディア

気のめいるような小説はあまり好きではありませんでしたが、最近PPCGに陥ったので、それが私の頭の中に疑問を投げかけました...

仕事:

N> 4の正の整数を考えると、双子の素数の最も近いカップルの間の孤独な素数(別名孤立素数)を見つけます

この場合、孤独な素数という用語では、双子の素数ではなく、双子の素数のペアの間にあるすべての素数を意味することに注意してください。N> 4の理由は、最初の2組の素数が(3、5)と(5、7)であるためです。

例:

  1. N = 90。
  2. 双子素数の最初の2つのペア<Nおよび> Nを見つけます。それらは(71、73)および(101、103)です。
  3. 73から101の範囲で孤独な素数を見つけます。
  4. 79、83、89、97です。

特殊なケース:

  • Nが2つの双子素数の間にある場合は、最も近い双子素数のペア> N + 1および<N-1を見つけます。例:N = 72は、彼らではないので、リスト71と73から除外する双子素数> 73と<71の最も近いカップルを見つける孤独な素数。そうN = 72期待される結果のためのものである:67、7173、79、83、89、97
  • Nがツインプライムのカップルに属している場合、たとえばN = 73の場合、ツインプライムの最も近いカップルは(71、73)と(101、103)です。N = 71の場合、双子素数の最も近いカップルは(59、61)と(71、73)です。

テストケース:

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

ルール:

  • 標準入力から数値Nを取得する完全なプログラムまたは関数を作成します。
  • 孤独な素数のリストを、csv、list、arrayなどの読み取り可能な形式で出力します。
  • 最短のコードが優先されます。
  • (可能な場合)テスト可能なオンラインフィドルを含めてください。

4
71、72、73のような入力に対して期待される出力は何ですか?
マーティンエンダー

1
孤独なプライム別名隔離されたプライム
デジタル外傷

@MartinEnder特別なケースで質問を拡張しました。説明をありがとう。
マリオ

1
特別なケースが少し挑戦を台無しにしている(そしていくつかの答えが既に投稿されていたときに追加された)
ルイスメンドー

1
@JonathanAllanはい、双子の素数の最初の2つのペアは(3、5)と(5、7)であるため、N> 4と考えることができます。すべての人に明確にするために仕様を追加しました。
マリオ

回答:


2

実際には、47バイト

ケースと、このソリューションのお得な情報nかどうかをチェックすることにより、2つの双子素数の間で下限がある大きな双子素数のペアの(私たちの下限であることから私たちの左に双子素数を排除)し、もし上限 IS ツインプライムのペアの小さい方(右側のツインプライムが上限にならないようにします)。下限と上限があると双子の素数が範囲に含まれないようにするにはpp-2OR p+2が素数である素数を削除する必要があります。したがって、コード内の論理ORと否定です。

これは少し長く、おそらくさらにゴルフすることができます。ゴルフの提案を歓迎します。オンラインでお試しください!

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

アンゴルフ

╗         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.

23入力24が与えられたときに期待した出力が得られません。双子の素数の境界はである必要が17 / 19あり29 / 3123範囲内の孤立した素数です19 .. 29
AdmBorkBork

@TimmyDああ、エソランの愛のために。バグのどちらかpと言うが25素数ではまだ修正されていない、またはデニスはバグフィックスので、実際に引かれていません。確認しましょう。
Sherlock9

@TimmyDバグ修正はすでに完了しているため、メインのインタープリターが機能したため、この回答は引き続き有効です。オンライン通訳であるTry It Onlineがまだ更新されていないというだけでした。それは更新されており、TIOは現在動作するはずです。
Sherlock9

うん-説明ありがとう!
AdmBorkBork

8

PowerShell v2 +、237 149 147 231 216 181 174 169 166バイト

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}}}

入力を受け取ります$n。新しい関数f正規表現素数関数として定義します(入力が素数であるかどうかに応じてブール値を返します)。

次の部分は$iに等しくなるように設定し、双子素数ペアの上限の半分が$n見つかるまで上方向にループします。例えば、inputの場合、これはで停止します90$i=101ます。

次に、上限から下にループします。無限ループのように見えますが、最終的には終了します。

現在の数は(素数である場合f(--$i))、しかしそのが+/- 2 ない首相、我々は追加$iのパイプラインに。ただし、それ+/- 2が素数である場合、我々がより低いかどうかを確認します$n-1(つまり、双子の素数ペア内にあるときの状況を説明するため)exit。プログラムの完了時に、パイプラインは暗黙的にスクリーンに出力されますWrite-Output

注意-ループ構造のため、素数を降順で出力します。OPはそれが問題ないことを明確にしました。

ここでの出力はスペースで区切られています。これが配列のデフォルトの文字列化方法であるためです。

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


3

JavaScriptの、186 183 168 158のバイト

// 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へようこそ!いい最初の答え。
AdmBorkBork

2

PHP、207バイト

47is_prime PHPにない関数の場合は54バイト。私はそれなしでMathematicaを破りました。:-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,";}

で実行し-rます。末尾のコンマを出力します。

壊す

// 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;

注意

is_primeこの関数は、実際に返すtrueため$n<2。しかし、少なくとも警告は発生しません。修正する$n=$n>1に挿入します。


php.net/manual/en/function.gmp-nextprime.phpこのライブラリは役立ちますか?
ヨルクヒュルサーマン

@JörgHülsermann:gmpが標準インストールにある場合、少なくとも11バイトを与える場合。それを試してみてください。
タイタス

1

Mathematica、169 157バイト

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

ラケット228バイト

(λ(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))))

このバージョンの欠点は、Nの周りのものだけでなく、Nまでのすべての素数を見つけることです。

ゴルフされていないバージョン:

(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)))
)

テスト:

(f 90)

出力:

'(97 89 83 79)

1

ラケット245バイト

(λ(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))))))

ゴルフされていないバージョン:

(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)

出力:

'(97 89 83 79)

1

Python 2.7:160バイト

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))]

提案は大歓迎です:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.