Verifica il teorema di Wolstenholme


14

Definizione

Il teorema di Wolstenholme afferma che:

Teorema di Wolstenholme

dove ae bsono numeri interi positivi ed pè primo, e la cosa più grande tra parentesi è il coefficiente binomiale .

Compito

Per verificare che, vi verrà dato tre ingressi: a, b, p, dove ae bsono interi positivi e pè primo.

Calcolare:

Verifica del teorema di Wolstenholme

dove ae bsono numeri interi positivi ed pè primo, e la cosa tra parentesi è il coefficiente binomiale .

Specifiche

Da:

combinatorio

dove e tra parentesi è il coefficiente binomiale .

Puoi presumere che 2b <= a

Casi test

a b p  output
6 2 5  240360
3 1 13 3697053
7 3 13 37403621741662802118325

2
Sento che le uscite dovrebbero avere un .0fine, per mostrare davvero che non c'è avanzi. Dalla divisione.
El'endia Starman,

3
@ El'endiaStarman Dai.
Leaky Nun,

1
Sarebbe [240360](array singoletto) sia un formato di output accettabile?
Dennis,

1
Non credo ce ne sia uno, motivo per cui lo sto chiedendo.
Dennis,

2
@Dennis Allora creane uno.
Leaky Nun,

Risposte:


5

Haskell, 73 71 byte

A causa della ricorsione, questa implementazione è molto lenta. Sfortunatamente la mia definizione del coefficiente binomiale ha la stessa lunghezza di 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 stranezza interessante è che Haskell 98 ha consentito modelli aritmetici che avrebbero abbreviato lo stesso codice a 64 byte:

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

5
La versione di Haskell 98 non dovrebbe essere comunque valida?
Michael Klein,

4

Gelatina , 12 11 10 byte

ż×c/I÷S÷²}

Si aspetta a, be pcome argomenti da riga di comando.

Provalo online! o verifica tutti i casi di test .

Come funziona

ż×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 byte

Una semplice implementazione. Suggerimenti di golf benvenuti.

Modifica: -29 byte grazie a Leaky Nun e -14 byte grazie 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

Un'alternativa più semplice e della stessa lunghezza, grazie a Dennis, è

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

Ecco un lambda fattoriale golfizzato
NonlinearFruit

3

05AB1E , 11 byte

Accetta input come:

[a, b]
p

Codice:

*`c¹`c-²3m÷

Utilizza la codifica CP-1252 . Provalo online! .


Hai giocato a golf fuori Dennis?
Leaky Nun,

9
Se fossi nei panni di Dennis, penso che mi stancherei un po 'di tutti questi commenti "superbi Dennis" ...
Luis Mendo,

7
@LuisMendo Potrei o meno essere screditato su base regolare.
Dennis,

2
ed è alle 10. è stato divertente mentre è durato ragazzi
downrep_nation

3

R, 50 48 byte

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

Il più semplice possibile ... Grazie a @Neil per aver salvato 2 byte.


1
Quanti di questi spazi sono necessari?
Neil,

42 byte rinominando choosee utilizzando pryr::fper definire la funzione: B=choose;pryr::f((B(a*p,b*p)-B(a,b))/p^3).
rturnbull,

2

MATL , 13 byte

y*hZ}Xnd2G3^/

Provalo online!

L'ultimo caso di test non produce un numero intero esatto a causa della precisione numerica. Il tipo di dati predefinito di MATL ( double) può gestire solo numeri interi esatti fino a 2^53.

Spiegazione

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 byte

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

uso

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

Per esempio:

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

Questa è solo un'implementazione diretta della formula finora.

Nota : per il 3o testcase i numeri di input devono essere definiti come estesi (per gestire l'aritmetica di grandi dimensioni):

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

2

Brachylog , 52 byte

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

Provalo online!

Accetta input [[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 byte

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

Una funzione anonima che accetta input tramite argomento e restituisce il risultato.

Non c'è molto da fare qui; questa è un'implementazione diretta del calcolo desiderato.

Provalo su Ideone (il risultato viene restituito in notazione esponenziale per l'ultimo caso di test)


1

Nim , 85 82 75 59 byte

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

Questa è una procedura anonima; per usarlo, deve essere passato come argomento a un'altra procedura, che lo stampa. Di seguito è riportato un programma completo che può essere utilizzato per i test

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)

mathIl binomproc del modulo di Nim calcola il coefficiente binomiale dei suoi due argomenti.



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

Salvare 1 byte utilizzando ES7 ( /p**3anziché /p/p/p).



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.