Überprüfen Sie den Satz von Wolstenholme

14

Definition

Wolstenholmes Satz besagt:

Wolstenholmes Satz

wo aund bsind positive ganze Zahlen und pist Primzahl, und die großen Klammern Ding ist Binomialkoeffizient .

Aufgabe

Um zu überprüfen, werden Sie drei Eingänge gegeben werden: a, b, p, wo aund bpositive ganze Zahlen und pist eine Primzahl.

Berechnen:

Überprüfung des Wolstenholme-Theorems

wo aund bsind positive ganze Zahlen und pist Primzahl, und die Klammer Ding ist Binomialkoeffizient .

Technische Daten

Schon seit:

Kombinatorik

wo und die Klammern Ding ist Binomialkoeffizient .

Das können Sie annehmen 2b <= a

Testfälle

a b p  output
6 2 5  240360
3 1 13 3697053
7 3 13 37403621741662802118325
Undichte Nonne
quelle
2
Ich denke, Outputs sollten ein .0am Ende haben, um wirklich zu zeigen, dass es keine Reste von der Division gibt.
El'endia Starman
3
@ El'endiaStarman Komm schon.
Undichte Nonne
1
Wäre [240360](Singleton-Array) ein akzeptables Ausgabeformat?
Dennis
1
Ich glaube nicht, dass es eine gibt, deshalb frage ich.
Dennis
2
@Dennis Dann mach eins.
Undichte Nonne

Antworten:

5

Haskell, 73 71 Bytes

Aufgrund der Rekursion ist diese Implementierung sehr langsam. Leider hat meine Definition des Binomialkoeffizienten die gleiche Länge wie 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

Eine interessante Kuriosität ist, dass Haskell 98 arithmetische Muster zuließ, die denselben Code auf 64 Bytes verkürzt hätten:

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
fehlerhaft
quelle
5
Sollte die Haskell 98-Version nicht noch gültig sein?
Michael Klein
4

Jelly , 12 11 10 Bytes

ż×c/I÷S÷²}

Erwartet a, bund pals Befehlszeilenargumente.

Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

ż×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
quelle
4

Python 2, 114 109 85 71 Bytes

Eine einfache Implementierung. Golfvorschläge sind willkommen.

Edit: -29 Bytes dank Leaky Nun und -14 Bytes dank 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

Eine einfachere, gleichlange Alternative, dank Dennis, ist

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
quelle
Hier ist ein Golf Faktorielles Lambda
NonlinearFruit
3

05AB1E , 11 Bytes

Übernimmt Eingaben als:

[a, b]
p

Code:

*`c¹`c-²3m÷

Verwendet die CP-1252- Codierung. Probieren Sie es online! .

Adnan
quelle
Hast du Dennis aus dem Golf geholt?
Undichte Nonne
9
Wenn ich in Dennis 'Schuhen stecke, würde ich die ganzen "Outgolf Dennis" -Kommentare satt haben ...
Luis Mendo
7
@ LuisMendo Ich kann oder kann nicht sie regelmäßig nuking.
Dennis
2
und hes um 10. es hat Spaß gemacht, während es Jungs dauerte
downrep_nation
3

R 50 48 Bytes

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

So einfach wie möglich ... Vielen Dank an @Neil für das Speichern von 2 Bytes.

Vergessenswissenschaft
quelle
1
Wie viele dieser Räume sind notwendig?
Neil
42 Bytes , die durch das Umbenennen chooseund unter Verwendung pryr::fder Funktion zu bestimmen: B=choose;pryr::f((B(a*p,b*p)-B(a,b))/p^3).
Rturnbull
2

MATL , 13 Bytes

y*hZ}Xnd2G3^/

Probieren Sie es online!

Der letzte Testfall liefert aufgrund der numerischen Genauigkeit keine exakte Ganzzahl. Der Standarddatentyp ( double) von MATL kann nur exakte ganze Zahlen bis zu verarbeiten 2^53.

Erläuterung

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
quelle
2

J, 17 Bytes

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

Verwendung

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

Beispielsweise:

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

Dies ist nur eine direkte Umsetzung der bisherigen Formel.

Hinweis : Für den 3. Testfall müssen die Eingabenummern als erweitert definiert werden (um große Arithmetik zu verarbeiten):

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

Brachylog , 52 Bytes

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

Probieren Sie es online!

Akzeptiert Eingaben [[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 - Setzen Sie Monica wieder ein
quelle
1

Python 3 mit SciPy , 72 Bytes

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

Eine anonyme Funktion, die Eingaben über Argumente entgegennimmt und das Ergebnis zurückgibt.

Hier ist nicht viel los; Dies ist eine direkte Implementierung der gewünschten Berechnung.

Probiere es auf Ideone aus (das Ergebnis wird in Exponentialschreibweise für den letzten Testfall zurückgegeben)

TheBikingViking
quelle
1

Nim , 85 82 75 59 Bytes

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

Dies ist ein anonymes Verfahren. Um es zu verwenden, muss es als Argument an eine andere Prozedur übergeben werden, die es druckt. Ein vollständiges Programm, das zum Testen verwendet werden kann, ist unten angegeben

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)

Nims mathModul binomproc berechnet den Binomialkoeffizienten seiner beiden Argumente.

Kupfer
quelle
0

JavaScript (ES6), 70 Byte

(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

Speichern Sie 1 Byte mit ES7 ( /p**3anstelle von /p/p/p).

Neil
quelle