Verificar el teorema de Wolstenholme

14

Definición

El teorema de Wolstenholme establece que:

Teorema de Wolstenholme

donde ay bson enteros positivos y pes primo, y la gran cosa entre paréntesis es el coeficiente binomial .

Tarea

Para verificar esto, se le dará tres entradas: a, b, p,, donde ay bson números enteros positivos y pes primo.

Calcular:

Verificación del teorema de Wolstenholme

donde ay bson enteros positivos y pes primo, y el paréntesis es el coeficiente binomial .

Especificaciones

Ya que:

combinatoria

donde y el paréntesis es el coeficiente binomial .

Puedes asumir que 2b <= a

Casos de prueba

a b p  output
6 2 5  240360
3 1 13 3697053
7 3 13 37403621741662802118325
Monja permeable
fuente
2
Siento que las salidas deberían tener un .0final, para mostrar realmente que no hay restos de la división.
El'endia Starman
3
@ El'endiaStarman Vamos.
Leaky Nun
1
¿Sería [240360](matriz singleton) un formato de salida aceptable?
Dennis
1
No creo que haya uno, por eso lo pregunto.
Dennis
2
@ Dennis Entonces haz uno.
Leaky Nun

Respuestas:

5

Haskell, 73 71 bytes

Debido a la recurrencia, esta implementación es muy lenta. Lamentablemente, mi definición del coeficiente binomial tiene la misma longitud 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

Una rareza interesante es que Haskell 98 permitió patrones aritméticos que habrían acortado el mismo código a 64 bytes:

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
falla
fuente
55
¿No debería la versión Haskell 98 seguir siendo válida?
Michael Klein
4

Jalea , 12 11 10 bytes

ż×c/I÷S÷²}

Espera a, by pcomo argumentos de línea de comandos.

Pruébalo en línea! o verificar todos los casos de prueba .

Cómo funciona

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

Python 2, 114 109 85 71 bytes

Una implementación simple. Sugerencias de golf bienvenidas.

Editar: -29 bytes gracias a Leaky Nun y -14 bytes gracias a 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

Una alternativa más simple y de la misma longitud, gracias a Dennis, es

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
fuente
Aquí hay un lambda factorial golfizado
NonlinearFruit
3

05AB1E , 11 bytes

Toma entrada como:

[a, b]
p

Código:

*`c¹`c-²3m÷

Utiliza la codificación CP-1252 . Pruébalo en línea! .

Adnan
fuente
¿Jugaste al golf Dennis?
Leaky Nun
99
Si estuviera en los zapatos de Dennis, creo que me cansaría un poco de todos estos comentarios del "outgolf Dennis" ...
Luis Mendo
77
@LuisMendo Puedo o no estar bombardeándolos regularmente.
Dennis
2
y tiene 10 años. Fue divertido mientras duró muchachos
downrep_nation
3

R, 50 48 bytes

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

Tan sencillo como puede ser ... Gracias a @Neil por guardar 2 bytes.

Olvida la ciencia
fuente
1
¿Cuántos de esos espacios son necesarios?
Neil
42 bytes por el cambio de nombre choosey usando pryr::fpara definir la función: B=choose;pryr::f((B(a*p,b*p)-B(a,b))/p^3).
rturnbull
2

MATL , 13 bytes

y*hZ}Xnd2G3^/

Pruébalo en línea!

El último caso de prueba no produce un número entero exacto debido a la precisión numérica. El tipo de datos predeterminado de MATL ( double) solo puede manejar enteros exactos hasta 2^53.

Explicación

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

J, 17 bytes

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

Uso

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

Por ejemplo:

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

Esto es solo una implementación directa de la fórmula hasta ahora.

Nota : para la tercera prueba, los números de entrada deben definirse como extendidos (para manejar aritmética grande):

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

Brachylog , 52 bytes

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

Pruébalo en línea!

Acepta entrada [[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 - Restablecer a Monica
fuente
1

Python 3 con SciPy , 72 bytes

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

Una función anónima que toma datos a través de argumentos y devuelve el resultado

No hay mucho que hacer aquí; Esta es una implementación directa del cálculo deseado.

Pruébelo en Ideone (el resultado se devuelve en notación exponencial para el último caso de prueba)

TheBikingViking
fuente
1

Nim , 85 82 75 59 bytes

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

Este es un procedimiento anónimo; para usarlo, se debe pasar como argumento a otro procedimiento, que lo imprime. A continuación se ofrece un programa completo que se puede utilizar para realizar pruebas.

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)

El proceso del mathmódulo de Nim binomcalcula el coeficiente binomial de sus dos argumentos.

Cobre
fuente
0

JavaScript (ES6), 70 bytes

(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

Ahorre 1 byte utilizando ES7 (en /p**3lugar de /p/p/p).

Neil
fuente