验证沃尔斯滕霍姆定理


14

定义

沃尔斯滕霍姆定理指出:

沃尔斯滕霍姆定理

其中 ab是正整数,p是素数,大括号是二项式系数

任务

为了验证这一点,你将有三个输入:abp,其中ab是正整数且p是素数。

计算:

沃尔斯滕霍姆定理的证明

其中 ab是正整数,p是质数,括号thing是二项式系数

眼镜

以来:

组合学

其中,圆括号是二项式系数

您可以假设 2b <= a

测试用例

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

2
我觉得输出应该.0在末尾,以真正表明该部门没有剩余。
El'endia Starman

3
@ El'endiaStarman加油。
Leaky Nun

1
[240360](单阵列)是一种可接受的输出格式?
丹尼斯

1
我认为没有一个,这就是为什么我要问。
丹尼斯

2
@丹尼斯然后做一个。
Leaky Nun

Answers:


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版本是否仍应为有效提交?
Michael Klein

4

果冻12 11 10 字节

ż×c/I÷S÷²}

Expect 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字节感谢Leaky Nun,-14字节感谢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

借助丹尼斯,一个更简单,等长的替代方案是

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

是一个打高尔夫球的阶乘lambda
NonlinearFruit

3

05AB1E,11个字节

输入为:

[a, b]
p

码:

*`c¹`c-²3m÷

使用CP-1252编码。在线尝试!


你出去高尔夫丹尼斯吗?
Leaky Nun

9
如果我穿着丹尼斯的鞋子,我想我会对所有这些“高尔夫丹尼斯”评论感到有些厌烦……
路易斯·门多

7
@LuisMendo我可能会或可能不会定期对它们进行操作。
丹尼斯

2
和hes在10
岁时

3

R,50 48字节

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

尽可能简单明了...感谢@Neil节省了2个字节。


1
这些空间中有多少是必需的?
尼尔

通过重命名choose并使用pryr::f定义函数来获取42个字节: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

到目前为止,这只是该公式的直接实现。

注意:对于第三个测试用例,必须将输入数字定义为扩展的(以处理大运算):

   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

具有SciPy的 Python 3,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计算其两个参数的二项式系数。



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个字节。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.