Wilson sayılarını hesaplama


14

Pozitif bir tam sayı verilen n , hesaplamak n inci Wilson numarası W (n) burada

Wilson sayı formülü

ve n , ilkel bir kök modüse n sahipse e = 1 , aksi takdirde e = -1'dir. Diğer bir deyişle, n, bir tam sayı vardır mevcut değilse, ilkel kök vardır x burada 1 < X < n-1 ve x 2 = 1 mod n .

  • Bu çok hesaplayan bir fonksiyon ya da program için kısa kod oluşturma n inci bir giriş tamsayı Wilson sayısı , n > 0.
  • 1 veya 0 tabanlı indeksleme kullanabilirsiniz. İlk n Wilson numarasını da çıkarmayı seçebilirsiniz .
  • Bu OEIS dizisi A157249'dur .

Test Durumları

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

Ayrıca, Oeis daha sonra n'ye böler
H.PWiz

@EriktheOutgolfer İlkel bir köke sahip olmakla kastedileni ekledim.
mil

1
N'ye bölmemiz gerekiyor mu?
Leaky Nun

Bildiğim kadarıyla , ürünün sonucu olur k = 1ve e = -1olur 0. (çok soru sorduğum için üzgünüm ama cevabım için açıklamalara ihtiyacım var: p)
Outgolfer Erik

2
Bu sayılara Wilson bölümleri denir . Bir Wilson sayıda eşit olarak Wilson bölüm bölen bir tamsayıdır. Örneğin, 13 , 13'ten beri bir Wilson sayısıdır | 36846277 . Ayrıca, W (n) genellikle paydayı hariç tutar.
Dennis

Yanıtlar:



6

Kabuk , 11 bayt

S÷ȯ→Π§foε⌋ḣ

Çevrimiçi deneyin!

açıklama

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

Lütfen açıklama ekleyin? Sanırım orada şık bir algo var ...
Outgolfer Erik

3

Mathematica, 91 bayt

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

@BillSteihn lütfen başkalarının cevaplarını doğrudan düzenlemeyin ( ilgili meta tartışma ). Golf önerileriniz varsa, lütfen bir yorum bırakın!
JungHwan Min

@JungHwanMin Evet, bu düzenlemeyi fark ettim! yeni kullanıcılara kurallarda yardımcı olduğunuz için teşekkür ederiz
J42161217

3

Pyth , 11 bayt

/h*Ff>2iTQS

Burada deneyin!


Nasıl?

  • /h*Ff>2iTQS - Tam program.

  • S- Kapsayıcı aralığı oluşturun [1, giriş]

  • f - Bunları filtreleyin:

    • iTQ - GCD girişi olan.

    • >2- en az iki (aşağıdakilerden biri ile ikame edilmiş olabilir: mi q1, !t)

  • *F- Tekrar tekrar çarpma uygulayın. Başka bir deyişle, listenin ürünü.

  • h - Ürünü 1 arttırın.

  • / - Girişli kat bölümü.

TL; DR : Tüm kopyaları [1, girdi] aralığındaki girdiye alın, ürünlerini alın, artırın ve girdiye bölün.



2

J, 33 bayt

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

Bu, her şeyden daha iyi bir gelişme görme talebidir. Önce örtük bir çözüm denedim, ama bundan daha uzundu.

açıklama

Bu, Bay Xcoder'ın çözümünün J'ye oldukça basit bir çevirisi.

Çevrimiçi deneyin!



2

R , 82 bayt

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

eBurada çok düzgün olduğunu düşündüğüm e=2*any((1:n)^2%%n==1%%n)-1kenar durumu da dahil olmak üzere çalıştım, ancak burada birçok cevap gibi bulmak yerine tamsayı bölme kullanır n=1.

Rturnbull'un vectorized GCD işlevini kullanır .

Çevrimiçi deneyin!



2

JavaScript (ES6), 72 70 68 bayt

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>

Tamsayı bölümü tekrar vurur. Düzenleme: @Shaggy sayesinde 2 bayt kaydedildi. Çok daha özyinelemeli hale getirerek 2 bayt daha kaydetti, bu yüzden eskisinden daha küçük değerler için başarısız olabilir.


70 bayt (henüz üzerinde tam bir test seti yürütme şansım olmasa da):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

Bunun yerine bir dizi eşlemeyi denemeye karar vermeden önce üzerinde çalıştığım özyinelemeli çözüme geri döndüm ve 70 bayta indirdim. Biraz karışıklık var ama çözümünüzü 70'in altına (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 Peki, bir daha bakmam için ilham aldım, ama beklediğinizden emin değilim ...
Neil

2

Haskell , 42 bayt

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

Çevrimiçi deneyin!

Tamsayı bölümü hilesini diğer tüm cevaplar gibi kullanır.
1 tabanlı indeksler kullanır.

açıklama

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 bayt

õ fjU ×Ä zU

Dene


açıklama

Örtük tamsayı girişi U.

õ

1 ile arasında bir tamsayı dizisi oluşturun U.

fjU

Filter ( f) ortak primerleri U.

×

Çarpma ile azaltın.

Ä

1 ekleyin.

zU

Bölün U, sonucu katlayın ve dolaylı çıktı alın.


n = 25 için 1654529071288638400 döndürür ve yanlış olur çünkü 1654529071288638505
RosLuP

@RosLuP: Meydan okuma yazarı tarafından onaylandığı gibi, 32 bit'ten fazla sayıları işlememize gerek yoktur.
Shaggy

1

Aksiyom, 121 bayt

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)

bir tür ekleyin, ungolf ve sonuç

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 bayt

Bu benim ilk geçişim Neil'in çözümünden birkaç bayt daha uzun, bu yüzden başlangıçta aşağıdaki dizi azaltma çözümü lehine hendek. O zamandan beri Neil ile bađlantý yapmak için golf oynadým.

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

Dene

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>


Özyinelemesiz, 76 bayt

Ben özyinelemeli olmayan bir çözüm nasıl olacağını görmek için bir deneme vermek istedim - beklediğim kadar kötü değil.

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

Dene

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.