คำนวณตัวเลขวิลสัน


14

รับจำนวนเต็มบวกnให้คำนวณn th จำนวน number W (n)โดยที่

สูตรเลขวิลสัน

และE = 1 ถ้าnมีรากดั้งเดิมแบบโมดูโลnมิฉะนั้นE = -1 ในคำอื่น ๆnมีรากดั้งเดิมถ้ามีไม่ได้อยู่จำนวนเต็มxที่ 1 < x < n-1และx 2 = 1 mod n

  • นี่คือดังนั้นให้สร้างรหัสที่สั้นที่สุดสำหรับฟังก์ชั่นหรือโปรแกรมที่คำนวณหมายเลขn th Wilson สำหรับอินพุตจำนวนเต็มn > 0
  • คุณสามารถใช้การจัดทำดัชนีแบบ 1 หรือ 0 นอกจากนี้คุณยังสามารถเลือกที่จะเอาท์พุทตัวเลขn Wilson แรก
  • นี่คือลำดับ 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

นอกจากนี้ Oeis หารด้วย n หลังจากนั้น
H.PWiz

@EriktheOutgolfer ฉันเพิ่มสิ่งที่มีความหมายโดยมีรากดั้งเดิม
ไมล์

1
เราควรหารด้วย n หรือไม่?
Leun Nun

เท่าที่ผมทราบถ้าk = 1และผลของผลิตภัณฑ์ที่จะเป็นe = -1 0(ขออภัยที่ถามคำถามมากมาย แต่ฉันต้องการคำอธิบายที่ชัดเจนสำหรับคำตอบของฉัน: p)
Erik the Outgolfer

2
ตัวเลขเหล่านี้จะเรียกว่าบวกลบคูณหารวิลสัน จำนวนวิลสันเป็นจำนวนเต็มที่แบ่งเชาวน์วิลสันของมันอย่างสม่ำเสมอ ตัวอย่างเช่น13เป็นหมายเลข Wilson ตั้งแต่13 | 36846277 นอกจากนี้W (n)โดยปกติจะไม่รวมตัวส่วน
Dennis

คำตอบ:


8

เยลลี่ , 8 7 ไบต์

1 ไบต์ต้องขอบคุณเดนนิส

gRỊTP‘:

ลองออนไลน์!

คุณไม่จำเป็นต้องคำนวณeเพราะคุณต้องหารด้วย


gRỊTบันทึกเป็นไบต์
Dennis

เดนนิสได้รับลงไปที่gRỊTรายละเอียดของ TY Jelly ...
corsiKa


3

Mathematica, 91 ไบต์

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

@BillSteihnโปรดอย่าแก้ไขคำตอบของผู้อื่นโดยตรง ( การอภิปรายเมตาที่เกี่ยวข้อง ) หากคุณมีข้อเสนอแนะกอล์ฟโปรดแสดงความคิดเห็นแทน!
JungHwan Min

@JungHwanMin ใช่ฉันสังเกตเห็นการแก้ไขนั้น! ขอบคุณที่ช่วยผู้ใช้ใหม่ด้วยกฎ
J42161217

3

Pyth , 11 ไบต์

/h*Ff>2iTQS

ลองที่นี่!


อย่างไร?

  • /h*Ff>2iTQS - โปรแกรมเต็มรูปแบบ

  • S- สร้างช่วงรวม[1 อินพุต]

  • f - ตัวกรอง - เก็บสิ่งเหล่านั้น:

    • iTQ - GCD พร้อมอินพุต

    • >2- น้อยกว่าสอง (สามารถถูกแทนที่ด้วยอย่างใดอย่างหนึ่งต่อไปนี้: q1, !t)

  • *F- ใช้การคูณซ้ำ ๆ ในคำอื่น ๆ ผลิตภัณฑ์ของรายการ

  • h - เพิ่มผลิตภัณฑ์โดย 1

  • / - การแบ่งชั้นกับอินพุต

TL; DR : นำ Coprimes ทั้งหมดไปยังอินพุตในช่วง[1, อินพุต] , รับผลิตภัณฑ์, เพิ่มและหารด้วยอินพุต



2

J, 33 ไบต์

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

อันนี้เป็นการร้องขอเพื่อดูการปรับปรุงมากกว่าสิ่งอื่นใด ฉันลองวิธีแก้ปัญหาโดยปริยายครั้งแรก แต่มันนานกว่านี้

คำอธิบาย

นี่เป็นการแปลที่ตรงไปตรงมาของคำตอบของ Mr. Xcoder ใน J.

ลองออนไลน์!



2

R , 82 ไบต์

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

ใช้การหารจำนวนเต็มแทนที่จะหาeคำตอบที่นี่แม้ว่าฉันจะคิดออกมาe=2*any((1:n)^2%%n==1%%n)-1รวมถึงกรณีขอบn=1ที่ฉันคิดว่าค่อนข้างเรียบร้อย

ใช้ฟังก์ชัน GCD แบบเวกเตอร์ของ rturnbullฟังก์ชั่น

ลองออนไลน์!



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>

การแบ่งจำนวนเต็มนัดอีกครั้ง แก้ไข: บันทึก 2 ไบต์ด้วย @Shaggy บันทึกอีก 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
Shaggy

ฉันกลับไปที่โซลูชันแบบเรียกซ้ำที่ฉันทำงานอยู่ก่อนที่จะตัดสินใจทำแผนที่อาเรย์แทนและลดให้เหลือ 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

@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

ลองมัน


คำอธิบาย

Uการป้อนข้อมูลโดยนัยของจำนวนเต็ม

õ

สร้างอาร์เรย์ของจำนวนเต็มจาก 1 Uไปยัง

fjU

ตัวกรอง ( f) Uร่วมจำนวนเฉพาะของ

×

ลดการคูณ

Ä

เพิ่ม 1

zU

หารด้วยทำUพื้นผลลัพธ์และเอาต์พุตโดยปริยาย


สำหรับ n = 25 จะส่งคืน 1654529071288638400 และมันจะผิดเพราะมันจะเป็น 1654529071288638505
RosLuP

@RosLuP: ได้รับการยืนยันโดยผู้เขียนความท้าทายเราไม่จำเป็นต้องจัดการตัวเลขมากกว่า 32 บิต
Shaggy

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)

เพิ่มประเภท ungolf ที่และผล

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.