algorithm - 寻找二项式系数除数的智能算法

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

我对我用来找出非常大数的除数的算法的技巧很感兴趣,更具体地说是“n over k”或 C(n, k)。这个数字本身的范围可能非常大,所以可以这么说,它确实需要将时间复杂度纳入“方程式”。

n over k 的公式是 n!/(k!(n-k)!) 并且我知道我必须尝试利用这样一个事实,即阶乘在某种程度上是一种“递归”——但我还没有读过太多离散数学,所以这个问题既是数学问题又是编程问题自然。

我想我真正在寻找的只是一些引导我朝着正确方向前进的提示 - 我真的被困住了。

最佳答案

首先,您可以从以下事实开始: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< k < n 则 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 < p≤n,或者等效地 p≤n<2p。我们有 p≥2 所以 p≤n < p² 这意味着当 n 以 p 为底写时恰好有 2 个数字并且第一个数字必须是 1。因为 k≤n/2 < p,k 只能是一个数字宽。要么减法为一个进位和一个仅当 n-k< p ⇒ p 除 C(n,k) 时;减法没有进位并且 p 不除 C(n,k)。
    第一个结果是:

    [n-k;n] 中的每个质数都是 C(n,k) 的一个质因数,指数为 1。
    [n/2;n-k] 中没有质数是 C(n,k) 的质因数。

  • 在 [sqrt(n); n/2] 我们有 2p≤n< p²,n 在基数 p 中正好是 2 位宽,k< n 意味着 k 最多有 2 位。两种情况:只有一个进位,根本没有进位。仅当 n 的最后一位大于 p 的最后一位时才存在进位 iif n modulo p < k modulo p 第二个结果是:

    对于 [sqrt(n);n/2] 中的每个质数 p p 用指数 1 除 C(n;k) 当且仅当 n mod p < k mod p p 不整除 C(n;k) 当且仅当 n mod p ≥ k mod p

  • 在 [2; sqrt(n)] 我们必须检查所有素数。只有在这个范围内,素数的指数才会大于 1

关于algorithm - 寻找二项式系数除数的智能算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37207589/

相关文章:

python - 如何使用 StreamHandler 捕获记录器 stderr 上的输出?

python - 更新了环境变量但 os.getenv() 一直返回 None

python - 断网后如何继续请求发帖

java - 这些子集的排列顺序是什么?

c - 二进制数字的离散分布?

python - 支付员工

algorithm - 计算体射线转换中的梯度

sql - 从可用的 M 个条件中选择至少满足 N 个条件的一个

algorithm - 整数分割

c++ - 代码片段的时间复杂度是O(k*n^2)吗?