Максима. Как предотвратить вычисление градусов

Можно ли предотвратить все вычисления в выражении для чисел в степени? Возможно, предварительно обработав выражение или добавив правила tellimp? Или каким-то другим способом?

Например, чтобы

distrib (10 ^ 10 * (x + 1)); 

который производит:

1000000000 x + 1000000000

вместо этого выпущено:

10 ^ 10 * x + 10 ^ 10

И аналогично

factor (10 ^ 10 * x + 10 ^ 10);

вернулся:

10 ^ 10 * (x + 1);

Как только

factor(200);
2^3*5^2

представляет силу чисел, только постоянно?


person Ramzan Altair    schedule 25.06.2020    source источник


Ответы (1)


Интересный вопрос, хотя я не вижу хорошего решения. Вот что я попробовал в качестве эксперимента: отображать целые числа в факторизованной форме. Я работаю с Maxima 5.44.0 + SBCL.

(%i1) :lisp (defun integer-formatter (x) ($factor x))
INTEGER-FORMATTER
(%i1) :lisp (setf (get 'integer 'formatter) 'integer-formatter)
INTEGER-FORMATTER
(%i1) (x + 1000)^3;
                                       3  3 3
(%o1)                            (x + 2  5 )
(%i2) 10^10*(x + 1);
                                2 5  2 5
(%o2)                         (2    5   ) (x + 1)

Это только модификация дисплея; внутреннее представление - это просто одно целое число.

(%i3) :lisp $%
((MTIMES SIMP) 10000000000 ((MPLUS SIMP) 1 $X))

Это кажется неуклюжим, так как, например. 2^(2*5)*5^(2*5) на самом деле не более понятно, чем 10000000000.

Отдельный вопрос заключается в том, можно ли подавить арифметику 10^10, чтобы она фактически оставалась 10^10 и не представлялась внутренне как 10000000000. Я почти уверен, что это будет сложно. К сожалению, Maxima не слишком хороша с отводом используемых идентификаторов, особенно со встроенными идентификаторами, которые применяются для выполнения арифметических и других операций.

person Robert Dodier    schedule 26.06.2020