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

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

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³.

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

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! .


¿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.


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

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

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

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)


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.



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).



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.