Обчисліть числа Вілсона


14

З огляду на позитивне ціле число п , обчислити п - ю Вільсон число W (N) , де

Wilson number formula

і e = 1, якщо n має примітивний кореневий модуль n , інакше e = -1. Іншими словами, n має примітивний корінь, якщо не існує цілого числа x, де 1 < x < n-1 і x 2 = 1 mod n .

  • Це тому створіть найкоротший код функції або програми, яка обчислює n- е число Вілсона для вхідного цілого n > 0.
  • Ви можете використовувати індексацію на основі 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 згодом
H.PWiz

@EriktheOutgolfer Я додав, що мається на увазі під примітивним коренем.
милі

1
Чи слід ділити на n?
Leaky Nun

Наскільки я знаю, якщо k = 1і e = -1, в результаті цього продукту буде 0. (вибачте, що задаю багато запитань, але мені потрібні роз'яснення для моєї відповіді: p)
Erik the Outgolfer

2
Ці числа називаються коефіцієнтами Вілсона . Номер Вілсон є цілим числом , яке ділить його Wilson фактор рівномірно. Наприклад, 13 - це число Вілсона з 13 | 36846277 . Також W (n) зазвичай виключає знаменник.
Денніс

Відповіді:




3

Математика, 91 байт

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

@BillSteihn, будь ласка, не редагуйте відповіді інших людей ( відповідна мета-дискусія ). Якщо у вас є пропозиція про гольф, залиште замість цього коментар!
JungHwan Мін

@JungHwanMin Так, я помітив цю редакцію! дякую за допомогу новим користувачам з правилами
J42161217

3

Pyth , 11 байт

/h*Ff>2iTQS

Спробуйте тут!


Як?

  • /h*Ff>2iTQS - Повна програма.

  • S- Створити діапазон включення [1, вхід]

  • f - Фільтр - зберігайте такі:

    • iTQ - чий GCD з входом.

    • >2- менше , ніж два (можна замінити будь-яким з наступних умов : q1, !t)

  • *F- Застосовувати множення кілька разів. Іншими словами, продукт списку.

  • h - Збільшення продукту на 1.

  • / - Поділ підлоги з входом.

TL; DR : Отримайте всі копії на вхід у діапазоні [1, вхід] , отримайте їх добуток, збільште його та розділіть на вхід.



2

J, 33 байти

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

Це більше прохання побачити покращення, ніж будь-що інше. Спершу я спробував мовчазне рішення, але це було довше, ніж це.

пояснення

Це досить простий переклад рішення містера Xcoder на Дж.

Спробуйте в Інтернеті!



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

Хаскелл , 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-бітні.
Кудлатий

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 байт

Перший мій пропуск при цьому був на кілька байт довший за рішення Ніла, тому я спочатку відкинув його на користь рішення для зменшення масиву нижче. З тих пір я гольфу, щоб зв'язати з Нілом.

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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.