C ++中n次单项式的组合

时间:2019-04-09 07:55:15

标签: c++ math polynomial-math

所以我必须生成一个单项式向量。这是我针对任意顺序最多进行3维处理的方法:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int dim = 3; 
    int order = 2;
    std::vector<std::vector<int>> powers;

    for (int ord = 0; ord <= order; ord++) {
        if (dim == 1) {
            powers.push_back({ord});
        } else if (dim == 2) {
            for (int i = 0; i < ord + 1; i++) {
                powers.push_back({i, ord - i});
            }
        } else if (dim == 3) {
            for (int i = 0; i < ord + 1; i++) {
                for (int j = 0; j < ord + 1 - i; j++) {
                    powers.push_back({i, j, ord - i - j});
                }
            }
        } else if (dim == 4){
            for (int i = 0; i < ord + 1; i++) {
                for (int j = 0; j < ord + 1 - i; j++) {
                    for (int k = 0; k < ord + 1 - i - j; k++) {
                        powers.push_back({i, j, k, ord - i - j - k});
                    }
                }
            }
        } else {
            // "Monomials of dimension >= 4 not supported."
        }
    }
    cout << "Finished!" << endl;
    return 0;
}

现在,我的目标是支持N个维度和第N个单项式订单。关于如何将上面的代码扩展到N维空间的任何想法? 我没有一种简单的方法可以在上面实现。我当时在考虑使用组合运算法,并以某种方式消除多余的术语,但是我不确定速度。

EDIT(预期输出): 对于给定的输入order = 2dim = 3,预期的输出是(按此顺序不是必需的):

000
001
002
010
011
020
100
101
110
200

order = 1dim = 3

000
001
010
100

以及order = 2dim = 2

00
01
10
11
02
20

2 个答案:

答案 0 :(得分:2)

这是经典的递归函数:

每次您都必须选择当前变量x_1的顺序(让我说i),然后您才能保留阶数为ord的单项式的所有可能性-i在n -1变量上。

(有效的)代码如下:

In [96]: a = np.random.rand(5000,2)

In [97]: d = (a-a[:,None,:])

In [98]: %%timeit
    ...: valid_mask = ~np.eye(len(a),dtype=bool)
    ...: out = d[valid_mask]
1 loop, best of 3: 763 ms per loop

In [99]: %%timeit
    ...: r = np.arange(len(a))
    ...: valid_mask = r[:,None] != r
    ...: out = d[valid_mask]
1 loop, best of 3: 767 ms per loop

In [100]: %timeit nodiag_view3D(d).reshape(-1,a.shape[1])
10 loops, best of 3: 177 ms per loop

答案 1 :(得分:1)

Pyrhon递归解决方案

ideone

def compose(leng, summ, res):
    if leng == 0:
        print(res)
        return
    for i in range(summ + 1):
        compose(leng - 1, summ -i, res + str(i) + " ")

compose(3, 2, "")