2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Вычислительная сложность сумм и разностей
Сообщение29.01.2025, 11:32 


23/02/23
143
Дано $a,b,c,d$, надо посчитать из них $x_1,x_2,x_3$ по формулам
$$x_1=a+b-c-d;$$ $$x_2=a-b-c+d;$$ $$x_3=a+b+c+d;$$
Я понимаю, как за семь операций их посчитать:
$$t_1=a-c;$$ $$t_2=b-d;$$ $$x_1=t_1+t_2;$$ $$x_2=t_1-t_2;$$ $$x_3=a+b+c+d;$$
Скажите, пожалуйста, можно ли доказать, что за шесть и меньше операций это уже нельзя сделать?

 Профиль  
                  
 
 Re: Вычислительная сложность сумм и разностей
Сообщение29.01.2025, 12:00 
Заслуженный участник


07/08/23
1291
Если никто более умных мыслей не предложит, можно просто перебрать все способы что-то посчитать за $6$ операций с помощью сложения, вычитания и унарного вычитания. Каждый способ — это ориентированный ациклический граф, где вершины без исходящих рёбер — это исходные переменные и $0$, а из каждой другой вершины исходит 2 ребра. Причём такая вершина помечена "$+$" или "$-$", во втором случае ещё указан порядок на исходящих рёбрах. Самим вершинам соответствуют арифметические выражения. Для $6$ операций таких графов не больше $\prod_{k = 5}^{10} \bigl(k + 3 \binom k 2\bigr) \leq 2 \cdot 10^{11}$ (слагаемое $k$ — это когда складываем число с собой).

Можно попробовать считать унарное вычитание бесплатным, тогда вершина 0 не нужна и можно считать, что вершинам соответствуют выражения с точностью до знака. На исходящих рёбрах из вершин с "$-$" порядок тоже не нужен, всего графов не больше $\prod_{k = 4}^9 k^2 \leq 4 \cdot 10^9$. Это уже совсем за разумное время перебирается.

 Профиль  
                  
 
 Re: Вычислительная сложность сумм и разностей
Сообщение29.01.2025, 12:27 


05/09/16
12238
zgemm
Спросил у парочки ИИ, оба предлагают 7 операций. Один из них в качестве одной из 7 операций предлагает удвоение, что для целых чисел просто сдвиг на один бит.

 Профиль  
                  
 
 Re: Вычислительная сложность сумм и разностей
Сообщение29.01.2025, 12:44 
Заслуженный участник
Аватара пользователя


16/07/14
9370
Цюрих
Можно не графы перебирать, а множества "что вообще можно посчитать за 6 действий", их чуть меньше.

 Профиль  
                  
 
 Re: Вычислительная сложность сумм и разностей
Сообщение29.01.2025, 13:09 


14/01/11
3119
wrest в сообщении #1671892 писал(а):
Спросил у парочки ИИ, оба предлагают 7 операций.

Нынешние ИИ довольно неважно проявляют себя в задачах подобного рода.

 Профиль  
                  
 
 Re: Вычислительная сложность сумм и разностей
Сообщение29.01.2025, 15:02 
Заслуженный участник


07/08/23
1291
Я всё перебрал, за 6 сложений и вычитаний (и сколько угодно унарных вычитаний) действительно не получается. Программа работает несколько минут и выводит в консоль количество перебранных вариантов, когда оно делится на миллион.
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
#include <stdlib.h>
int coefficients[10][4]; // coefficients in the linear combinations of variables
long long count = 0; // current number of variants
FILE* output;

void try(int position) {
        if (position == 10) {
                count++;
                if (count % 1000000 == 0) {
                        printf("%d'000'000\n", (int)(count / 1000000));
                        fflush(stdout);
                }
                int done[3]; // flags if the required sums appeared
                done[0] = done[1] = done[2] = 0;
                for (int i = 4; i < position; i++) {
                        if ((long long)coefficients[i][0] * (long long)coefficients[i][1] * (long long)coefficients[i][2] * (long long)coefficients[i][3] == 1) {
                                if (coefficients[i][0] == coefficients[i][1]) {
                                        if (coefficients[i][0] == coefficients[i][2])
                                                done[2] = 1;
                                        else
                                                done[0] = 1;
                                } else {
                                        if (coefficients[i][0] != coefficients[i][2])
                                                done[1] = 1;
                                }
                        }
                        if (done[0] && done[1] && done[2]) {
                                for (int i = 4; i < position; i++) {
                                        for (int j = 0; j < 4; j++) {
                                                fprintf(output, "%d", coefficients[i][j]);
                                                if (j < 3)
                                                        fprintf(output, ", ");
                                        }
                                        if (i < position - 1)
                                                fprintf(output, "\n");
                                }
                                fclose(output);
                                exit(0);
                        }
                }
        } else {
                for (int i = 0; i < position; i++)
                        for (int j = 0; j < i; j++) {
                                for (int k = 0; k < 4; k++)
                                        coefficients[position][k] = coefficients[i][k] - coefficients[j][k];
                                try(position + 1);
                        }
                for (int i = 0; i < position; i++)
                        for (int j = 0; j <= i; j++) {
                                for (int k = 0; k < 4; k++)
                                        coefficients[position][k] = coefficients[i][k] + coefficients[j][k];
                                try(position + 1);
                        }
        }
}

int main() {
        output = fopen("output.txt", "w");
        for (int i = 0; i < 4; i++)
                for (int j = 0; j < 4; j++)
                        coefficients[i][j] = (i == j) ? 1 : 0;
        try(4);
        fclose(output);
}

 

 Профиль  
                  
 
 Re: Вычислительная сложность сумм и разностей
Сообщение29.01.2025, 16:41 


23/02/23
143
Спасибо большое dgwuqtj!!!

Я тоже начал писать аналогичную программу, но Вы опередили. Огромное спасибо!!!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group