Перевірте теорему Вольстенгольма


14

Визначення

Теорема Вольстенгольма говорить, що:

Теорема Вольстенгольма

де aі bє натуральними цілими числами і pє простими, а великими дужками є двочленний коефіцієнт .

Завдання

Для того, щоб переконатися в тому, що вам буде дано три входи: a, b, p, де aі bпозитивні цілі числа , і pє простим.

Обчислити:

Перевірка теореми Вольстенгольма

де aі bє натуральними цілими числами і pє простими, а дужки - двочленним коефіцієнтом .

Технічні характеристики

З моменту:

комбінаторика

де і круглі дужки є коефіцієнтом двочленів .

Ви можете припустити, що 2b <= a

Тестові шафи

a b p  output
6 2 5  240360
3 1 13 3697053
7 3 13 37403621741662802118325

2
Я відчуваю, що результати повинні мати .0завершення, щоб дійсно показати, що від підрозділу не залишилося.
El'endia Starman

3
@ El'endiaStarman Давай.
Leaky Nun

1
Чи [240360](однотонний масив) буде прийнятним вихідним форматом?
Денніс

1
Я не думаю, що існує така, через що я прошу.
Денніс

2
@Dennis Потім зробіть один.
Leaky Nun

Відповіді:


5

Haskell, 73 71 байт

Через рекурсію ця реалізація відбувається дуже повільно. На жаль, моє визначення біноміального коефіцієнта має таку ж довжину, як і import Math.Combinatorics.Exact.Binomial.

n#k|k<1||k>=n=1|1>0=(n-1)#(k-1)+(n-1)#k --binomial coefficient
f a b p=div((a*p)#(b*p)-a#b)p^3       --given formula

Цікавим дивом є те, що Haskell 98 дозволив отримати арифметичні візерунки, які скоротили б той самий код до 64 байт:

g a b p=div((a*p)#(b*p)-a#b)p^3
n+1#k|k<1||k>n=1|1>0=n#(k-1)+n#k

5
Чи не повинна версія Haskell 98 як і раніше бути дійсним?
Майкл Клейн

4

Желе , 12 11 10 байт

ż×c/I÷S÷²}

Очікує a, bі pяк аргументи командного рядка.

Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Як це працює

ż×c/I÷S÷²}  Main link. Left argument: a, b. Right argument: p

 ×          Multiply; yield [pa, pb].
ż           Zipwith; yield [[a, pa], [b, pb]].
  c/        Reduce columns by combinations, yielding [aCb, (pa)C(pb)].
    I       Increments; yield [(pa)C(pb) - aCb].
     ÷      Divide; yield [((pa)C(pb) - aCb) ÷ p].
      S     Sum; yield ((pa)C(pb) - aCb) ÷ p.
        ²}  Square right; yield p².
       ÷    Divide; yield  ((pa)C(pb) - aCb) ÷ p³.

4

Python 2, 114 109 85 71 байт

Проста реалізація. Пропозиції з гольфу вітаються.

Редагувати: -29 байт завдяки Leaky Nun та -14 байт завдяки Dennis.

lambda a,b,p,f=lambda n,m:m<1or f(n-1,m-1)*n/m:(f(a*p,b*p)-f(a,b))/p**3

Більш простою, такою ж довжиною альтернатива, завдяки Деннісу, є

f=lambda n,m:m<1or f(n-1,m-1)*n/m
lambda a,b,p:(f(a*p,b*p)-f(a,b))/p**3

Ось це golfed факторний лямбда
NonlinearFruit

3

05AB1E , 11 байт

Вводиться як:

[a, b]
p

Код:

*`c¹`c-²3m÷

Використовує кодування CP-1252 . Спробуйте в Інтернеті! .


У вас був гольф Денніс?
Leaky Nun

9
Якби я був у взутті Денніса, я думаю, я б трохи втомився від усіх цих коментарів "перевершив Денніс" ...
Луїс Мендо

7
@LuisMendo Я можу або не хочу їх регулярно обробляти.
Денніс

2
і гес в 10. Це було весело, поки тривало хлопчиків
downrep_nation

3

R, 50 48 байт

function(a,b,p)(choose(a*p,b*p)-choose(a,b))/p^3

Настільки просто, наскільки це можливо ... Завдяки @Neil за збереження 2 байтів.


1
Скільки цих просторів необхідно?
Ніл

42 байт шляхом перейменування chooseі за допомогою pryr::fвизначення функції: B=choose;pryr::f((B(a*p,b*p)-B(a,b))/p^3).
rturnbull

2

MATL , 13 байт

y*hZ}Xnd2G3^/

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

Останній тестовий випадок не дає точного цілого числа через чисельну точність. Тип даних за замовчуванням MATL ( double) може обробляти лише точні цілі числа до 2^53.

Пояснення

y   % Implicitly input [a; b] (col vector) and p (number). Push another copy of [a; b]
    %   Stack: [a; b], p, [a; b]
*   % Multiply the top two elements from the stack
    %   Stack: [a; b], [a*p; b*p]
h   % Concatenate horizontally
    %   Stack: [a, a*p; b, b*p]
Z}  % Split along first dimension
    %   Stack: [a, a*p], [b, b*p]
Xn  % Vectorize nchoosek
    %   Stack: [nchoosek(a,b), nchoosek(a*p,b*p)]
d   % Consecutive differences of array
    %   Stack: nchoosek(a,b)-nchoosek(a*p,b*p)
2G  % Push second input again
    %   Stack: nchoosek(a,b)-nchoosek(a*p,b*p), p
3^  % Raise to third power
    %   Stack: nchoosek(a,b)-nchoosek(a*p,b*p), p^3
/   % Divide top two elements from the stack
    %   Stack: (nchoosek(a,b)-nchoosek(a*p,b*p))/p^3
    % Implicitly display

2

J, 17 байт

(!/@:*-!/@[)%]^3:

Використання

(b,a) ( (!/@:*-!/@[)%]^3: ) p

Наприклад:

   2 6 ( (!/@:*-!/@[)%]^3: ) 5
240360

Це лише пряма реалізація формули поки що.

Примітка : для третього тестового вхідного номера цифри повинні бути визначені як розширені (для обробки великої арифметики):

   3x 7x ( (!/@:*-!/@[)%]^3: ) 13x
37403621741662802118325

2

Брахілог , 52 байти

tT;T P&t^₃D&h↰₁S&h;Pz×₎ᵐ↰₁;S-;D/
hḟF&⟨{-ḟ}×{tḟ}⟩;F↻/

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

Приймає введення [[a, b], p].

% Predicate 1 - Given [n, r], return binomial(n, r)
hḟF              % Compute n!, set as F
&⟨               % Fork:
  {-ḟ}           % (n - r)!
  ×              % times
  {tḟ}           % r!
⟩                
;F↻              % Prepend n! to that
/                % Divide n! by the product and return

% Predicate 0 (Main)
tT;T P           % Set P to the array [p, p] 
&t^₃D            % Set D as p^3
&h↰₁S            % Call predicate 1 on [a, b], 
                 %  set S as the result binomial(a, b)
&h;Pz×₎ᵐ         % Form array [ap, bp]
↰₁               % Call predicate 1 on that to get binomial(ap, bp)
;S-              % Get binomial(ap, bp) - binomial(a, b)
;D/              % Divide that by the denominator term p^3
                 % Implicit output

1

Python 3 з SciPy , 72 байти

from scipy.special import*
lambda a,b,p:(binom(a*p,b*p)-binom(a,b))/p**3

Анонімна функція, яка приймає введення через аргумент і повертає результат.

Тут багато чого не відбувається; це пряма реалізація бажаного обчислення.

Спробуйте його на Ideone (результат повертається в експоненціальній позначці для останнього тестового випадку)


1

Нім , 85 82 75 59 байт

import math,future
(a,b,p)=>(binom(a*p,b*p)-binom(a,b))/p^3

Це анонімна процедура; щоб використовувати його, він повинен бути переданий як аргумент іншій процедурі, яка його друкує. Повна програма, яку можна використовувати для тестування, наведена нижче

import math,future
proc test(x: (int, int, int) -> float) =
 echo x(3, 1, 13) # substitute in your input or read from STDIN
test((a,b,p)=>(binom(a*p,b*p)-binom(a,b))/p^3)

Процес mathмодуля Німа binomобчислює двочленний коефіцієнт двох його аргументів.



0

JavaScript (ES6), 70 байт

(a,b,p,c=(a,b)=>a==b|!b||c(--a,b)+c(a,--b))=>(c(a*p,b*p)-c(a,b))/p/p/p

Збережіть 1 байт за допомогою ES7 ( /p**3замість /p/p/p).



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