Vérifier le théorème de Wolstenholme

14

Définition

Le théorème de Wolstenholme déclare que:

Théorème de Wolstenholme

aet bsont des entiers positifs et pest premier, et la grande chose entre parenthèses est le coefficient binomial .

Tâche

Pour vérifier cela, vous aurez trois entrées: a, b, p, où aet bsont des nombres entiers positifs et pest premier.

Calculer:

Vérification du théorème de Wolstenholme

aet bsont des entiers positifs et pest premier, et la chose entre parenthèses est le coefficient binomial .

Spécifications

Puisque:

combinatoire

où et la chose entre parenthèses est le coefficient binomial .

Vous pouvez supposer que 2b <= a

Cas de test

a b p  output
6 2 5  240360
3 1 13 3697053
7 3 13 37403621741662802118325
Leaky Nun
la source
2
J'ai l'impression que les sorties devraient avoir un .0à la fin, pour vraiment montrer qu'il n'y a pas de restes de la division.
El'endia Starman
3
@ El'endiaStarman Allez.
Leaky Nun
1
Est-ce que [240360](tableau singleton) serait un format de sortie acceptable?
Dennis
1
Je ne pense pas qu'il y en ait un, c'est pourquoi je demande.
Dennis
2
@Dennis Faites-en un.
Leaky Nun

Réponses:

5

Haskell, 73 71 octets

En raison de la récursivité, cette implémentation est très lente. Malheureusement, ma définition du coefficient binomial a la même longueur que 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

Une bizarrerie intéressante est que Haskell 98 a permis des modèles arithmétiques qui auraient raccourci le même code à 64 octets:

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
flawr
la source
5
La version Haskell 98 ne devrait-elle pas encore être une soumission valide?
Michael Klein
4

Gelée , 12 11 10 octets

ż×c/I÷S÷²}

Attend a, bet pcomme arguments de ligne de commande.

Essayez-le en ligne! ou vérifiez tous les cas de test .

Comment ça fonctionne

ż×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
la source
4

Python 2, 114 109 85 71 octets

Une implémentation simple. Suggestions de golf bienvenues.

Edit: -29 octets grâce à Leaky Nun et -14 octets grâce à 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

Une alternative plus simple et de même longueur, grâce à Dennis, est

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
la source
Voici une lambda factorielle golfée
NonlinearFruit
3

05AB1E , 11 octets

Prend l'entrée comme:

[a, b]
p

Code:

*`c¹`c-²3m÷

Utilise l' encodage CP-1252 . Essayez-le en ligne! .

Adnan
la source
Avez-vous joué au golf Dennis?
Leaky Nun
9
Si j'étais à la place de Dennis, je pense que je serais un peu fatigué de tous ces commentaires de "outgolf Dennis" ...
Luis Mendo
7
@LuisMendo Je peux ou non les nuquer régulièrement.
Dennis
2
et hes à 10. c'était amusant pendant que ça durait les garçons
downrep_nation
3

R, 50 48 octets

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

Aussi simple que possible ... Merci à @Neil d'avoir économisé 2 octets.

Forgottenscience
la source
1
Combien de ces espaces sont nécessaires?
Neil
42 octets en renommant chooseet en utilisant pryr::fpour définir la fonction: B=choose;pryr::f((B(a*p,b*p)-B(a,b))/p^3).
rturnbull
2

MATL , 13 octets

y*hZ}Xnd2G3^/

Essayez-le en ligne!

Le dernier cas de test ne produit pas un entier exact en raison de la précision numérique. Le type de données par défaut de MATL ( double) ne peut gérer que des entiers exacts jusqu'à 2^53.

Explication

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
la source
2

J, 17 octets

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

Usage

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

Par exemple:

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

Il ne s'agit pour l'instant que d'une mise en œuvre directe de la formule.

Remarque : pour le 3ème cas de test, les numéros d'entrée doivent être définis comme étendus (pour gérer une grande arithmétique):

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

Brachylog , 52 octets

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

Essayez-le en ligne!

Accepte l'entrée [[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 - Rétablir Monica
la source
1

Python 3 avec SciPy , 72 octets

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

Une fonction anonyme qui prend l'entrée via un argument et renvoie le résultat.

Il ne se passe pas grand-chose ici; il s'agit d'une implémentation directe du calcul souhaité.

Essayez-le sur Ideone (le résultat est retourné en notation exponentielle pour le dernier cas de test)

TheBikingViking
la source
1

Nim , 85 82 75 59 octets

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

Il s'agit d'une procédure anonyme; pour l'utiliser, il doit être passé en argument à une autre procédure, qui l'imprime. Un programme complet qui peut être utilisé pour les tests est donné ci-dessous

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)

mathLe binomproc du module de Nim calcule le coefficient binomial de ses deux arguments.

Cuivre
la source
0

JavaScript (ES6), 70 octets

(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

Économisez 1 octet en utilisant ES7 ( /p**3au lieu de /p/p/p).

Neil
la source