用于求出二项式系数的除数的智能算法

时间:2016-05-13 10:25:47

标签: algorithm python-3.x discrete-mathematics binomial-coefficients

我对我的算法提示感兴趣,我用它来查找非常大数的除数,更具体地说是“n over k”或C(n,k)。数字本身的范围可能非常高,所以它确实需要花费时间复杂度来表达“等式”。

n超过k的公式是n! /(k!(nk)!)我明白我必须尝试利用阶乘在某种程度上是“递归”的这一事实 - 但我还没有阅读过多的离散数学因此问题是数学和编程性质。

我想我真正想要的只是让我朝着正确的方向前进的一些提示 - 我真的被卡住了。

1 个答案:

答案 0 :(得分:1)

首先,您可以从以下事实开始:C(n,k)=(n / k)C(n-1,k-1)。
你可以认为C(n,k)可被n / gcd(n,k)整除 如果n是素数,那么n除以C(n,k) 检查Kummer定理:如果p是素数,n是正数,k是正数,0 <0。 k&lt;那么p ^ r除以C(n,k)的最大指数r是基数p中减法n-k所需的进位数。

我们假设n> 4:

  • 如果p> n,则p不能除C(n,k),因为在基数p中,n和k只有一位宽→在减法中没有进位
  • 所以我们必须检查[2; n]中的素数除数。由于C(n,k)= C(n,n-k),我们可以假设k≤n/ 2且n /2≤n-k≤n

  • 对于范围内的素数除数] n / 2; n]我们有n / 2

    ] n-k; n]中的每个素数是C(n,k)的指数为1的素数除数。
     没有素数在] n / 2; n-k]是C(n,k)的素数除数。

  • in] sqrt(n); n / 2]我们有2p≤n<1。 p 2,n恰好是基数p的2位宽,k <1。 n表示k最多有2位数。两种情况:只有一种根本没有携带。仅当n的最后一位数大于p iif n modulo p

    对于每个素数p in] sqrt(n); n / 2] p将C(n; k)除以指数1 iff n mod p&lt; k mod p p不分C(n; k)iff n modp≥kmod p

  • 在[2; sqrt(n)]我们必须检查所有素数。仅在此范围内,素数除数的指数大于1