Sprawdź twierdzenie Wolstenholme'a

14

Definicja

Twierdzenie Wolstenholme'a stwierdza, że:

Wolstenholme's theorem

gdzie ai bsą dodatnimi liczbami całkowitymi i pjest liczbą pierwszą, a dużym nawiasami jest współczynnik dwumianowy .

Zadanie

Aby zweryfikować, że będziesz miał trzy wejścia: a, b, p, gdzie ai bsą liczbami całkowitymi dodatnimi i pjest liczbą pierwszą.

Obliczać:

Verification of Wolstenholme's theorem

gdzie ai bsą dodatnimi liczbami całkowitymi i pjest liczbą pierwszą, a nawiasami jest współczynnik dwumianowy .

Okular

Od:

combinatorics

gdzie i nawiasami jest współczynnik dwumianowy .

Możesz to założyć 2b <= a

Przypadki testowe

a b p  output
6 2 5  240360
3 1 13 3697053
7 3 13 37403621741662802118325
Leaky Nun
źródło
2
Wydaje mi się, że wyjścia powinny mieć .0końcówkę, aby naprawdę pokazać, że nie ma już resztek. Z podziału.
El'endia Starman
3
@ El'endiaStarman Chodź.
Leaky Nun
1
Czy [240360](tablica singletonów) byłby akceptowalnym formatem wyjściowym?
Dennis
1
Nie wydaje mi się, żeby taki istniał, dlatego pytam.
Dennis
2
@Dennis Następnie zrób jeden.
Leaky Nun

Odpowiedzi:

5

Haskell, 73 71 bajtów

Ze względu na rekurencję ta implementacja jest bardzo powolna. Niestety moja definicja dwumianowego współczynnika ma taką samą długość jak 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

Ciekawostką jest to, że Haskell 98 dopuszczał wzorce arytmetyczne, które skróciłyby ten sam kod do 64 bajtów:

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
wada
źródło
5
Czy wersja Haskell 98 nadal nie powinna być poprawna?
Michael Klein,
4

Galaretka , 12 11 10 bajtów

ż×c/I÷S÷²}

Oczekuje a, bi pjako argumenty wiersza polecenia.

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

ż×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³.
Dennis
źródło
4

Python 2, 114 109 85 71 bajtów

Prosta implementacja. Sugestie dotyczące gry w golfa mile widziane.

Edycja: -29 bajtów dzięki Dziurawej Zakonnicy i -14 bajtów dzięki Dennisowi.

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

Dzięki Dennisowi jest prostsza alternatywa o tej samej długości

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
Sherlock9
źródło
Oto golfowa czynnikowa lambda
NonlinearFruit
3

05AB1E , 11 bajtów

Pobiera dane wejściowe jako:

[a, b]
p

Kod:

*`c¹`c-²3m÷

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

Adnan
źródło
Czy grałeś w Dennisa w golfa?
Leaky Nun
9
Gdybym był w buty Dennisa myślę, że jest trochę zmęczony wszystkie te «outgolf Dennis» komentarze ...
Luis Mendo
7
@LuisMendo Mogę, ale nie musi, nukować je regularnie.
Dennis
2
i ma 10 lat. Było fajnie, dopóki trwały chłopcy
downrep_nation
3

R, 50 48 bajtów

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

Tak proste, jak to tylko możliwe ... Dzięki @Neil za oszczędność 2 bajtów.

Forgottenscience
źródło
1
Ile z tych miejsc jest potrzebnych?
Neil
42 bajtów przez zmiany nazwy choosei stosując pryr::fdo określenia funkcji: B=choose;pryr::f((B(a*p,b*p)-B(a,b))/p^3).
rturnbull
2

MATL , 13 bajtów

y*hZ}Xnd2G3^/

Wypróbuj online!

Ostatni przypadek testowy nie podaje dokładnej liczby całkowitej ze względu na dokładność liczbową. Domyślny typ danych MATL ( double) może obsługiwać tylko dokładne liczby całkowite do 2^53.

Wyjaśnienie

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
Luis Mendo
źródło
2

J, 17 bajtów

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

Stosowanie

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

Na przykład:

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

Jest to dotychczas tylko bezpośrednie wdrożenie formuły.

Uwaga : w przypadku 3 przypadków testowych liczby wejściowe muszą być zdefiniowane jako rozszerzone (w celu obsługi dużej arytmetyki):

   3x 7x ( (!/@:*-!/@[)%]^3: ) 13x
37403621741662802118325
Dan Oak
źródło
2

Brachylog , 52 bajty

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

Wypróbuj online!

Akceptuje dane wejściowe [[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
sundar - Przywróć Monikę
źródło
1

Python 3 z SciPy , 72 bajty

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

Anonimowa funkcja, która pobiera dane wejściowe za pomocą argumentu i zwraca wynik.

Tutaj niewiele się dzieje; jest to bezpośrednia implementacja pożądanego obliczenia.

Wypróbuj na Ideone (wynik jest zwracany w notacji wykładniczej dla ostatniego przypadku testowego)

TheBikingViking
źródło
1

Nim , 85 82 75 59 bajtów

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

To jest anonimowa procedura; aby go użyć, musi zostać przekazany jako argument do innej procedury, która go drukuje. Pełny program, który można wykorzystać do testowania, podano poniżej

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)

Proc. mathModułu Nima binomoblicza dwumianowy współczynnik dwóch argumentów.

Miedź
źródło
0

JavaScript (ES6), 70 bajtów

(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

Zaoszczędź 1 bajt, używając ES7 ( /p**3zamiast /p/p/p).

Neil
źródło