Hitung angka Wilson


14

Mengingat bilangan bulat positif n , menghitung n th Wilson nomor W (n) di mana

Rumus angka Wilson

dan e = 1 jika n memiliki akar modulo primitif n , jika e = -1. Dengan kata lain, n memiliki akar primitif jika tidak ada bilangan bulat x di mana 1 < x < n-1 dan x 2 = 1 mod n .

  • Ini adalah sehingga membuat kode terpendek untuk fungsi atau program yang menghitung n th nomor Wilson untuk integer masukan n > 0.
  • Anda dapat menggunakan pengindeksan berbasis 1 atau 0. Anda juga dapat memilih untuk menampilkan angka n Wilson pertama .
  • Ini adalah urutan OEIS A157249 .

Uji Kasus

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

Juga, Oeis membaginya dengan n sesudahnya
H.PWiz

@EriktheOutgolfer Saya menambahkan apa yang dimaksud dengan memiliki akar primitif.
mil

1
Apakah kita seharusnya membaginya dengan n?
Leaky Nun

Sejauh yang saya ketahui, jika k = 1dan e = -1, hasil dari produk itu adalah 0. (maaf mengajukan banyak pertanyaan tetapi saya perlu klarifikasi untuk jawaban saya: p)
Erik the Outgolfer

2
Angka-angka ini disebut Wilson quotients . Angka Wilson adalah bilangan bulat yang membagi hasil bagi Wilson-nya secara merata. Misalnya, 13 adalah angka Wilson sejak 13 | 36846277 . Juga, W (n) biasanya mengecualikan penyebut.
Dennis

Jawaban:



6

Sekam , 11 byte

S÷ȯ→Π§foε⌋ḣ

Cobalah online!

Penjelasan

          ḣ   Range from 1 to input
     §foε⌋    Keep only those whose gcd with the input is 1
    Π         Product
  ȯ→          Plus 1
S÷            Integer division with input

Silakan tambahkan penjelasan? Saya pikir Anda punya algo bagus di sana ...
Erik the Outgolfer

3

Mathematica, 91 byte

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

@ BillSteihn tolong jangan langsung mengedit jawaban orang lain ( diskusi meta yang relevan ). Jika Anda memiliki saran bermain golf, silakan tinggalkan komentar sebagai gantinya!
JungHwan Min

@JungHwanMin Ya, saya perhatikan suntingan itu! terima kasih telah membantu pengguna baru dengan aturan
J42161217

3

Pyth , 11 byte

/h*Ff>2iTQS

Coba di sini!


Bagaimana?

  • /h*Ff>2iTQS - Program lengkap.

  • S- Hasilkan kisaran inklusif [1, masukan]

  • f - Saring-simpan itu:

    • iTQ - GCD siapa dengan input.

    • >2- Apakah kurang dari dua (dapat digantikan oleh salah satu dari berikut: q1, !t)

  • *F- Terapkan penggandaan berulang kali. Dengan kata lain, produk dari daftar.

  • h - Menambah produk dengan 1.

  • / - Pembagian lantai dengan input.

TL; DR : Dapatkan semua koprimes ke input dalam rentang [1, input] , dapatkan produk mereka, tambahkan dan bagi dengan input.



2

J, 33 byte

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

Yang ini lebih merupakan permintaan untuk melihat peningkatan daripada yang lainnya. Saya mencoba solusi diam-diam terlebih dahulu, tetapi lebih lama dari ini.

penjelasan

Ini adalah terjemahan yang cukup mudah dari solusi Mr. Xcoder ke J.

Cobalah online!



2

R , 82 byte

function(n)(prod((1:n)[g(n,1:n)<2])+1)%/%n
g=function(a,b)ifelse(o<-a%%b,g(b,o),b)

Menggunakan pembagian bilangan bulat daripada mencari tahu eseperti banyak jawaban di sini, meskipun saya berhasil menemukan itu e=2*any((1:n)^2%%n==1%%n)-1termasuk kasus tepi n=1yang saya pikir cukup rapi.

Menggunakan fungsi GCD vektor rturnbull .

Cobalah online!



2

JavaScript (ES6), 72 70 68 byte

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>

Divisi integer menyerang lagi. Sunting: Disimpan 2 byte berkat @Shaggy. Menyimpan 2 byte lebih lanjut dengan membuatnya lebih rekursif, sehingga mungkin gagal untuk nilai yang lebih kecil daripada sebelumnya.


70 byte (walaupun saya belum memiliki kesempatan untuk menjalankan set lengkap tes di atasnya):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
Shaggy

Saya kembali ke solusi rekursif yang saya kerjakan sebelum saya memutuskan untuk mencoba memetakan array dan mendapatkannya hingga 70 byte juga. Ini agak berantakan tetapi Anda mungkin dapat menyelamatkan sesuatu darinya untuk membantu mendapatkan solusi Anda di bawah 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

@Shaggy Yah, saya terinspirasi untuk melihatnya lagi, tapi saya tidak yakin itu yang Anda harapkan ...
Neil

2

Haskell , 42 byte

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

Cobalah online!

Menggunakan trik pembagian integer karena semua jawaban lainnya.
Menggunakan indeks berbasis 1.

Penjelasan

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 byte

õ fjU ×Ä zU

Cobalah


Penjelasan

Input bilangan bulat implisit U.

õ

Buat array bilangan bulat dari 1 hingga U.

fjU

Saring ( f) kata sandi utama dari U.

×

Kurangi dengan multiplikasi.

Ä

Tambahkan 1.

zU

Bagi dengan U, lantai hasil dan output tersirat.


untuk n = 25 ia mengembalikan 1654529071288638400 dan itu akan salah karena akan menjadi 1654529071288638505
RosLuP

@RosLuP: Seperti yang dikonfirmasi oleh pembuat tantangan, kita tidak perlu menangani angka lebih dari 32-bit.
Shaggy

1

Aksioma, 121 byte

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)

tambahkan beberapa jenis, ungolf itu dan hasil

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 byte

Pass pertama saya pada ini adalah beberapa byte lebih lama dari solusi Neil, itulah sebabnya saya awalnya membuangnya demi solusi pengurangan array di bawah ini. Sejak itu saya bermain golf untuk mengikat dengan 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

Cobalah

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>


Non-rekursif, 76 byte

Saya ingin mencoba solusi non-rekursif untuk melihat bagaimana hasilnya - tidak seburuk yang saya harapkan.

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

Cobalah

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>

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.