标签: binomial-coefficients

简化这种指数算法的Big-O复杂性

我有一个计数算法,我试图得到一个大致的描述.它是可怕的嵌套和可怕的指数.这里是:

 1. For each T_i in T
 2. For k = 1 to max_k
 3. For each of 2^k*(n choose k) items
 4. For each t in T_i
 5. check if the item is in t...etc.
Run Code Online (Sandbox Code Playgroud)

以下是每个运行时间的逐行概念

  1. 这是一个简单的分区,我只是给它一个常量c1.
  2. max_k是一个小数字,总是小于n,可能大约4或5.我将使用下面的k.
  3. 该循环总是运行2 ^ k*(n选择k)次
  4. 通过考虑第1行常量,我们可以推广这一行,并且知道在最坏的情况下它总是不会超过2 ^ n次,但通常会运行2 ^ n次的一小部分,所以我们将这个称为一个(2 ^ N)/ C2
  5. 这是所有这些循环中的简单if语句操作,所以c3.

将所有这些相乘得出:

c1 * k * 2^k * (n choose k) * (2^n)/c2 * c3
Run Code Online (Sandbox Code Playgroud)

因为我想要一个大O表示,忽略常量给出:

k * 2^k * (n choose k) * (2^n)
Run Code Online (Sandbox Code Playgroud)

众所周知,(n选择k)的上限为(n*e/k)^ k,因此:

O(k * 2^k …
Run Code Online (Sandbox Code Playgroud)

algorithm big-o combinatorics binomial-coefficients exponential

6
推荐指数
1
解决办法
1807
查看次数

寻找大 n 和 k 模 m 的二项式系数

我想用以下约束计算 nCk mod m:

n<=10^18

k<=10^5

m=10^9+7

我读过这篇文章:

计算大 n & k 的二项式系数 (nCk)

但是这里m的值为1009。因此使用卢卡斯定理,我们只需要计算aCb的1009*1009个不同值,其中a,b<=1009

如何在上述约束下做到这一点。我无法在给定的约束下制作 O(m*k) 空间复杂度的数组。

帮助!

c++ algorithm binomial-coefficients modulus modular-arithmetic

6
推荐指数
2
解决办法
6744
查看次数

在LISP中使用尾递归的二项式系数

我想编写一个函数来使用尾递归找到C(n,k),我将非常感谢你的帮助.

我达到了这个:

(defun tail-recursive-binomial (n k)
  (cond ((or (< n k) (< k 0)) NIL)
        ((or (= k 0) (= n k)) 1)
        (T (* (tail-recursive-binomial (- n 1) (- k 1)) (/ n k)))))
Run Code Online (Sandbox Code Playgroud)

使用二项式系数的以下属性.

但我不知道如何使递归调用成为每个实例执行的最后一条指令,因为最后一条指令是产品.我一直在尝试使用辅助功能,我认为这是唯一的方法,但我还没有找到解决方案.

lisp recursion tail-recursion binomial-coefficients

5
推荐指数
1
解决办法
2159
查看次数

当n非常大时,有效地计算nCr mod p

我需要nCr mod p有效地计算.现在,我已经编写了这段代码,但它超出了时间限制.请建议更优化的解决方案.

对于我的情况, p = 10^9 + 7 and 1 ? n ? 100000000

我还必须确保没有溢出,因为nCr mod p保证适合32位整数,但n!可能超出限制.

def nCr(n,k):
    r = min(n-k,k)
    k = max(n-k,k)
    res = 1
    mod = 10**9 + 7

    for i in range(k+1,n+1):
        res = res * i
        if res > mod:
            res = res % mod

    res = res % mod
    for i in range(1,r+1):
        res = res/i
    return res
Run Code Online (Sandbox Code Playgroud)

PS:我认为我的代码可能不完全正确.但是,它似乎适用于小的n正确.如果错了,请指出来!

python binomial-coefficients

5
推荐指数
1
解决办法
6982
查看次数

glm 切换交互的系数名称

我使用R代码:

dat<-data.frame(p1=c(0,1,1,0,0), GAMMA.1=c(1,2,3,4,3), VAR1=c(2,2,1,3,4), GAMMA.2=c(1,1,3,4,1))
form <- p1 ~ GAMMA.1:VAR1 + GAMMA.2:VAR1
mod <- glm(formula=form, data=dat, family=binomial)
(coef <- coefficients(mod))

# (Intercept) GAMMA.1:VAR1 VAR1:GAMMA.2 
#   1.7974974   -0.2563667   -0.2181079 
Run Code Online (Sandbox Code Playgroud)

coef正如我们所看到的,交互的名称的GAMMA.2:VAR1顺序与form(我们VAR1:GAMMA.2改为)的顺序不同。由于多种原因,我需要输出

# (Intercept) GAMMA.1:VAR1   GAMMA.2:VAR1
#   1.7974974   -0.2563667   -0.2181079 
Run Code Online (Sandbox Code Playgroud)

之后无需更改系数的名称。具体来说,我希望系数的名称与我在form对象中使用的名称相同(无需像上面的代码中那样进行切换)。我可以告诉glm()不要切换交互的名称吗?

interaction r formula binomial-coefficients glm

5
推荐指数
1
解决办法
802
查看次数

非常可靠地计算二项式coffeficient

在C++中计算二项式系数的最佳方法是什么?我已经看到了一些代码片段,但在我看来,它总是只在某个特定区域可行.我需要一个非常非常可靠的计算.我尝试使用gamma功能:

unsigned n=N;
unsigned k=2;
number = tgammal(n + 1) / (tgammal(k + 1) * tgammal(n - k + 1));
Run Code Online (Sandbox Code Playgroud)

但它在n = 8时已经不同,k = 2的1(并且n = 30,k = 2它崩溃).我"仅"需要计算大约至少n = 3000,其中k = 2.

c++ math binomial-coefficients gamma-function

5
推荐指数
1
解决办法
168
查看次数

计算 R 中的*整数*二项式系数

当nk为整数时,从n中选择k个对象的方式数,即二项式系数n!/(k!(nk)!)为整数。我怎样才能保证结果正确并且是整数类型?即使带有整数参数,该函数也会返回一个双精度值:choose

> typeof(choose(4L, 2L))  
[1] "double"  
Run Code Online (Sandbox Code Playgroud)

与手动计算一样,例如n -choose-2 = n(n-1)/2

typeof((4L * (4L - 1L)) / 2L)
[1] "double"  
Run Code Online (Sandbox Code Playgroud)

当然,我可以强制转换为整数,as.integer()但我对机器精度感到紧张:

> as.integer(3.999999999999999)
[1] 3
> as.integer(3.9999999999999999)
[1] 4
Run Code Online (Sandbox Code Playgroud)

round()(默认为digits=0)四舍五入到最接近的整数,但返回 double 类型的值。如果我可以确定提供以双精度格式存储的整数可以as.integer(round(...))保证四舍五入到正确的整数,而不会被机器精度绊倒,那么就是as.integer(round(choose(n, k)))可以接受的。是这样吗?或者是否有替代方法choose()可以为整数参数返回一个整数?

integer r binomial-coefficients

5
推荐指数
1
解决办法
4781
查看次数

如何计算大数的二项式系数

我需要n!/(n-r)!r!用C#来计算.对于小数字,使用阶乘函数很容易计算,但是当数字变得像100那样大时,它就不起作用了.有没有其他方法可以计算更大数字的组合?

c# math binomial-coefficients

4
推荐指数
2
解决办法
3140
查看次数

找到二项式协同有效模数,采访街道挑战

我已经做了很多工作,但无法找到更大的测试用例的答案

问题陈述

在数学中,二项式系数是正整数族,在二项式定理中作为系数出现.C(n,k)表示从n个不同对象中选择k个对象的方式的数量.

然而,当n和k太大时,我们经常在模数运算后用素数P保存它们.请计算在P模数后n的二项式系数变为0的数量.

输入

输入的第一个是整数T,即测试用例的数量.

以下T行中的每一行包含2个整数,n和素数P.

产量

对于每个测试用例,输出一行包含\ tbinom nks的数量(0 <= k <= n),其中每个模数运算后的P为0.

样本输入

3
2 2
3 2
4 3
Run Code Online (Sandbox Code Playgroud)

样本输出

1
0
1
Run Code Online (Sandbox Code Playgroud)

约束:

  • T小于100
  • n小于10 ^ 500.
  • P小于10 ^ 9.

有针对性的解决方案

我已经通过在二项式系数中使用余数定理完成了这个

         #C(n,m) mod p
         #n=l*p+t
         #m=m*p+s
         #then C(n,r) mod p=0 when (t<s or t=0)

         inp1 = raw_input()
         N=int(inp1)
         result=[]
         for i in range(N):
            inp = raw_input()
            a, b = [long(x) for x in inp.split(' ')]
           j=0
           #n=lp+t
           t=a%b
           t=t+1
           l=a/b
           j=l*(b-t)
           result.append(j)
        for i …
Run Code Online (Sandbox Code Playgroud)

python algorithm primes largenumber binomial-coefficients

4
推荐指数
2
解决办法
2948
查看次数

Confint()与glm {stats}非常非常慢

我在最新版本的R中从glm计算OR置信区间时遇到问题,但我之前没有遇到过这个问题.任何glm在哪里family="binomial",无论模型多么简单,它都可以轻松地提取摘要和exp(coef(模型)),但是当我尝试提取confint()或者exp(confint(model)),"等待分析完成时... msgstr"显示消息并且没有任何反应(我等了10分钟然后取消了程序,这通常只需要几秒钟就能在我的机器上完成).什么可能绊倒这个功能的想法?我试过它multiple datasets和变量,结果相同.任何想法为什么需要这么长时间/未能完成?

binomial-coefficients confidence-interval glm

4
推荐指数
1
解决办法
2511
查看次数