Комбинации мономов n-й степени в C++

Поэтому мне нужно сгенерировать вектор мономов. Вот как я сделал это для трех измерений в произвольном порядке:

#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 = 2 и dim = 3 ожидаемый результат (не обязательно в таком порядке):

000
001
002
010
011
020
100
101
110
200

для order = 1 и dim = 3:

000
001
010
100

и для order = 2 и dim = 2:

00
01
10
11
02
20

Не могли бы вы показать пример ввода и желаемого результата для небольшой мощности?

MBo 09.04.2019 10:24

@MBo Спасибо, ожидаемый результат для «тривиальных» случаев добавлен в OP.

skrat 09.04.2019 10:30

Да я вижу. И что это значит? :) Похоже на комбинаторную генерацию целочисленных композиций с максимальной суммой order и длиной dim - верно?

MBo 09.04.2019 10:32

Разве ваша программа не выводит что-то другое для order=2 и dim=3? Если я прогоню это в своей голове, я получу 002, 011, 020, 101, 110, 200. Каков правильный ожидаемый результат?

Tobi 09.04.2019 10:40

@Mbo Вы правы.

skrat 09.04.2019 10:45

@Tobi Как я уже сказал, порядок не имеет значения. См. комментарий MBo выше.

skrat 09.04.2019 10:46

Извините, моя вина

Tobi 09.04.2019 10:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
249
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это классическая рекурсивная функция:

Каждый раз вам нужно выбирать порядок текущей переменной x_1 (скажем, i), и тогда вы остаетесь со всеми возможностями для одночлена со степенью ord - i на n -1 переменных.

(Рабочий) код выглядит следующим образом:

   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;
}

Рекурсивное решение Python

идея

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

Другие вопросы по теме