ウォルステンホルムの定理を検証する


14

定義

ウォルステンホルムの定理は次のように述べています。

ウォルステンホルムの定理

ここで aand bは正の整数でpあり素数であり、大きな括弧は二項係数です。

仕事

それを確認するには、3つの入力を与えられます:abp、どこaおよびb正の整数であり、p素数です。

計算:

ウォルステンホルムの定理の検証

ここで aand bは正の整数でpあり素数であり、かっこは二項係数です。

スペック

以来:

組み合わせ論

ここで、かっこは二項係数です。

あなたはそれを仮定することができます 2b <= a

テストケース

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

2
部門からの残り物がないこと.0本当に示すために、アウトプットは最後にあるべきだと思います。
エレンディアスターマン

3
@ El'endiaStarmanさあ。
リーキー修道女

1
であろう[240360](シングルトン配列)が許容される出力形式であること?
デニス

1
私はそれがあるとは思わない、それが私が尋ねている理由です。
デニス

2
@Dennisそれからそれを作ります。
リーキー修道女

回答:


5

Haskell、73 71バイト

再帰のため、この実装は非常に遅くなります。残念ながら、二項係数の私の定義はと同じ長さ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

興味深い奇妙な点は、Haskell 98が同じコードを64バイトに短縮する算術パターンを許可したことです。

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
Haskell 98バージョンはまだ有効な提出物ではありませんか?
マイケルクライン

4

ゼリー12 11 10 バイト

ż×c/I÷S÷²}

期待a, bp、コマンドライン引数として。

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

ż×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バイト

シンプルな実装。ゴルフの提案を歓迎します。

編集:リーキー修道女のおかげで-29バイト、デニスのおかげで-14バイト。

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

デニスのおかげで、よりシンプルで同じ長さの代替品は、

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

ここで golfed階乗ラムダがある
NonlinearFruit

3

05AB1E、11バイト

次のように入力します。

[a, b]
p

コード:

*`c¹`c-²3m÷

CP-1252エンコードを使用します。オンラインでお試しください!


デニスをアウトゴルフしましたか?
リーキー修道女

9
私はデニスの靴にあった場合、私はこれらすべての『デニスoutgolf』コメント...少し疲れと思う
ルイスMendo

7
@LuisMendo私は定期的にそれらをnukingかもしれないし、そうでないかもしれない。
デニス

2
それは男の子続いている間およびHESは10でそれは楽しみだった
downrep_nation

3

R、50 48バイト

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

できる限り簡単に... 2バイトを節約してくれた@Neilに感謝します。


1
これらのスペースはいくつ必要ですか?
ニール

42は、リネームによってバイトchooseと使用してpryr::f関数を定義します:B=choose;pryr::f((B(a*p,b*p)-B(a,b))/p^3)
rturnbull

2

MATL、13バイト

y*hZ}Xnd2G3^/

オンラインでお試しください!

最後のテストケースは、数値の精度のために正確な整数を生成しません。MATLのデフォルトのデータ型(double)は、までの正確な整数のみを処理でき2^53ます。

説明

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バイト

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

使用法

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

例えば:

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

これは、これまでの式の単なる直接的な実装です。

:3番目のテストケースの入力番号は、拡張として定義する必要があります(大きな算術を処理するため)。

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

2

Brachylog、52バイト

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

オンラインでお試しください!

入力を受け入れます[[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、SciPy、72バイト

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

引数を介して入力を受け取り、結果を返す無名関数。

ここではそれほど多くはありません。これは、目的の計算を直接実装したものです。

Ideoneで試してみてください(最後のテストケースの結果は指数表記で返されます)


1

Nim85 82 75 59バイト

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

これは匿名の手順です。これを使用するには、引数として別のプロシージャに渡して、出力する必要があります。テストに使用できる完全なプログラムを以下に示します

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)

Nimのmathモジュールのbinomprocは、2つの引数の二項係数を計算します。



0

JavaScript(ES6)、70バイト

(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

ES7(/p**3ではなく/p/p/p)を使用して1バイトを保存します。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.