Как распространить математическое выражение, не оценивая его - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь создать линейную комбинацию из двух чисел, чтобы создать их GCD. Код, который я до сих пор могу найти расширенное решение. Я выполнил всю (сложную) математику для этого (то есть нашел GCD, используя алгоритм Евклида, затем по существу работал в обратном направлении), и это приведет к чему-то вроде этого (например, два начальных числа 1215 и 960):

((960-(3*(1215-(1*960))))-(3*((1215-(1*960))-(1*(960-(3*(1215-(1*960))))))))

В моем реальном решении между каждым компонентом есть пробел (например, '((960 - (3 *' ...)), но я пытаюсь упростить это в уравнение:

((-15*1215)+(19*960))

Мне кажется, что лучший подход - это создать дерево выражений, но я не знаю, как это сделать, просто не оценив ответ.

1 Ответ

2 голосов
/ 01 апреля 2020

Звучит так, будто вы ищете систему вычисления символов c. Вот один из подходов с использованием Maxima (https://maxima.sourceforge.net). Я включу stardisp, чтобы показать * между терминами продукта. Я также буду вводить числа типа 960 в качестве символов, чтобы подавить арифметику c на них, записав их как \960 et c. Обратите внимание, что 1 и 3 вводятся как обычные числа, поэтому для них выполняется арифметика c.

(%i13) stardisp:true;
(%o13)                        true
(%i14) 2*3;
(%o14)                          6
(%i15) \2*\3;
(%o15)                         2*3
(%i16) ((\960-(3*(\1215-(1*\960))))-(3*((\1215-(1*\960))-(1*(\960-(3*(\1215-(1*\960))))))));
(%o16) 960 - 3*(1215 - 960) - 3*((- 2*960) + 3*(1215 - 960)
                                                          + 1215)
(%i17) factor(%);
(%o17)                  19*960 - 15*1215

Возможно, вы захотите заменить числа на символы a, b , c, et c, чтобы получить более общее решение.

Существует много других систем вычисления символов, поиск по которым будет найден в Интернете. Удачи и веселья.

...