【问题标题】:Combinations of n-th degree monomials in C++C++中n次单项式的组合
【发布时间】:2019-04-09 07:55:14
【问题描述】:

所以我必须生成一个单项式向量。以下是我对任意顺序最多 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 维空间的任何想法? 我没有看到一种简单的方法来实现上面的那个。我正在考虑使用组合数学并以某种方式消除额外的术语,但我不确定速度。

编辑(预期输出): 对于给定的输入 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

【问题讨论】:

  • 你能举一个小功率的输入和期望结果的例子吗?
  • @MBo 谢谢,添加到 OP 中的“琐碎”案例的预期输出。
  • 好的,我明白了。这是什么意思? :) 似乎是整数组合的组合生成,最大和 order 和长度 dim - 对吧?
  • 您的程序是否为order=2dim=3 输出不同的内容?如果我在脑海中运行,我会得到002, 011, 020, 101, 110, 200。正确的预期输出是什么?
  • @Mbo 你是对的。

标签: c++ math polynomial-math


【解决方案1】:

这是一个经典的递归函数:

每次您必须选择当前变量 x_1 的顺序(比如说 i),然后您仍然可以保留在 n -1 个变量上具有阶数 - i 的单项式的所有可能性。

(工作)代码如下:

   std::vector<std::vector<int>> getAllMonomials(int order, int dimension) {
    std::vector<std::vector<int>> to_return;
    if (1 == dimension) {
        for (int i = 0 ; i <= order; i++){
            to_return.push_back({i});
        }
        return to_return;
    }

    for (int i = 0 ; i <= order; i++) {
        std::vector<std::vector<int>> all_options_with_this_var_at_degree_i = getAllMonomials(order - i, dimension - 1);
        for (int j = 0; j < all_options_with_this_var_at_degree_i.size(); j++) {
            all_options_with_this_var_at_degree_i.at(j).insert(all_options_with_this_var_at_degree_i.at(j).begin(), i);
        }
        to_return.insert(to_return.end(), all_options_with_this_var_at_degree_i.begin(), all_options_with_this_var_at_degree_i.end());

    }
    return to_return;
}

【讨论】:

    【解决方案2】:

    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, "")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多