Nまでの素数


51

numberを指定するとn >= 2、nwhere よりも小さいすべての正の整数を出力しますgcd(n, k) == 1(k出力番号のいずれかを使用)。この種の数は互いに素です。

例:10出力を提供します[1, 3, 7, 9](数字が明確に区切られていて、何らかのリストである限り、任意の形式で)。リストには重複したエントリを含めることはできず、並べ替える必要はありません。

その他のテストケース:

2 -> [1]
3 -> [1, 2]
6 -> [1, 5]
10 -> [1, 3, 7, 9]
20 -> [1, 3, 7, 9, 11, 13, 17, 19]
25 -> [1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24]
30 -> [1, 7, 11, 13, 17, 19, 23, 29]

また、上記の番号カウントされていないnことがに互いに素n私は無限のソリューションがありますかなり確信しているだけであるため、。

また、注意:互いに素な数は、互いに素または互いに素であるとも言われます。


別の文字列(例1\n3\n)は有効な出力としてカウントされますか?
— devRicher 16

動作する@devRicher、確かに。
— Rɪᴋᴇʀ

nの上に無限の数があり、nと互いに素であるという直感は、私にとって正しいと感じています。無限に多くの素数があり、素数はそれより下のすべての数と互いに素です。したがって、nより大きいすべての素数(無限に多数ある)も、互いに素なリストの一部です。
— ブライアンJ

@BrianJそれだけではありません。cとnが互いに素である場合、c + knとnもすべての整数kに対して互いに素です。
— デニス

1
楽しい事実:これらはtotativesと呼ばれます。
— Wojowu

回答:


17

ゼリー、3 バイト

gÐṂ

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

これはどのように作動しますか?

gÐṂ-(モナディック)完全プログラム。

g-最大公約数。
 ÐṂ-リンク値が最小の要素を保持します(GCD == 1の要素)
       これにより、範囲[1、input](両端を含む)が自動的に作成されることに注意してください。

有効性の証明

我々は唯一のcoprimesを抽出したいので、最大公約-除数リストの最小値を持っているように1のためのÐṂ仕事にトリック。それを証明しましょう(2つの異なる方法で):

  1. [1,input]1gcd(1,x)=1∀x∈Z∗1

  2. 2つの連続する正の整数は常に互いに素です。考慮します(。次に、およびとなるような別の正の整数使用します。x,y∈Z∗y=x+1kk∣xk∣y

    これは、、したがって、したがってであることを意味します。を除算する唯一の正の整数は自体なので、リストに表示されることが保証され、常に最小値になります。k ∣ (x + 1 − x )k ∣ 1 1 1k∣(y−x)k∣(x+1−x)k∣111


2
9か月後、デニスは母国語でデニスを凌gしました!
— アダム

@Adám ÐṂ当時存在したかどうかはわかりませんが、とにかくこれにはかなり満足しています。
— ミスターXcoder

2
記録のために、DṂ存在しましたが、それはモナドに対してのみ働きました。コミット実装Þ、ÐṂ、ÐṀダイアドのために 5月9日、2017年の日付れる
— デニス・

@Dennis 3バイトバージョンがなかったのには十分な理由があると思いました。チャットでもそれについて疑問に思っていたので、役に立つ情報をありがとう!
— ミスターXcoder

56

パイソン2、61の 47バイト

lambda n:[k/n for k in range(n*n)if k/n*k%n==1]

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

バックグラウンド

検討リング 。このリングは通常、nを法とする剰余クラスを使用して定義されますが、Z n = { 0 、… 、n − 1 }の集合として考えることもできます。ここで、加算演算子と乗算演算子はa + n b = (a + b )(Zn,+n,⋅n)nZn={0、…、n−1}と ⋅ のn B = ⋅ Ba+nb=(a+b)%n、ここで + 、a⋅nb=a⋅b%nは、整数に対する通常の加算、乗算、モジュロ演算子を示します。+、⋅、そして %

二つの要素とBのZ nは相互呼ばれ逆数はモジュロN場合⋅ N B = 1abZnn。なお、 1a⋅nb=1%n> 1の場合は常に n = 1です。1%n=1n>1

修正とlet の互いに素であるNでZ N。もし⋅ N X = ⋅ N yの二つの要素のためのXとYのZ nは、我々は持っている⋅ Xn>1anZna⋅nバツ=a⋅nyバツyZn。これが意味すること ⋅ (X - Y )a⋅バツ%n=a⋅y%n、と私たちはそれに従う n個| ⋅ (X - Y )、すなわち、 nは除算 ⋅ (X - Y )に均等に。以降のnと共有していない素因子、この手段というのn | X - yの。最後に、 − n < x − y < nであるため、 x = yと結論付けます。これは、製品が⋅であることを示していますa⋅(バツ−y)%n=a⋅バツ%n−a⋅y%n=0n∣a⋅(バツ−y)na⋅(バツ−y)nan∣バツ−y−n<バツ−y<nバツ=yのすべての異なる要素である Z nは。以降 Z N有する丁度 n個の要素は、これらの製品のいずれか(及び正確に一つ)に等しくなければならない 1、すなわち、あるユニーク Bにおける Z Nよう ⋅ N B = 1。a⋅n0、…、a⋅n(n−1)ZnZnn1 bZna⋅nb=1

逆に、修正とlet の要素でZ Nではない互いに素のN。この場合、p ∣ aおよびp ∣ nのような素数pがあります。場合乗法逆モジュロを認めn個(のは、それを呼び出してみましょうbは、我々が持っていると思います)その⋅ N B = 1を意味し、その⋅ Bn>1aZnnpp∣ap∣nanba⋅nb=1と、従って、(⋅ B - 1 )a⋅b%n=1そう、 nは| ⋅ B - 1。以来のp |、我々はそれに従う pは| ⋅ bは。一方、以降のp | nは、我々はまた、それに従うのp | ⋅ B - 1。この方法では、 P | (⋅ B )- (⋅ B - 1 )= 1(a⋅b−1)%n=a⋅b%n−1=0n∣a⋅b−1p∣ap∣a⋅bp∣np∣a⋅b−1p∣(a⋅b)−(a⋅b−1)=1これは、が素数であるという仮定に矛盾します。p

これは、場合、次のステートメントが同等であることを証明します。n>1

  • と nは互いに素です。an

  • nを法とする乗法的逆数を認めます。an

  • nを法とする一意の乗法逆数を認めます。an

使い方

整数のペアごとに及びBにおけるZ nは、整数K := A ⋅ N + bが独特です。実際には、そしてBは、商の余りであるKで割ったN、すなわち、所与のK、我々は回復することができる= K / N及びB = kはabZnk:=a⋅n+babknka=k/n、ここで /は整数除算を示します。最後に、以降 ≤ N - 1と B ≤ N - 1、 kはの要素であり、 Z nは2 ; 実際には、 K ≤ (N - 1 )⋅ N + (N - 1 )= N 2 - 1。b=k%n/a≤n−1b≤n−1kZn2k≤(n−1)⋅n+(n−1)=n2−1

上述したようにあれば、そしてnは互いに素であり、一意が存在するであろうBよう⋅ Banb、すなわち、ユニークが存在するであろう Kように、K / N =及び K / N ⋅ Ka⋅b%n=1kk/n=aなので、生成されたリストには1回だけが含まれます。k/n⋅k%n=(k/n)⋅(k%n)%n=1a

逆に、及びnはありませ互いに素、条件K / N ⋅ Kanは、 a = k / nとなるように kのすべての値に対してfalseになるため、生成されたリストには aが含まれません。k/n⋅k%n=1ka=k/na

これは、リストことを証明ラムダリターンはすべて含まれていますのcoprimesにおけるZ のn回だけを。nZn


26
「GCD?私たちが行くところでは、GCDは必要ありません。」
— Rɪᴋᴇʀ

1
わあ 書きたかったのはこれだけですが、明らかに15文字が必要でした。それでも、すごい。よくやった。
— エリックラガーグレン16

24

ゼリー、4バイト

gRỊT

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

使い方

gRỊT  Main link. Argument: n

 R    Range; yield [1, ..., n].
g     Compute the GCD of n and each k in [1, ..., n].
  Ị   Insignificant; return 1 for GCDs less or equal to 1.
   T  Truth; yield the indices of all truthy elements.

33
この言語でのコーディングには多少時間がかかりますgRỊT
— ETHproductions

1
3バイトÐṂを取得するために、「最小リンク値」をすばやく(ab)使用しました()。
— ミスターXcoder

14

Mathematica、25バイト

Range@#~GCD~#~Position~1&

各結果が個別のリストにラップされている、少し奇妙な出力形式{{1}, {3}, {7}, {9}}。それで問題なければ、30バイトで2つの解決策があります。

Select[Range[x=#],#~GCD~x<2&]&
#&@@@Range@#~GCD~#~Position~1&

Mathematicaは実際に持ってCoprimeQいますが、それは長すぎます。


1
どういうQ意味CoprimeQですか?
— コナーオブライエン

2
@ ConorO'Brien「質問」だと思う。すべての決定問題の組み込みはEvenQ、PrimeQまたはのようなQで終わりますSubsetQ。
— マーティンエンダー


10

Python、93 82 74バイト

f=lambda a,b:f(b,a%b)if b else a<2
lambda c:[i for i in range(c)if f(i,c)]

fコプリムを再帰的にチェックし、2番目のラムダがそれらを生成します。リストを出力します。


7

実際には、8バイト

;╗R`╜┤`░

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

説明:

;╗R`╜┤`░
  R`  `░  elements of range(1, n+1) where
;╗  ╜     n and the element
     ┤    are coprime

1
range(1, n)バイトを節約できれば、できると思います。
— ETHproductions 16

1
@ETHproductionsありません。2つのオプションはR(range(1, n+1))とr(range(n))です。それらは同等であるため、選択しましたR(コードの作成中に誤ってCaps Lockを押したため)。
— メゴ

ええ、それが私が考えたことです。私は、インクリメントに捧げ見えた命令を見ていないが、私はとにかく1があったかもしれないと思った
— ETHproductions



6

JavaScript(ES6)、64 61バイト

@ user81655のおかげで3バイト節約

n=>[...Array(n).keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))

テストスニペット

f=n=>[...Array(n).keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))

for(var i = 2; i < 50; i++) console.log(i + ":", `[${ f(i) }]`);


あなたは交換できませんa==でa<2?
— Rɪᴋᴇʀ

@EasterlyIrk確かでaはないが、ある時点で0になるかもしれない。私がチェックする必要があります
— ETHproductions

あなたにGCD関数を移動することができますfilter受信する必要性を取り除くためにb、パラメータを:...keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))
— user81655

@ user81655それは素晴らしい、ありがとう!:-)
— ETHproductions 16

6

クラゲ、19 18バイト

p
[#
`B
&~xr1
NnEi

これは、範囲内のすべての数値の素因数分解を計算し、それが入力のものと交差するかどうかをチェックすることで機能します(Jellyfishにはまだgcdビルトインがありません)。ゴルフの理由により、出力は降順です。 オンラインでお試しください!

説明

まず、i評価された入力です。入力10の場合、i-cell の値は10です。

r1
i

ここでr(範囲)は入力と1に適用されます。入力が1より大きいため、範囲は降順です。入力の10場合、これはを与え[9 8 7 6 5 4 3 2 1]ます。

[#
`B
&~x
Nn

この部分はi、上記の範囲で評価される1つの大きな関数です。

~x
n

n素因数の交差()x。

&~x
Nn

空ですか?(N)

`
&~x
Nn

レベル0へのスレッド、範囲の各要素のテスト。

[#
`B
&~x
Nn

#ブール値のこのリストに関して範囲をフィルター()します。によって生成された関数[は、引数to #を独自の引数として使用するため、引数を取得しないようにBtoブロックを配置し#ます。それ以外の場合、~-cell の値がbig関数の引数として使用されます。最後にp、結果を出力します。


5

スタック、非競合、24 21バイト

Borsunhoのルビーに触発されて、3バイトを節約しました。(1 eq〜2<)

{!n:>1+:n gcd 2<keep}

ここで試してみてください!

これは、1つの引数を取り、配列を生成するn-ラムダです。

{!n:>1+:n gcd 2<keep}
{!                  }  n-lambda
  n                    push n
   :>                  range [0, n)
     1+                range [1, n]
       :               duplicate
        n gcd          element-wise gcd with n
              2<       element-wise equality with 1
                       this yields the range [1, n] and a boolean mask of coprime numbers
                keep   then, we simply apply the mask to the range and keep coprimes.

なぜこれが競合しないのですか?
— ザカリー16

主に@ZacharyT keepはうまく機能していませんでした。
— コナーオブライエン

5

CJam、14バイト

{:X{Xmff%:*},}

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

説明

我々は、すべての可能な約数をチェックする必要はありませんaとbしている互いに素彼らはかどうかをテストします。b除算の主な要因のいずれかを調べるだけで十分aです。

:X     e# Store the input in X.
{      e# Filter the list [0 1 ... X-1] by the results of this block...
  Xmf  e#   Get the prime factors of X.
  f%   e#   Take the current value modulo each of those prime factors.
  :*   e#   Multiply the results. Iff any of them divide the current
       e#   value, there's a 0 in the list, and the result of the product
       e#   is also 0, dropping the value from the resulting list.
},

5

Mathematica、26バイト

Pick[r=Range@#,r~GCD~#,1]&

1
ああ、ピックのようなものを探していました。でも今は見つけられなかったのが嬉しいと思う。;)しかし、それは将来の課題に非常に役立つはずです。
— マーティンエンダー


4

Brachylog、16 13バイト

>.$p'(e:A*?),

これは、入力としてNを取り、それよりも小さい整数のすべての整数を生成する関数です。

オンラインでお試しください!Brachylogでよくあることですが、これには関数を完全なプログラムにするために追加のコードが追加されています。Brachylogのインタープリターは、完全なプログラムではなく関数が与えられた場合、それを実行しますが、出力を出力しません。つまり、その動作を実際に観察することはできません。

説明:

Brachylogプログラムは一連の制約です。通常、1つの制約のLHSは次の制約のRHSです。

>.$p'(e:A*?),
>              The input is greater than
 .             the output, whose
  $p           prime factorisation does
    '(     )   not obey the following constraint:
      e        it has an element which
       :A*     can be multiplied by something to
          ?    produce the input.
            ,  (This comma turns off an unwanted implicit constraint.)

共通因子(出力の素因数として既に知られている)が入力の素因数であるかどうかを確認する理由がないことを認識して、3文字を使い果たしました。私たちはすでにそれが素数であることを知っているので、それが要因かどうかを確認するだけです。私はうれしいことここに驚いて:A*?無限ループに通訳を送信しませんとために非整数値を許可しませんAを、しかし通訳は私が欲しいものを同じように、私はそれを取りますよ。


4

Dyalog APL、10 バイト。

0~⍨⍳×1=⊢∨⍳

説明(入力n):

0~⍨⍳×1=⊢∨⍳
         ⍳ - 1 ... n (Thus, ⎕IO is 1)
       ⊢∨  - Each GCD'd by n
     1=    - Test equality with 1 on each element
   ⍳×      - multiplied by its index
0~⍨        - without 0.

3
私は、APLコードを読むときにあなたが作る顔のように見える方法が大好きです。⍨
— DJMcMayhem

うん、そしてそれはコードゴルフ指向ではないほとんどすべての言語を破壊します。:)。
— ザカリー16

「なぜ」しか機能しないのですか?
— Rɪᴋᴇʀ

私はそれが機能すると仮定するつもりです。
— ザカリー16

@ZacharyTなぜテストできないのですか?try-apl.orgに貼り付けると、無効なトークンでエラーが発生します。
— Rɪᴋᴇʀ

4

Japt -f、9 8 5 2バイト

jN

それを試してみてください

  • ETHがブレインファートを指摘したため、2バイトが節約され、別のバイトが節約されました。

できることo f_jU
— -ETHproductions

ありがとう、@ ETHproductions。ここで私が何を考えていたかわからない!j2つの数値が互いに素であるかどうかをテストするために使用することもできますが、忘れてしまった(多くの)瞬間の1つだったに違いありません。
— シャギー

3

Mathematica、33バイト

xSelect[Range@x,x~CoprimeQ~#&]

U + F4A1を含む


印刷できないものは何ですか?
— Rɪᴋᴇʀ

3
@EasterlyIrkは、名前付き引数を持つ名前のない関数を導入します。Mmaで矢印としてレンダリングされます。
— マーティンエンダー

@MartinEnderああ、クール。
— Rɪᴋᴇʀ

U + F4A1は私用文字です。マーティンが言ったように、それはMathematicaで矢印としてレンダリングされます。
— ザカリー16



3

ミーム、非競合の 11バイト、古い

STDINの反復としての非競合は新しいものです。 UTF-8エンコードを使用します。

d`}}]i=1?ip

説明:

d     Set program to not output result
`}    Loop next input-times
}]i   GCD of input and loop index
=1?   Is it equal to 1? If yes,
ip    Print out loop index

}次の入力項目にアクセスしますが、最後の入力が与えられたときにループスルーされるため、入力6は6 6 6 6 6 ...STDINのようになり、1つの出力から2つの出力を読み取ることができます。


今日この言語を作成しましたか?チャレンジの前に作成された場合、競合しないようにする必要があります。
— Rɪᴋᴇʀ

@EasterlyIrkそれは3日前に作成されました。また、私はあなたが後に意味すると仮定しますか?
— devRicher

ええ、タイプミスありがとう。そして、答えで使用され、チャレンジよりも古い機能があれば大丈夫です。
— Rɪᴋᴇʀ

@EasterlyIrkなるほど、その場合は答えを編集する必要があります。
— devRicher 16

ええ、ごめんなさい。:/
— Rɪᴋᴇʀ


2

ルビー、36 34

->n{n.times{|i|p i if i.gcd(n)<2}}

確かに、これは非常に刺激的な答えではありません。

Conor O'Brienのおかげで2バイト節約されました。


括弧を削除することで2バイトを削ることができます (n)
— コナーオブライエン


2

ジュリア、30バイト

n->filter(x->(gcd(n,x)<2),1:n)

匿名関数。 filter関数に従って真実ではない要素をリストから削除します。

この場合、関数はx->(gcd(n,x)<2)(入力とリスト要素のgcdが2より小さい場合にtrue)です。リストは範囲1:nです。


2

PARI / GP、27バイト

n->[k|k<-[1..n],gcd(k,n)<2]

これは、バージョン2.6.0(2013)で導入されたセット表記を使用します。以前のバージョンでは、さらに4バイトが必要でした。

n->select(k->gcd(k,n)<2,[1..n])

必要になります。


これはどのように作動しますか?
— Rɪᴋᴇʀ

1
@EasterlyIrkこれらの提出のほとんどと同じ-1〜n([1..n])の範囲を作成し、gcdが1(gcd(n,k)<2)かどうかを確認し、このプロパティで数値を返します。->通常の関数の構文より2バイトだけ短く機能/閉鎖表記で、[...|...<-...,...]セット表記は(ユーザーズマニュアルのセクション2.3.14を参照するかを検索の回答で説明されています<-)。
— チャールズ



1

Pyth、5バイト

x1iLQ

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

使い方

Pythは0インデックスを使用することに注意してください。

x1iLQ   Q = eval(input())

x1iLQQ  implicit Q at the end
  iLQQ  [gcd(Q,0), gcd(Q,1), ..., gcd(Q,Q-1)]
x1      all occurences of 1 in the above list (return their indices)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.