弱い素数ですか?


26

最も近い他の素数がそれより小さい場合、素数は弱いです。同点がある場合、素数は弱くない。

たとえば、71は素数ですが、75は複合であるため、73は弱い素数です。

仕事

入力として2より大きい素数を指定すると、それが弱い素数であるかどうかを判断するコンピューターコードを記述します。これは標準のため、2つのケース(weakおよびなどnot weak)ごとに2つの一意の値を出力する必要があります。

これはので、タグの標準ルールが適用されます。

OEIS

以下は、最初の47の弱い素数です。

3, 7, 13, 19, 23, 31, 43, 47, 61, 73, 83, 89, 103, 109, 113, 131, 139, 151, 167, 181, 193, 199, 229, 233, 241, 271, 283, 293, 313, 317, 337, 349, 353, 359, 383, 389, 401, 409, 421, 433, 443, 449, 463, 467, 491, 503, 509, 523, 547, 571, 577, 601, 619, 643, 647

弱い素数のOEIS(ここに戻る必要がありますweakOEIS A051635

バランスドプライムのOEISは次のとおりです(戻る必要がありますnot weakOEIS A006562

ここに強い素数のOEISがあります(戻る必要がありますnot weakOEIS A051634


not weakまたはstrong
電卓

7
@CalculatorFeline弱くは強くない
小麦ウィザード

回答:


26

ゼリー、7バイト

Æn+Æp>Ḥ

オンラインでお試しください!

説明

           See if
Æn         the next prime
  +Æp      plus the previous prime
     >Ḥ    is greater than 2n

ボーナスとして、変化>=又は<それぞれ、バランスのとれた強い素数をチェックします。


それはあり>ますか?
デニス

2
うわー、それは賢い
...-ETHproductions

私もこの方法で解決しました。よくやった!
ジョナサンアラン

これは...とても賢いです
エリックOutgolfer

12

Mathematica、24バイト

n=NextPrime;2#+n@-#<n@#&

NextPrimeビルトイン(AB?)することができ、それに負の引数を供給することによって、以前の素数を計算するために使用されます。


6

ゼリー、9 バイト

ḤÆRạÞ⁸ḊḢ>

戻り1弱いためと0(戻り弱いまたはバランスしないため1の入力用2

オンラインでお試しください!

どうやって?

ḤÆRạÞ⁸ḊḢ> - Link: prime number > 2, p
Ḥ         - double -> 2*p
 ÆR       - yield primes between 2 and 2*p inclusive
     ⁸    - chain's left argument, p
    Þ     - sort by:
   ạ      -   absolute difference (i.e. distance from p)
      Ḋ   - dequeue (removes p from the list, since it has distance zero)
       Ḣ  - head (gives us the nearest, if two the smallest of the two)
        > - greater than p?

複雑な溶液でNinja'd私を...
エリックOutgolfer

一瞬でした!
ジョナサンアラン

1
いいえ、そうではありませんでした。9秒のiircでした。いいえ、10秒。
エリックアウトゴルファー

だから、それは(時間を見て)私がここに提出したときに起こった:)
ジョナサンアラン

1
まあ、(それが最初から行くにはかなりの旅だ...あなただけ速く私よりgolfed思えるIIṠ⁼1までII>0I<\...あなたはかかわらず、非常に異なっています)。あなたは私とは違うと思うようです...編集:Pietu1998が戻ってきました!
エリックアウトゴルファー





3

GNU APL 1.2、78バイト

∇f N
X←(R←(~R∊R∘.×R)/R←1↓⍳N×2)⍳N
(|R[X-1]-N)<|R[X+1]-N
∇

∇f N 引数を取る関数を宣言します。

(~R∊R∘.×R)/R←1↓⍳N×22から2倍の引数のすべての素数のリストを返します。次の素数は元の2倍よりも小さいと仮定しています。これが正しくない場合、N*2Nの2乗を与え、同じバイト数を取ります(次の素数を超えるのに十分な大きさであることが望ましい)。(素数発見の仕組みについては、ウィキペディアの説明を参照してください)

X←(R←(...))⍳Nそのリストをベクトルに割り当てR(以前の内容を上書き)、Nそのリスト内の元の素数のインデックスを見つけてから、そのインデックスをに割り当てますX

|R[X-1]-N前の素数の差を計算し(R素数が含まれているため、X-1th要素はの前の素数ですNN、絶対値を取ります(APLは右から左に演算します)。

|R[X+1]-N 同じことをしますが、次の素数のために。

(|R[X-1]-N)<|R[X+1]-N前の素数が次の素数よりも元の素数に近い場合は1を出力し、そうでない場合は0を出力します。優先順位を付けるには括弧が必要です。

関数を終了します。




2

Perl 6、41バイト

{[>] map ->\n{$_+n,*+n...&is-prime},1,-1}

オンラインでお試しください!

$_関数への引数です。マッピング関数-> \n { $_ + n, * + n ... &is-prime }は数nを取り、$_ + n, $_ + 2*n, ...それが素数に達すると終了する一連の数を返します。二つの数字の上にこの機能をマッピング1し、-12つの配列のシーケンスを生成します。最初はで始まり、$_ + 1より大きい最初の素数で終わり$_、2番目は$_ - 1より小さい最初の素数で始まり、最初の素数で終わり$_ます。 [>]より大きい演算子を使用してこの2要素リストを縮小し、最初のシーケンスが2番目のシーケンスより大きい(つまり長い)場合にtrueを返します。


2

Python 2.7-120バイト

from math import*
i=lambda x:factorial(x-1)%x==x-1
def f(n,c):return 1 if i(n-c)>i(n+c) else 0 if i(n+c)>0 else f(n,c+1)

pythonにはis is prime関数が組み込まれていないため、ウィルソンの定理を使用して短い素数チェッカーを取得できます。ウィルソンの定理は、(n-1)の場合にのみ数が素数であると述べています!-1 mod(n)と一致します。したがって、関数iは、数値が素数の場合は1を返し、そうでない場合は0を返します。それに続いて、f関数は、その数からの次の素数が、増分ではなく増分で最初に発生するかどうかを判別します。インクリメントされた数値のどちらも素数でない場合、単に再帰的に呼び出されます。

I / Oの例

f(3,1)
1
f(15,1)
0


2

正規表現(ほとんどのフレーバー)、47バイト

^(?=(x*)(?!(x+)(\2\2x)+$)\1)x+(?!(xx+)\4+$)\1\1

オンラインでお試しください!

入力を単項で取ります。弱い素数に一致するものを出力します。非弱い素数には一致しません。ECMAScript、Perl、PCRE、Python、Rubyで動作します。

説明:

Nを入力、Aを最も近い素数<N、Bを最も近い素数> Nとする2b + 1が素数で、2b + 1> Nである最小のbを見つけます。これにより、2b + 1 = Bが保証されます。

(?=
  (x*)              # \1 = N - b, tail = b
  (?!(x+)(\2\2x)+$) # Assert 2b + 1 is prime
  \1                # Assert b ≥ \1 (and thus 2b + 1 > N)
)

次に、実際にAを見つける必要がないことに注意してください。任意の素数<NがBよりもNに近い限り、Nは弱い素数です。

x+                  # tail iterates over integers < N
(?!(xx+)\4+$)       # assert tail is prime
\1\1                # assert tail ≥ 2 * \1 (and thus tail + B > 2N)


1

JavaScriptのES6、162 154バイト

JörgHülsermannに基づく8バイトの節約のトリック「1つのケースで何も印刷しない」に。する必要はありません?"Y":"N"one<two

var isWeak=

a=>{p=[2];i=0;f=d=>{j=p[i];l:while(j++){for(x=0;p[x]*p[x]<=j;x++){if(j%p[x]==0){continue l}}return p[++i]=j}};while(p[i]<a+1){f()};return a*2<p[i]+p[i-2]}

[43,//true
53,//false
7901,//false
7907,//true
1299853,//true
1299869//false
].forEach(n=>{console.log(n,isWeak(n))})




0

JavaScript、98バイト

let test = _=>(o.innerHTML=f(+prime.value))
let f= 

n=>{P=n=>{for(i=n,p=1;--i>1;)p=p&&n%i};a=b=n;for(p=0;!p;P(--a));for(p=0;!p;P(++b));return n-a<b-n}
Enter Prime: <input id="prime">
<button type="button" onclick="test()">test if weak</button>
<pre id="o"></pre>

ゴルファーが少ない

n=>{
   P=  // is a Prime greater than 1, result in p
       n=>{
           for(i=n,p=1;--i>1;)
               p=p&&n%i
       };

   a=b=n; // initialize lower and upper primes to n
   for(p=0;!p;P(--a)); // find lower,
   for(p=0;!p;P(++b)); // find upper,
   return n-a<b-n // is weak result
}

テストコードは、入力「prime」が実際に素数であるかどうかをチェックしないことに注意してください。


0

braingasm23 22バイト

1弱い素数および弱いで0はない素数に対して印刷します。

;>0$+L[->+>2[>q[#:Q]]]

チュートリアル:

;                       Read a number to cell 0
 >0$+                   Go to cell 1 and copy the value of cell 0
     L                  Make the tape wrap around after cell 1
      [              ]  Loop:
       ->+>               Decrease cell 1 and increase cell 0
           2[       ]     Twice do:
             >              Go to the other cell
              q[   ]        If it's prime:
                #:Q         Print the current cell number and quit

0

ジュリア0.6、64バイト

g(x,i)=0∉x%(2:x-1)?1:1+g(x+i,i);x->g(x,1)&(g(x-1,-1)<g(x+1,1))

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