Verifikasi teorema Wolstenholme

14

Definisi

Teorema Wolstenholme menyatakan bahwa:

Teorema Wolstenholme

di mana adan bbilangan bulat positif dan pprima, dan tanda kurung besar adalah koefisien Binomial .

Tugas

Untuk memverifikasi bahwa, Anda akan diberikan tiga input: a, b, p, di mana adan badalah bilangan bulat positif dan pperdana.

Menghitung:

Verifikasi teorema Wolstenholme

di mana adan bbilangan bulat positif dan pprima, dan tanda kurung adalah koefisien Binomial .

Spesifikasi

Sejak:

kombinatorik

dimana dan tanda kurung adalah koefisien Binomial .

Anda bisa berasumsi itu 2b <= a

Testcases

a b p  output
6 2 5  240360
3 1 13 3697053
7 3 13 37403621741662802118325
Biarawati Bocor
sumber
2
Saya merasa output harus ada .0pada akhirnya, untuk benar - benar menunjukkan bahwa tidak ada sisa dari divisi.
El'endia Starman
3
@ El'endiaStarman Ayo.
Leaky Nun
1
Apakah [240360](array tunggal) menjadi format output yang dapat diterima?
Dennis
1
Saya tidak berpikir ada satu, itulah sebabnya saya bertanya.
Dennis
2
@ Dennis Lalu buat satu.
Leaky Nun

Jawaban:

5

Haskell, 73 71 byte

Karena rekursi, implementasi ini sangat lambat. Sayangnya definisi saya tentang koefisien binomial memiliki panjang yang sama dengan 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

Keanehan yang menarik adalah bahwa Haskell 98 memang memungkinkan untuk pola aritmatika yang akan mempersingkat kode yang sama menjadi 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
cacat
sumber
5
Tidakkah seharusnya versi Haskell 98 tetap menjadi kiriman yang valid?
Michael Klein
4

Jelly , 12 11 10 byte

ż×c/I÷S÷²}

Mengharapkan a, bdan psebagai argumen baris perintah.

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

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

Python 2, 114 109 85 71 byte

Implementasi yang sederhana. Saran bermain golf diterima.

Sunting: -29 bytes berkat Leaky Nun dan -14 bytes berkat 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

Alternatif yang lebih sederhana, sama panjang, dengan terima kasih kepada Dennis, adalah

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
sumber
Berikut adalah lambda faktorial golf
NonlinearFruit
3

05AB1E , 11 byte

Mengambil input sebagai:

[a, b]
p

Kode:

*`c¹`c-²3m÷

Menggunakan pengkodean CP-1252 . Cobalah online! .

Adnan
sumber
Apakah Anda bermain golf Dennis?
Leaky Nun
9
Jika saya berada di posisi Dennis, saya pikir saya akan bosan dengan semua komentar "outgolf Dennis" ini ...
Luis Mendo
7
@LuisMendo Saya mungkin atau mungkin tidak nuking secara teratur.
Dennis
2
dan dia jam 10. menyenangkan ketika berlangsung anak laki
downrep_nation
3

R, 50 48 byte

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

Sesederhana mungkin ... Terima kasih kepada @Neil untuk menyimpan 2 byte.

Forgottenscience
sumber
1
Berapa banyak ruang yang diperlukan?
Neil
42 byte dengan mengganti nama choosedan dengan menggunakan pryr::funtuk menentukan fungsi: B=choose;pryr::f((B(a*p,b*p)-B(a,b))/p^3).
rturnbull
2

MATL , 13 byte

y*hZ}Xnd2G3^/

Cobalah online!

Kasing uji terakhir tidak menghasilkan bilangan bulat yang tepat karena presisi numerik. Tipe data standar MATL (double ) hanya dapat menangani bilangan bulat yang tepat hingga 2^53.

Penjelasan

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

J, 17 byte

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

Pemakaian

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

Sebagai contoh:

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

Ini hanyalah implementasi langsung dari formula sejauh ini.

Catatan : untuk nomor input testcase ke-3 harus didefinisikan sebagai extended (untuk menangani aritmatika besar):

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

Brachylog , 52 byte

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

Cobalah online!

Menerima 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
sundar - Pasang kembali Monica
sumber
1

Python 3 dengan SciPy , 72 byte

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

Fungsi anonim yang mengambil input melalui argumen dan mengembalikan hasilnya.

Tidak banyak yang terjadi di sini; ini adalah implementasi langsung dari perhitungan yang diinginkan.

Cobalah di Ideone (hasilnya dikembalikan dalam notasi eksponensial untuk kasus uji terakhir)

TheBikingViking
sumber
1

Nim , 85 82 75 59 byte

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

Ini adalah prosedur anonim; untuk menggunakannya, itu harus diteruskan sebagai argumen ke prosedur lain, yang mencetaknya. Program lengkap yang dapat digunakan untuk pengujian diberikan di bawah ini

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)

Proc mathmodul Nim binommenghitung koefisien binomial dari dua argumennya.

Tembaga
sumber
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

Hemat 1 byte dengan menggunakan ES7 ( /p**3bukan /p/p/p).

Neil
sumber
0

Pari / GP , 43 byte

(a,b,p)->((c=binomial)(a*p,b*p)-c(a,b))/p^3

Cobalah online!

alephalpha
sumber