プライムを定義するさまざまな方法


32

素数の私のお気に入りの定義の1つは次のとおりです。

  • 2は最小の素数です。

  • 2より大きい数は、より小さい素数で割り切れない場合、素数です。

しかし、この定義はarbitrary意的と思われます。なぜ2なのでしょうか なぜ他の数字ではないのですか?まあ他のいくつかの数値を試してみましょう

  • nは最小のn素数です。

  • nより大きい数は、より小さいn素数で割り切れない場合、n素数です。

仕事

ここでのタスクは、2つの入力、正の整数とるプログラム書くことであるnは整数正。次に、an素数であるかどうかを判断します。プログラムは、「yes、it is n-prime」と「no、it is not n-prime」の2つの異なる値を出力する必要があります。

これはコードゴルフの質問なので、回答はバイト単位でスコアリングされ、バイト数は少ない方が良いでしょう。

テスト

以下は、n = 2からn = 12までの最初の31個の素数のリストです(1は唯一の1素数です)

n=2: [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=3: [3,4,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=4: [4,5,6,7,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=5: [5,6,7,8,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=6: [6,7,8,9,10,11,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=7: [7,8,9,10,11,12,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=8: [8,9,10,11,12,13,14,15,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=9: [9,10,11,12,13,14,15,16,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=10: [10,11,12,13,14,15,16,17,18,19,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=11: [11,12,13,14,15,16,17,18,19,20,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=12: [12,13,14,15,16,17,18,19,20,21,22,23,25,27,29,31,33,35,37,41,43,47,49,53,55,59,61,67,71,73,77]

4
n=6, a=15最初の興味深いテストケースです。
ニール

6
これは、非パターン「n≤a<2nまたは(a≥2nおよびaが素数である場合)がn素数である」が分解される最初の場所です。
ミシャラヴロフ

2
「2より大きい数は、より小さい素数で割り切れない場合、素数です。」-この定義により、任意の数を素数にすることができます。たぶん、あなたは言いたいIFF代わりの場合は

5
@ThePirateBay ifという言葉の正確な数学的意味を意味するものではありません。私はそれを残すつもりです。
小麦ウィザード

1
@JeppeStigNielsenこれを証明するのはそれほど難しくありません。n素数であるすべての合成数には、nより小さい素因数のみが必要です。また、それらの因子のサブセットがnより大きい積を持つことはできないこともわかっています。したがって、すべてのn素数は2素数か、nより小さい2つの数の積のいずれかです。nより小さい数のペアリングは有限数しかないため、合成n素数の有限数しかない。うまくいけば、それがコメントに収まるように短縮する必要がありました。
小麦ウィザード

回答:




4

Python 3バイト

lambda i,k:(i>k)<all(k%r for r in range(i,k))

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

使い方

これは、入力として2つの整数ikを取ります。最初かどうかをチェックし、私は≥K 。次に、範囲[i、k)を生成し、この範囲内の各整数Nについて、Nkと互いに素であるかどうかをチェックします。両方の条件が満たされる場合、ki素数です。


&代わりにand>=i代わりに使用できません>i-1か?
小麦ウィザード

@WheatWizard >=i はまだ4バイトです(スペースのため)。
ニール

@Neilに変更する&場合、スペースは必要ありません。
小麦ウィザード



3

J、30バイト

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:

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

右の引数として開始値を取り、左の引数でチェックする値を取ります。

私はもともと台無しにし、開始素数よりも少ない左の引数を説明しませんでした。私は今、私のソリューションの長さに不満を感じています。

説明

ましょうx左引数(チェックする値)とy右引数(開始プライム)。

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:
                          ^:>:  Execute left argument if x >= y
                     i.@[         Create range [0..x]
                   ]+             Add y to it (range now: [y..x+y])
                |/~               Form table of residues
            0=                    Equate each element to 0
          +/                      Sum columns
      1=                          Equate to 1
    -{                            Take the element at position x-y
>:*                             Multiply by result of x >= y

ノート

位置の要素は、元の範囲に追加したx-yため、素数テストの結果です。xy

で乗算x >: yすると0x未満のfalsey値()が取得されますy


3

JavaScript(ES6)、33 32 30バイト

カリー化構文の入力を受け取ります(n)(a)。ブール値を返します。

n=>p=(a,k=a)=>k%--a?p(a,k):a<n

デモ


3

Haskell、30バイト

flawrの答えから借りたH.PWizのアイデアのおかげで2バイト節約

n!a=[1]==[1|0<-mod a<$>[n..a]]

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

しばらくしてから、Haskellの唯一の答えは45バイトです。私は自分の答えを投稿することにしました。

説明

この関数は、チェックの間の唯一の番号ことNとことで割り切れるである自体。

今定義は唯一の言及n個よりも少ない-primes 、なぜ私たちは、これらすべての余分な数字をチェックしていますか?ときに我々は問題を持っていないいくつかで割り切れるnはより大きく-composite のn

ある場合ので、私たちはしませんn個よりも多い-composite nはそれは小さいで割り切れなければなりませんnは定義により、プライムが。したがって、aを除算する場合、より小さいn素数であるます。

場合よりも小さいnがあろうこのように等しくすることができないチェックが失敗する原因となります。 [n..a][][1]





1

dc40 34 37バイト

[0p3Q]sf?se[dler%0=f1+dle>u]sudle>u1p

TIOリンクを含めたはずですが、TIO dcはシステムで意図したとおりに動作するように見えるという誤った分布を持っているようですが、QコマンドはTIOで誤って機能します。代わりに、bash正しく機能するバージョンのテスト場へのリンクがありますdc

デモイット!


1

APL(Dyalog)、24バイト

{⍵∊o/⍨1=+/¨0=o|⍨⊂o←⍺↓⍳⍵}

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

どうやって?

⍳⍵- 1a

o←⍺↓- na、保存先o

o|⍨⊂o-内のすべての項目を法o内のすべての項目でo

0=-等しい場所を確認します0(分割)

+/¨ -分割数の合計

1= -1つしかない場合、数はそれ自体で除算されます

o/⍨ -したがって、これらの発生を保持します

⍵∊- aその残差配列にありますか?



0

JavaScript ES5, 34 Bytes

for(a=i=(p=prompt)();a%--i;);i<p()

0

Add++, 20 bytes

L,2Dx@rBcB%B]b*!!A>*

Try it online!

L,   - Create a lambda function
     - Example arguments:  [5 9]
  2D - Copy below; STACK = [5 9 5]
  x  - Repeat;     STACK = [5 9 [9 9 9 9 9]]
  @  - Reverse;    STACK = [[9 9 9 9 9] 5 19] 
  r  - Range;      STACK = [[9 9 9 9 9] [5 6 7 8 9]]
  Bc - Zip;        STACK = [[9 5] [9 6] [9 7] [9 8] [9 9]]
  B% - Modulo;     STACK = [4 3 2 1]
  B] - Wrap;       STACK = [[4 3 2 1]]
  b* - Product;    STACK = [24]
  !! - Boolean;    STACK = [1]
  A  - Arguments;  STACK = [1 5 9]
  >  - Greater;    STACK = [1 1]
  *  - Product;    STACK = [1]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.