Fastest way to generate binomial coefficients

后端 未结 11 1756
[愿得一人]
[愿得一人] 2020-12-13 02:20

I need to calculate combinations for a number.

What is the fastest way to calculate nCp where n>>p?

I need a fast way to generate binomial coefficients for a

11条回答
  •  一向
    一向 (楼主)
    2020-12-13 03:05

    I was looking for the same thing and couldn't find it, so wrote one myself that seems optimal for any Binomial Coeffcient for which the endresult fits into a Long.

    // Calculate Binomial Coefficient 
    // Jeroen B.P. Vuurens
    public static long binomialCoefficient(int n, int k) {
        // take the lowest possible k to reduce computing using: n over k = n over (n-k)
        k = java.lang.Math.min( k, n - k );
    
        // holds the high number: fi. (1000 over 990) holds 991..1000
        long highnumber[] = new long[k];
        for (int i = 0; i < k; i++)
            highnumber[i] = n - i; // the high number first order is important
        // holds the dividers: fi. (1000 over 990) holds 2..10
        int dividers[] = new int[k - 1];
        for (int i = 0; i < k - 1; i++)
            dividers[i] = k - i;
    
        // for every dividers there is always exists a highnumber that can be divided by 
        // this, the number of highnumbers being a sequence that equals the number of 
        // dividers. Thus, the only trick needed is to divide in reverse order, so 
        // divide the highest divider first trying it on the highest highnumber first. 
        // That way you do not need to do any tricks with primes.
        for (int divider: dividers) {
           boolean eliminated = false;
           for (int i = 0; i < k; i++) {
              if (highnumber[i] % divider == 0) {
                 highnumber[i] /= divider;
                 eliminated = true;
                 break;
              }
           }
           if(!eliminated) throw new Error(n+","+k+" divider="+divider);
        }
    
    
        // multiply remainder of highnumbers
        long result = 1;
        for (long high : highnumber)
           result *= high;
        return result;
    }
    

提交回复
热议问题