Учитывая положительное целое число n , вычислите n- е число Вильсона W (n), где
и 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
k = 1
иe = -1
, результат продукта будет0
. (извините, задаю много вопросов, но мне нужны разъяснения для моего ответа: p)Ответы:
Желе ,
87 байт1 байт благодаря Денису.
Попробуйте онлайн!
Вы действительно не должны вычислять,
e
так как вам все равно нужно делить.источник
gRỊT
сохраняет байт.gRỊT
деталям желе ...шелуха , 11 байт
Попробуйте онлайн!
объяснение
источник
Mathematica, 91 байт
источник
Pyth , 11 байт
Попробуй это здесь!
Как?
/h*Ff>2iTQS
- Полная программа.S
- Генерация включающего диапазона [1, вход]f
- Фильтр-оставь те:iTQ
чей ГКД со входом.>2
- меньше , чем два (можно заменить любым из следующих условий :q1
,!t
)*F
- Применить умножение повторно. Другими словами, продукт из списка.h
- Увеличить продукт на 1./
- Этаж деления с входом.TL; DR : получить все взаимно простые числа на входе в диапазоне [1, вход] , получить их произведение, увеличить его и разделить на вход.
источник
Python 2 , 62 байта
Попробуйте онлайн!
источник
J, 33 байта
Это скорее просьба увидеть улучшение, чем что-либо еще. Сначала я попробовал молчаливое решение, но оно оказалось длиннее.
объяснение
Это довольно простой перевод решения мистера Xcoder на J.
Попробуйте онлайн!
источник
05AB1E , 8 байтов
Попробуйте онлайн!
источник
R , 82 байта
Использует целочисленное деление, а не выяснение,
e
как многие ответы здесь, хотя я действительно работал,e=2*any((1:n)^2%%n==1%%n)-1
включая крайний случай,n=1
который я считал довольно аккуратным.Использует векторизованную функцию GCD rturnbull .
Попробуйте онлайн!
источник
Пари / ГП , 36 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
727068 байтЦелочисленное деление поражает снова. Изменить: Сохранено 2 байта благодаря @Shaggy. Сохраните еще 2 байта, сделав его гораздо более рекурсивным, поэтому он может потерпеть неудачу при меньших значениях, чем раньше.
источник
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
(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
Haskell , 42 байта
Попробуйте онлайн!
Использует трюк с целочисленным делением, как и все остальные ответы.
Использует индексы на основе 1.
объяснение
источник
Japt , 11 байт
Попытайся
объяснение
Неявный ввод целого числа
U
.Создайте массив целых чисел от 1 до
U
.Filter (
f
) сопряженияU
.Уменьшить умножением.
Добавьте 1.
Разделите на
U
, дайте результат и неявно выводите.источник
Аксиома, 121 байт
добавить какой-то тип, раскрутить это и результат
источник
JavaScript (ES6),
838180787668 байтМой первый проход был на несколько байт длиннее решения Нейла, поэтому я изначально отказался от него в пользу решения по уменьшению массива ниже. С тех пор я играл в гольф, чтобы связать с Нилом.
Попытайся
Нерекурсивный, 76 байт
Я хотел дать нерекурсивному решению попробовать, как оно получится - не так плохо, как я ожидал.
Попытайся
источник