如何在没有嵌套循环的情况下实现三项式扩展。

时间:2016-09-13 15:25:32

标签: c algorithm

我正在为程序简化编写程序。在这个程序中想要使用二项式和三项式定理。

使用二项式扩展:

(X + Y)^ R

Sum(k - > r)x ^ [r-k] y ^ [k]

其中k为0且r为二项式。

我可以这样做:

  for (k=0; k<=r; k++) {
      x_degree=r-k;
      y_degree=k;  
  } 

否则,如果我想实现三项式定理,我应该满足形式的约束:

(A + B + C)^ n的

总和(n选择i,j,k)a ^ i b ^ j c ^ k,

其中n是三项式,i + j + k = n。

我想了一段时间,但我无法找到比循环所有可能组合更好的东西,如下所示:

for (int i=0; i<=n; i++)
    for (int j=0; j<=n; j++)
        for (int k=0; k<=n; k++) {
            if((i+j+k)==n) {
                find_coefficient(i,j,k);
                set_degree_values(i,j,k);
                proceed();
            } 
        } 

所以我的问题是:如何在不绕过所有可能的度数组合的情况下实现三项式扩展?

谢谢。

2 个答案:

答案 0 :(得分:1)

以第四度为例,三个变量的幂可以列为

004, 013, 022, 031, 040, 
103, 112, 121, 130, 
202, 211, 220,
301, 310, 
400

逻辑是递减最右边的数字并将其增加到左边。当后者到达r时,你将一个增加到左边并重置右边的数字(这是一个修改后的进位操作)。

该方案可以通过n计数器实现,并推广到多项式定理。系数也可以递增计算,我不会感到惊讶。 (实际上,计数器将模拟嵌套循环。)

答案 1 :(得分:1)

您可以非常简单地删除一个循环,如下所示:

for (int i=0; i<=n; i++)
    for (int j=0; j<=n-i; j++) {   // Note change to upper limit
        int k = n - i - j;         // Calculate k rather than loop
        find_coefficient(i,j,k);
        set_degree_values(i,j,k);
        proceed(); 
        }