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.