ウィルソン数を計算する


14

正の整数nが与えられた場合n 番目の ウィルソン数 W(n)を計算します。

ウィルソン数の式

そして、E = 1であればN原始根モジュロを有するN、そうでなければ、E = -1。つまり、整数xが存在しない場合(1 < x < n-1およびx 2 = 1 mod n)nにはプリミティブルートがあります。

  • これはので、入力整数n > 0 に対してn 番目のウィルソン数を計算する関数またはプログラムの最短コードを作成します。
  • 1ベースまたは0ベースのインデックスを使用できます。最初のn個のウィルソン数を出力することもできます。
  • これは、OEISシーケンスA157249です。

テストケース

n  W(n)
1  2
2  1
3  1
4  1
5  5
6  1
7  103
8  13
9  249
10 19
11 329891
12 32
13 36846277
14 1379
15 59793
16 126689
17 1230752346353
18 4727
19 336967037143579
20 436486
21 2252263619
22 56815333
23 48869596859895986087
24 1549256
25 1654529071288638505

また、その後のnだけOeis分裂
H.PWiz

@EriktheOutgolfer原始ルートを持つことの意味を追加しました。
マイル

1
nで割ることになっていますか?
リーキー修道女

あれば私の知る限りでは、承知しているようk = 1e = -1、積の結果は次のようになり0。(多くの質問をして申し訳ありませんが、私は私の答えを明確にする必要があります:p)
エリックアウトゴルファー

2
これらの数値は、ウィルソン商と呼ばれます。ウィルソン番号が均等そのウィルソン商を分割する整数です。たとえば、1313以来のウィルソン数です36846277。また、W(n)は通常、分母を除外します。
デニス

回答:




3

Mathematica、91バイト

If[(k=#)==1,2,(Times@@Select[Range@k,CoprimeQ[k,#]&]+If[IntegerQ@PrimitiveRoot@#,1,-1])/#]&

@BillSteihnは、他人の回答を直接編集しないでください(関連するメタディスカッション)。ゴルフの提案がある場合は、代わりにコメントを残してください!
ジョンファンミン

@JungHwanMinはい、私はその編集に気づきました!ルールで新規ユーザーを支援するためのおかげで
J42161217

3

Pyth、11バイト

/h*Ff>2iTQS

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


どうやって?

  • /h*Ff>2iTQS -完全なプログラム。

  • S-包括範囲を生成する、[1、入力]

  • f -フィルターキープ:

    • iTQ -入力のあるGCD。

    • >2-2未満(次のいずれかに置き換えることができます:q1!t

  • *F-乗算を繰り返し適用します。言い換えれば、リストの製品。

  • h -製品を1増やします。

  • / -入力によるフロア分割。

TL; DR:範囲[1、input]の入力へのすべてのコプリムを取得し、それらの積を取得し、それをインクリメントし、入力で除算します。



2

J、33バイト

3 :'<.%&y>:*/(#~1&=@(+.&y))1+i.y'

これは、他の何よりも改善を見たいという要望です。最初に暗黙の解決策を試しましたが、これよりも長くなりました。

説明

これは、Xcoder氏のソリューションをJにかなり簡単に翻訳したものです。

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





2

JavaScript(ES6)、72 70 68バイト

f=(n,p=1,i=n,a=n,b=i)=>i?f(n,b|a-1?p:p*i,i-=!b,b||n,b?a%b:i):-~p/n|0
<input type=number min=1 oninput=o.textContent=f(+this.value)><pre id=o>

整数除算が再び行われます。編集:@Shaggyのおかげで2バイト保存されました。はるかに再帰的にすることでさらに2バイトを節約したため、以前よりも小さい値では失敗する可能性があります。


70バイト(まだすべてのテストを実行する機会がありませんでしたが):f=(n,i=n,p=1,g=(a,b)=>b?g(b,a%b):a)=>--i?f(n,i,g(n,i)-1?p:p*i):-~p/n|0
シャギー

代わりに配列をマッピングしようとする前に作業していた再帰的な解決策に戻り、70バイトにもなりました。70以下のソリューションのダウンを取得することは、混乱のビットですが、あなたはそれからサルベージ何かすることができるかもしれない助けに:(n,x=n)=>(g=s=>--x?g(s*(h=(y,z)=>z?h(z,y%z):--y?1:x)(n,x)):++s)(1)/n|0
シャギー

@Shaggyまあ、私はそれで別の顔をしているように促されたが、私は確かにあなたが...期待していた何ということはないよ
ニール

2

Haskell、42バイト

f n=div(product[x|x<-[1..n],gcd x n<2]+1)n

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

他のすべての答えとして整数除算トリックを使用します。
1ベースのインデックスを使用します。

説明

f n=                                       -- function
    div                                  n -- integer division of next arg by n
       (product                            -- multiply all entries in the following list
               [x|                         -- return all x with ...
                  x<-[1..n],               -- ... 1 <= x <= n and ...
                            gcd x n<2]     -- ... gcd(x,n)==1
                                      +1)  -- fix e=1

1

Japt、11バイト

õ fjU ×Ä zU

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


説明

integerの暗黙的な入力U

õ

1〜の整数の配列を生成しUます。

fjU

のコプライムをフィルタ(f)しUます。

×

乗算で削減します。

Ä

追加1。

zU

で除算しU、結果をフロアし、暗黙的に出力します。


N = 25のためにそれは1654529071288638400を返し、それが1654529071288638505になるので、それは間違っているだろう
RosLuP

@RosLuP:チャレンジ作成者が確認したように、32ビットを超える数を処理する必要はありません。
シャギー

1

公理、121バイト

f(n)==(e:=p:=1;for i in 1..n repeat(if gcd(i,n)=1 then p:=p*i;e=1 and i>1 and i<n-1 and(i*i)rem n=1=>(e:=-1));(p+e)quo n)

いくつかのタイプを追加し、その結果と結果を

w(n:PI):PI==
   e:INT:=p:=1
   for i in 1..n repeat
       if gcd(i,n)=1 then p:=p*i
       e=1 and i>1 and i<n-1 and (i*i)rem n=1=>(e:=-1)
   (p+e)quo n

(5) -> [[i,f(i)] for i in 1..25]
   (5)
   [[1,2], [2,1], [3,1], [4,1], [5,5], [6,1], [7,103], [8,13], [9,249],
    [10,19], [11,329891], [12,32], [13,36846277], [14,1379], [15,59793],
    [16,126689], [17,1230752346353], [18,4727], [19,336967037143579],
    [20,436486], [21,2252263619], [22,56815333], [23,48869596859895986087],
    [24,1549256], [25,1654529071288638505]]
                                                  Type: List List Integer

(8) -> f 101
   (8)
  9240219350885559671455370183788782226803561214295210046395342959922534652795_
   041149400144948134308741213237417903685520618929228803649900990099009900990_
   09901
                                                    Type: PositiveInteger

1

JavaScript(ES6)、83 81 80 78 76 68バイト

これでの最初のパスは、Neilのソリューションよりも数バイト長いため、もともと以下の配列削減ソリューションを優先して廃止しました。それ以来、ニールと結びつけるためにゴルフをしました。

n=>(g=s=>--x?g(s*(h=(y,z)=>z?h(z,y%z):--y?1:x)(n,x)):++s)(1,x=n)/n|0

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

o.innerText=(f=
n=>(g=s=>--x?g(s*(h=(y,z)=>z?h(z,y%z):--y?1:x)(n,x)):++s)(1,x=n)/n|0
)(i.value=8);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


非再帰的、76バイト

私は非再帰的な解決策を試して、それがどうなるかを試してみたかった-思ったほど悪くはなかった。

n=>-~[...Array(x=n)].reduce(s=>s*(g=(y,z)=>z?g(z,y%z):y<2?x:1)(--x,n),1)/n|0

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

o.innerText=(f=
n=>-~[...Array(x=n)].reduce(s=>s*(g=(y,z)=>z?g(z,y%z):y<2?x:1)(--x,n),1)/n|0
)(i.value=8);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>

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