Previous: Операторы отношения, Up: Операторы [Contents][Index]
Оператор некоммутативного возведение в степень.
^^ - оператор некоммутативного возведение в степень, соответствующий  некоммутативному умножению .,
ровно так же как обычный оператор возведение в степень ^ соответствует коммутативному умножению *.
Некоммутативное возведение в степень отображается как ^^ в 1D (одномерном) выводе,
и в виде показателя степени как верхний индекс в угловых скобка < > в 2D (двумерном) выводе.
Примеры:
(%i1) a . a . b . b . b + a * a * a * b * b;
                        3  2    <2>    <3>
(%o1)                  a  b  + a    . b
(%i2) string (a . a . b . b . b + a * a * a * b * b);
(%o2)                  a^3*b^2+a^^2 . b^^3
Оператор факториала.
Для всех комплексных чисел x (включая целые, рациональные, и вещественные числа), 
за исключением отрицательных целых, x! задается как gamma(x+1).
Для целого x, x! упрощается до произведения целых чисел от
 1 до x включительно.
0! упрощается до 1.
Для чисел с плавающей точкой x, x! упрощается  до значения gamma (x+1).
Для x равных n/2, где n - нечетное целое,
x! упрощается до рационального множителя, умноженного на sqrt (%pi)
(т. к. gamma (1/2) равно sqrt (%pi)).
Если x - что то еще, то x! не упрощается.
Переменные factlim, minfactorial и factcomb управляют упрощением выражений,
содержащих факториалы.
Функции gamma, bffac и cbffac
являются разновидностями гамма функции.
makegamma заменяет gamma для факториалов и связанных функций.
См. также binomial.
Факториал целого, полуцелого или аргумента с плавающей точкой, упрощается
если операнд не больше чем factlim.
(%i1) factlim : 10;
(%o1)                          10
(%i2) [0!, (7/2)!, 4.77!, 8!, 20!];
            105 sqrt(%pi)
(%o2)   [1, -------------, 81.44668037931199, 40320, 20!]
                 16
Факториал комплексного числа, известной константы, или выражение общего вида не упрощается. Но в этом случае возможно упростить факториал после вычисления операнда.
(%i1) [(%i + 1)!, %pi!, %e!, (cos(1) + sin(1))!];
(%o1)      [(%i + 1)!, %pi!, %e!, (sin(1) + cos(1))!]
(%i2) ev (%, numer, %enumer);
(%o2) [(%i + 1)!, 7.188082728976037, 4.260820476357, 
                                               1.227580202486819]
Факториал символа, не имеющего значения, не упрощается.
(%i1) kill (foo); (%o1) done (%i2) foo!; (%o2) foo!
Факториалы упрощаются, а не вычисляются.
Таким образом, x! можно заменять даже в экранированном (quoted) выражении.
(%i1) '([0!, (7/2)!, 4.77!, 8!, 20!]);
          105 sqrt(%pi)
(%o1) [1, -------------, 81.44668037931199, 40320, 
               16
                                             2432902008176640000]
Оператор двойного факториала.
Для целого, числа с плавающей точкой или рационального числа n,
n!! вычисляется как произведение n (n-2) (n-4) (n-6) ... (n - 2 (k-1))
где k равно entier (n/2),
то есть, наибольшее целое меньше или равное n/2.
Заметим, что это определение не совпадает с другими опубликованными определениями
для нецелых аргументов.
Для четного (или нечетного) целого n, n!! вычисляется как произведение 
всех последовательных четных (или нечетных) целых от 2 (или 1) до n включительно.
Для аргумента n, который не является целым, числом с плавающей точкой, или рациональным числом,
n!! дает невычисляемую форму genfact (n, n/2, 2).
Обозначает отрицание синтаксического равенства =.
Заметим, что из-за правил для вычисления предикатных выражений
(в частности из-за того, что not expr вызывает вычисление  expr),
not a = b эквивалентно is(a # b),
вместо a # b.
Примеры:
(%i1) a = b; (%o1) a = b (%i2) is (a = b); (%o2) false (%i3) a # b; (%o3) a # b (%i4) not a = b; (%o4) true (%i5) is (a # b); (%o5) true (%i6) is (not a = b); (%o6) true
Оператор "точка" предназначен для матричного (некоммутативного) умножения.
Когда "." используется таким образом, пробелы должны присутствовать с обеих сторон, 
то есть A . B.  Это позволяет различать оператор от десятичной точки в числе с плавающей точкой.
См. также
dot,
dot0nscsimp,
dot0simp,
dot1simp,
dotassoc,
dotconstrules,
dotdistrib,
dotexptsimp,
dotident,
и
dotscrules.
Оператор присваивания.
Если левая сторона есть простая переменная (не переменная с индексом),
то : вычисляет правую сторону присваивания 
и присваивает значение с левой частью.
Если левая строна есть индексированный элемент списка, матрица, объявленного Maxima массива или Lisp массива, то значение правой части присваивается этому элементу. Индекс должен выделять существующий элемент. Подобные конструкции нельзя расширить на несуществующие элементы.
Если левая сторона есть индексированный элемент необъявленного массива, то значение правой части присваивается этому элементу, если таковой уже существует, или вновь созданному объекту, если он еще не существует.
Если левая строна присваивания есть список простых переменных и/или переменных с индексом, то правая часть должна вычисляться в список, и элементы этого списка присваиваются элементам левой части параллельно.
См. также kill и remvalue,
которые отменяют присваивание.
Примеры:
Присваивание простой переменной.
(%i1) a; (%o1) a (%i2) a : 123; (%o2) 123 (%i3) a; (%o3) 123
Присваивание элементу списка.
(%i1) b : [1, 2, 3]; (%o1) [1, 2, 3] (%i2) b[3] : 456; (%o2) 456 (%i3) b; (%o3) [1, 2, 456]
Присваивание создает необъявленный массив.
(%i1) c[99] : 789; (%o1) 789 (%i2) c[99]; (%o2) 789 (%i3) c; (%o3) c (%i4) arrayinfo (c); (%o4) [hashed, 1, [99]] (%i5) listarray (c); (%o5) [789]
Множественные присваивания.
(%i1) [a, b, c] : [45, 67, 89]; (%o1) [45, 67, 89] (%i2) a; (%o2) 45 (%i3) b; (%o3) 67 (%i4) c; (%o4) 89
Множественные присваивания выполняются параллельно.
В этом примере переменные a и b обмениваются значениями.
(%i1) [a, b] : [33, 55]; (%o1) [33, 55] (%i2) [a, b] : [b, a]; (%o2) [55, 33] (%i3) a; (%o3) 55 (%i4) b; (%o4) 33
Оператор присваивания.
Оператор :: аналогичен оператору присваивания : 
за исключением того, что :: вычисляет свою левую часть наряду с вычислением правой части.
Примеры:
(%i1) x : 'foo; (%o1) foo (%i2) x :: 123; (%o2) 123 (%i3) foo; (%o3) 123 (%i4) x : '[a, b, c]; (%o4) [a, b, c] (%i5) x :: [11, 22, 33]; (%o5) [11, 22, 33] (%i6) a; (%o6) 11 (%i7) b; (%o7) 22 (%i8) c; (%o8) 33
Оператор определения макро функции.
::= задает функцию (называемую "макрос" по историческим причинам)
которое экранирует (quote) свои аргументы,
и выражение, которое она возвращает (называемое "макро расширение"),
вычисляется в том контексте, из которого этот макрос был вызван.
В других отношениях макро функция такая же как и обыкновенная функция.
Функция macroexpand возвращает макро расширение (без ее вычисления).
macroexpand (foo (x)) следующее за ''% эквивалентно foo (x),
где foo есть макро функция.
Оператор ::= помещает имя новой макро функции в глобальный список macros.
Функции kill, remove и remfunction удаляет определения макро функций 
и удаляет имена из macros.
Функции fundef или dispfun, соответственно, 
возвращает определение макро функции или присваивает его метке.
Макро функции обычно содержат buildq и splice
выражения для конструирования выражения,
которое затем вычисляется.
Примеры.
Макро функция экранирует свои аргументы,
так что сообщение (1) показывает выражение y - z, а не значение y - z.
Макро расширение (экранированное выражение '(print ("(2) x  равно ", x))
вычисляется в том контексте, из которого этот макрос был вызван,
печатая сообщение (2).
(%i1) x: %pi;
(%o1)                          %pi
(%i2) y: 1234;
(%o2)                         1234
(%i3) z: 1729 * w;
(%o3)                        1729 w
(%i4) printq1 (x) ::= block (print ("(1) x is equal to", x),
      '(print ("(2) x is equal to", x)));
(%o4) printq1(x) ::= block(print("(1) x is equal to", x), 
                                '(print("(2) x is equal to", x)))
(%i5) printq1 (y - z);
(1) x is equal to y - z 
(2) x is equal to %pi 
(%o5)                          %pi
Обыкновенная функция вычисляет свои аргументы, так что сообщение (1) показывает значение y - z.
Возвращаемое значение не вычисляется, так что сообщение (2) не печатается
до момента явного вычисления ''%.
(%i1) x: %pi;
(%o1)                          %pi
(%i2) y: 1234;
(%o2)                         1234
(%i3) z: 1729 * w;
(%o3)                        1729 w
(%i4) printe1 (x) := block (print ("(1) x is equal to", x),
      '(print ("(2) x is equal to", x)));
(%o4) printe1(x) := block(print("(1) x is equal to", x), 
                                '(print("(2) x is equal to", x)))
(%i5) printe1 (y - z);
(1) x is equal to 1234 - 1729 w 
(%o5)              print((2) x is equal to, x)
(%i6) ''%;
(2) x is equal to %pi 
(%o6)                          %pi
Функция macroexpand возвращает макро расширение.
Выражение macroexpand (foo (x)), идущее перед ''% эквивалентно foo (x),
когда foo есть макро функция.
(%i1) x: %pi;
(%o1)                          %pi
(%i2) y: 1234;
(%o2)                         1234
(%i3) z: 1729 * w;
(%o3)                        1729 w
(%i4) g (x) ::= buildq ([x], print ("x is equal to", x));
(%o4)    g(x) ::= buildq([x], print("x is equal to", x))
(%i5) macroexpand (g (y - z));
(%o5)              print(x is equal to, y - z)
(%i6) ''%;
x is equal to 1234 - 1729 w 
(%o6)                     1234 - 1729 w
(%i7) g (y - z);
x is equal to 1234 - 1729 w 
(%o7)                     1234 - 1729 w
Оператор определения функции.
f(x_1, ..., x_n) := expr
определяет функцию с именем f, аргументами x_1, ..., x_n и телом функции expr.
Оператор := никогда не вычисляет тело функции (если только вычисление не задано явно оператором
кавычка-кавычка '').
Функция заданная таким образом может быть обыкновенной Maxima функцией (с аргументами, заключенными в скобки)
или функцией массивом (с аргументами, заключенными в квадратные скобки).
Когда последний или единственный аргумент функции x_n есть список из одного элемента,
функция, заданная := принимает переменное число аргументов.
Фактические аргументы присваиваются один-в-один формальным аргументам x_1, ..., x_(n - 1),
и любые дальнейшие фактические аргументы, если присутствуют, присваиваются к x_n как список.
Все определения функций появляются в том же пространстве имен;
задав функцию f внутри другой функции g, определение
не ограничивает зону видимости f в g.
Если некоторый формальный аргумент x_k есть экранированный (quoted) символ,
функция, заданная с помощью :=, не вычисляет соответствующий фактический аргумент.
В противном случае, все фактические аргументы вычисляются.
См. также define и ::=.
Примеры:
:= никогда не вычисляет тело функции (если только явно не задано вычисление).
(%i1) expr : cos(y) - sin(x); (%o1) cos(y) - sin(x) (%i2) F1 (x, y) := expr; (%o2) F1(x, y) := expr (%i3) F1 (a, b); (%o3) cos(y) - sin(x) (%i4) F2 (x, y) := ''expr; (%o4) F2(x, y) := cos(y) - sin(x) (%i5) F2 (a, b); (%o5) cos(b) - sin(a)
Функция, заданная :=, может быть обыкновенной Maxima функцией или функцией массивом.
(%i1) G1 (x, y) := x.y - y.x;
(%o1)               G1(x, y) := x . y - y . x
(%i2) G2 [x, y] := x.y - y.x;
(%o2)                G2     := x . y - y . x
                       x, y
Когда последний или единственный аргумент функции x_n есть список из одного элемента,
функция, заданная :=, принимает переменное число аргументов.
(%i1) H ([L]) := apply ("+", L);
(%o1)                H([L]) := apply("+", L)
(%i2) H (a, b, c);
(%o2)                       c + b + a
Оператор равенства.
Выражение a = b, само по себе, представляет собой
невычисляемое уравнение, которое может или может не выполняться.
Невычисляемые уравнения могут появляться как аргументы в solve и algsys,
или в некоторых других функциях.
Функция is вычисляет = до логического значения.
is(a = b) вычисляет a = b в true, когда a и b
тождественны. То есть, a и b есть атомы, которые идентичны,
или они не атомы и их операторы идентичны и их аргументы идентичны.
В противном случае, is(a = b) вычисляется в false;
он никогда не вычисляется в unknown.
Когда is(a = b) есть true, говорят что a и b синтаксически равны,
в противоположность эквивалентным выражениям, для которых is(equal(a, b)) есть true.
Выражения могут быть равны, но синтаксически не равны.
Отрицание = представляется как #.
Как и в случае с =, выражение a # b, само по себе, не вычисляется.
is(a # b) вычисляется a # b до
true или false.
Кроме is,
некоторые другие операторы вычисляют = и # до true или false,
а именно if, and, or и not.
Заметим, что из-за правил для вычисления предикатных выражений
(в частности из-за того, что not expr вызывает вычисление expr),
not a = b эквивалентно is(a # b),
а не a # b.
rhs и lhs возвращают правую и левую часть
уравнения или неравенства соответственно.
См. также equal или notequal.
Примеры:
Выражение a = b, само по себе, представляет
невычисляемое уравнение, которое может или может не выполняться.
(%i1) eq_1 : a * x - 5 * y = 17;
(%o1)                    a x - 5 y = 17
(%i2) eq_2 : b * x + 3 * y = 29;
(%o2)                    3 y + b x = 29
(%i3) solve ([eq_1, eq_2], [x, y]);
                        196         29 a - 17 b
(%o3)          [[x = ---------, y = -----------]]
                     5 b + 3 a       5 b + 3 a
(%i4) subst (%, [eq_1, eq_2]);
         196 a     5 (29 a - 17 b)
(%o4) [--------- - --------------- = 17, 
       5 b + 3 a      5 b + 3 a
                                  196 b     3 (29 a - 17 b)
                                --------- + --------------- = 29]
                                5 b + 3 a      5 b + 3 a
(%i5) ratsimp (%);
(%o5)                  [17 = 17, 29 = 29]
is(a = b) вычисляет a = b в true, 
когда a и b тождественны (синтаксически равны).
Выражения могут быть равны, но синтаксически не равны.
(%i1) a : (x + 1) * (x - 1);
(%o1)                    (x - 1) (x + 1)
(%i2) b : x^2 - 1;
                              2
(%o2)                        x  - 1
(%i3) [is (a = b), is (a # b)];
(%o3)                     [false, true]
(%i4) [is (equal (a, b)), is (notequal (a, b))];
(%o4)                     [true, false]
Некоторые операторы вычисляют = и # до true или false.
(%i1) if expand ((x + y)^2) = x^2 + 2 * x * y + y^2 then FOO else
      BAR;
(%o1)                          FOO
(%i2) eq_3 : 2 * x = 3 * x;
(%o2)                       2 x = 3 x
(%i3) eq_4 : exp (2) = %e^2;
                              2     2
(%o3)                       %e  = %e
(%i4) [eq_3 and eq_4, eq_3 or eq_4, not eq_3];
(%o4)                  [false, true, true]
Из-за того, что not expr вызывает вычисление expr,
not a = b эквивалентно is(a # b).
(%i1) [2 * x # 3 * x, not (2 * x = 3 * x)]; (%o1) [2 x # 3 x, true] (%i2) is (2 * x # 3 * x); (%o2) true
Оператор логического умножения.
Оператор and есть n-арный инфиксный оператор.
Его операнды есть логические выражения и его результат есть логическое значение.
Оператор and вызывает вычисление (как и is) одного или более операндов,
и может вызвать вычисление всех операндов.
Операнды вычисляются в том же порядка, к котором они встречаются.
Оператор and вычисляет только столько своих операндов, сколько необходимо для того, 
чтобы определить результат.
Если хотя бы один операнд есть false,
результат есть false, и более ни один из операндов не вычисляется.
Глобальный флаг prederror управляет поведением and,
когда вычисляемый операнд не может быть определен как true или false.
Оператор and печатает сообщение об ошибке, когда prederror есть true.
Иначе, операнды, которые не могут быть вычислены как true или false, принимаются,
и результат есть логическое выражение.
Оператор and не является коммутативным:
a and b может быть не равно b and a из-за трактовки неопределенных операндов.
Оператор логического сложения.
or есть n-арный инфиксный оператор.
Его операнды есть логические выражения и его результат есть логическое значение.
or вызывает вычисление (как и is) одного или более операндов,
и может вызвать вычисление всех операндов.
Операнды вычисляются в том же порядка, к котором они встречаются.
or вычисляет только столько своих операндов, сколько необходимо для того, чтобы определить результат.
Если хотя бы один операнд есть true,
результат есть true, и более ни один из операндов не вычисляется.
Глобальный флаг prederror управляет поведением or,
когда вычисляемый операнд не может быть определен как true или false.
Оператор or печатает сообщение об ошибке, когда prederror есть true.
Иначе, операнды, которые не могут быть вычислены как true или false, принимаются,
и результат есть логическое выражение.
Оператор or не является коммутативным:
a or b может быть не равно b or a из-за трактовки неопределенных операндов.
Оператор логического отрицания.
Оператор not есть префиксный оператор.
Его операнд есть логическое выражение и его результат есть логическое значение.
Оператор not вызывает вычисление (как и is) своего операнда.
Глобальный флаг prederror управляет поведением not,
когда его операнд не может быть определен как значения true или false.
Оператор not печатает сообщение об ошибке, когда prederror есть true.
Иначе, операнды, которые не могут быть вычислены как true или false, принимаются,
и результат есть логическое выражение.
Возвращает абсолютное значение expr (модуль выражения). Если expr - комплексное, возвращается комплексный модуль expr.
Если declare(f,additive) было выполнено, то:
(1) Если f одномерно, пока упрощение не столкнулось с f примененному к сумме, 
f будет распространено вдоль этой суммы.  То есть, f(y+x) будет
упрощено как f(y)+f(x).
(2) Если f есть функция двух или более аргументов, аддитивность задается как 
аддитивность по первому аргументу f, как в случае sum или 
integrate, то есть f(h(x)+g(x),x) будет упрощено как f(h(x),x)+f(g(x),x).
Это упрощение не произойдет, когда f применена к выражению вида sum(x[i],i,lower-limit,upper-limit).
Работает с командами part (например, part, inpart, substpart,
substinpart, dpart и lpart).  Например:
(%i1) expr : e + d + c + b + a; (%o1) e + d + c + b + a (%i2) part (expr, [2, 5]); (%o2) d + a
хотя
(%i1) expr : e + d + c + b + a; (%o1) e + d + c + b + a (%i2) part (expr, allbut (2, 5)); (%o2) e + c + b
allbut также распознается kill.
(%i1) [aa : 11, bb : 22, cc : 33, dd : 44, ee : 55]; (%o1) [11, 22, 33, 44, 55] (%i2) kill (allbut (cc, dd)); (%o0) done (%i1) [aa, bb, cc, dd]; (%o1) [aa, bb, 33, 44]
kill(allbut(a_1, a_2, ...)) имеет тот же эффект, что  kill(all)
за исключением того, что это не очищает символы a_1, a_2, ... .
Если declare(h,antisymmetric) выполнена, этот говорит 
упрощателю, что h - антисимметричная.  Например, h(x,z,y)  упростится до
- h(x, y, z).  То есть, это дает (-1)^n умноженное на symmetric 
или commutative результат, где n есть число перестановок двух
аргументов необходимых для того, чтобы перевести к конечной форме.
Возвращает комплексное абсолютное значение (комплексный модуль) expr.
Когда x есть вещественное число - возвращает наименьшее целое, которое больше чем или равно x.
Если x - константное выражение (10 * %pi, например), 
ceiling вычисляет x используя большие числа с плавающей точкой и 
применяет ceiling к конечному большому числу с плавающей точкой. 
Из-за того, что ceiling использует вычисления
с числами с плавающей точкой, возможно, хотя маловероятно, 
что ceiling может вернуть ошибочное значение для константных
входных данных. Чтобы защититься от ошибок, вычисление с числами с плавающей точкой
выполняется с использованием трех значений для fpprec.
Для неконстантных входных данных, ceiling пытается вернуть упрощенное
значение. Вот примеры упрощений, о которых ceiling
знает:
(%i1) ceiling (ceiling (x)); (%o1) ceiling(x) (%i2) ceiling (floor (x)); (%o2) floor(x) (%i3) declare (n, integer)$ (%i4) [ceiling (n), ceiling (abs (n)), ceiling (max (n, 6))]; (%o4) [n, abs(n), max(n, 6)] (%i5) assume (x > 0, x < 1)$ (%i6) ceiling (x); (%o6) 1 (%i7) tex (ceiling (a)); $$\left \lceil a \right \rceil$$ (%o7) false
Функция ceiling автоматически не распространяется (map) для списков или матриц.
Наконец, для всех входных данных, которые объявлены комплексными, 
ceiling возвращает невычисляемую форму.
Если диапазон функции есть подмножество целых, она может быть
объявлена как integervalued. Обе функции ceiling и floor 
могут использовать эту информацию. Например:
(%i1) declare (f, integervalued)$ (%i2) floor (f(x)); (%o2) f(x) (%i3) ceiling (f(x) - 1); (%o3) f(x) - 1
Возвращает 0, когда предикат p вычисляется как false; возвращает
1, когда предикат вычисляется как true.  Когда предикат
вычисляется до чего-то другого, чем true или false (unknown), 
возвращает невычисляемую форму.
Примеры:
(%i1) charfun (x < 1);
(%o1)                    charfun(x < 1)
(%i2) subst (x = -1, %);
(%o2)                           1
(%i3) e : charfun ('"and" (-1 < x, x < 1))$
(%i4) [subst (x = -1, e), subst (x = 0, e), subst (x = 1, e)];
(%o4)                       [0, 1, 0]
Если declare(h,commutative) выполнено, это говорит 
упрощателю, что h есть коммутативная функция.  То есть h(x,z,y) 
упроститься до h(x, y, z).  Это тоже самое, что и symmetric.
Возвращает оператор отношения op
(<, <=, >, >=, = или #) так что
is (x op y) вычисляется до true;
когда x или y зависит от %i и
x # y, возвращает notcomparable;
когда нет такого оператора или
Maxima не может определить оператор, возвращает unknown.
Примеры:
(%i1) compare (1, 2); (%o1) < (%i2) compare (1, x); (%o2) unknown (%i3) compare (%i, %i); (%o3) = (%i4) compare (%i, %i + 1); (%o4) notcomparable (%i5) compare (1/x, 0); (%o5) # (%i6) compare (x, abs(x)); (%o6) <=
Функция compare не пытается определить, действительно ли области определения ее аргументов непусты. 
Таким образом
(%i1) compare (acos (x^2 + 1), acos (x^2 + 1) + 1); (%o1) <
Действительная область определения acos (x^2 + 1) пуста.
Возвращает наибольшее целое меньше или равное чем x, где x - численное.  
Функция fix (как и в fixnum) есть синоним, 
так что fix(x) в точности тоже самое.
Представляет эквивалентность, то есть, равное значение.
Само по себе, equal не вычисляется или упрощается.
Функция is пытается вычислить equal до логического значения.
Функция is(equal(a, b)) 
возвращает true (или false), если
и только если, a и b равны (или не равны) для всех возможных
значений своих переменных, как определено вычислением ratsimp(a - b).
Если ratsimp возвращает 0, два выражения рассматриваются эквивалентными.
Два выражения могут быть эквивалентными даже если они не являются синтаксически равными (то есть, идентичными).
Когда is не может упростить equal до true или false,
результат управляется глобальным флагом prederror.
Когда prederror есть true,
is выдает сообщение об ошибке.
Иначе, is возвращает unknown.
В добавление к is,
некоторые другие операторы вычисляют equal и notequal до true или false,
а именно if, and, or и not.
Отрицанием equal является notequal.
Примеры:
Само по себе, equal не вычисляет и не упрощает.
(%i1) equal (x^2 - 1, (x + 1) * (x - 1));
                        2
(%o1)            equal(x  - 1, (x - 1) (x + 1))
(%i2) equal (x, x + 1);
(%o2)                    equal(x, x + 1)
(%i3) equal (x, y);
(%o3)                      equal(x, y)
Функция is пытается вычислить equal до логического значения.
is(equal(a, b)) возвращает true когда ratsimp(a - b) возвращает 0.
Два выражения могут быть эквивалентными даже если они синтаксически не равны (то есть, не идентичны).
(%i1) ratsimp (x^2 - 1 - (x + 1) * (x - 1)); (%o1) 0 (%i2) is (equal (x^2 - 1, (x + 1) * (x - 1))); (%o2) true (%i3) is (x^2 - 1 = (x + 1) * (x - 1)); (%o3) false (%i4) ratsimp (x - (x + 1)); (%o4) - 1 (%i5) is (equal (x, x + 1)); (%o5) false (%i6) is (x = x + 1); (%o6) false (%i7) ratsimp (x - y); (%o7) x - y (%i8) is (equal (x, y)); (%o8) unknown (%i9) is (x = y); (%o9) false
Когда is не может упростить equal до true или false,
результат управляется глобальным флагом prederror.
(%i1) [aa : x^2 + 2*x + 1, bb : x^2 - 2*x - 1];
                    2             2
(%o1)             [x  + 2 x + 1, x  - 2 x - 1]
(%i2) ratsimp (aa - bb);
(%o2)                        4 x + 2
(%i3) prederror : true;
(%o3)                         true
(%i4) is (equal (aa, bb));
Maxima was unable to evaluate the predicate:
       2             2
equal(x  + 2 x + 1, x  - 2 x - 1)
 -- an error.  Quitting.  To debug this try debugmode(true);
(%i5) prederror : false;
(%o5)                         false
(%i6) is (equal (aa, bb));
(%o6)                        unknown
Некоторые операторы вычисляют equal или notequal до true или false.
(%i1) if equal (y, y - 1) then FOO else BAR;
(%o1)                          BAR
(%i2) eq_1 : equal (x, x + 1);
(%o2)                    equal(x, x + 1)
(%i3) eq_2 : equal (y^2 + 2*y + 1, (y + 1)^2);
                         2                   2
(%o3)             equal(y  + 2 y + 1, (y + 1) )
(%i4) [eq_1 and eq_2, eq_1 or eq_2, not eq_1];
(%o4)                  [false, true, true]
Из-за того, что not expr вызывает вычисление expr,
not equal(a, b) эквивалентно is(notequal(a, b)).
(%i1) [notequal (2*z, 2*z - 1), not equal (2*z, 2*z - 1)]; (%o1) [notequal(2 z, 2 z - 1), true] (%i2) is (notequal (2*z, 2*z - 1)); (%o2) true
Когда x есть вещественное число - возвращает наибольшее целое, которое меньше или равно x.
Если x есть константное выражение (10 * %pi, например), 
floor вычисляет x используя большие числа с плавающей точкой и 
применяет floor к результирующему значению. 
Из-за того, что floor использует вычисления с числами с плавающей точкой, возможно, хотя маловероятно, 
что floor может вернуть ошибочное значение для константных 
входных данных. Чтобы застраховаться от ошибок, вычисление с числами с плавающей точкой выполняется, 
используя три значения для fpprec.
Для неконстантных входных данных, floor пытается вернуть упрощенное
значение.  Вот примеры упрощений, о которых floor
знает:
(%i1) floor (ceiling (x)); (%o1) ceiling(x) (%i2) floor (floor (x)); (%o2) floor(x) (%i3) declare (n, integer)$ (%i4) [floor (n), floor (abs (n)), floor (min (n, 6))]; (%o4) [n, abs(n), min(n, 6)] (%i5) assume (x > 0, x < 1)$ (%i6) floor (x); (%o6) 0 (%i7) tex (floor (a)); $$\left \lfloor a \right \rfloor$$ (%o7) false
Функция floor автоматически не распространяется (map) для списков или матриц.
Наконец, для всех входных данных, которые заданы как комплексные, floor возвращает невычисляемую форму.
Если диапазон функции есть подмножество целых, она может быть
объявлена как integervalued. Обе функции ceiling и floor 
могут использовать эту информацию. Например:
(%i1) declare (f, integervalued)$ (%i2) floor (f(x)); (%o2) f(x) (%i3) ceiling (f(x) - 1); (%o3) f(x) - 1
Представляет собой отрицание equal(a, b).
Примеры:
(%i1) equal (a, b); (%o1) equal(a, b) (%i2) maybe (equal (a, b)); (%o2) unknown (%i3) notequal (a, b); (%o3) notequal(a, b) (%i4) not equal (a, b); (%o4) notequal(a, b) (%i5) maybe (notequal (a, b)); (%o5) unknown (%i6) assume (a > b); (%o6) [a > b] (%i7) equal (a, b); (%o7) equal(a, b) (%i8) maybe (equal (a, b)); (%o8) false (%i9) notequal (a, b); (%o9) notequal(a, b) (%i10) maybe (notequal (a, b)); (%o10) true
Как аргумент в вызове к ev (expr),
eval вызывает дополнительное вычисление expr.
См. ev.
Возвращает true если expr есть четное целое.
false возвращается во всех других случаях.
Синоним для entier (x).
Аналогично map, но fullmap продолжает процедуру распространения 
для всех подвыражений до тех пор, пока основные операторы более не остаются теми же самыми.
Функция fullmap используется Maxima
упрощателем для некоторых матричных манипуляций. Таким образом, Maxima иногда генерирует
сообщение об ошибке, касающееся fullmap хотя fullmap явно не вызывалась пользователем.
Примеры:
(%i1) a + b * c; (%o1) b c + a (%i2) fullmap (g, %); (%o2) g(b) g(c) + g(a) (%i3) map (g, %th(2)); (%o3) g(b c) + g(a)
Аналогично fullmap, но fullmapl только распространяется на
списки и матрицы.
Пример:
(%i1) fullmapl ("+", [3, [4, 5]], [[a, 1], [0, -1.5]]);
(%o1)                [[a + 3, 4], [4, 3.5]]
Пытается определить, является ли предикат expr 
доказуемым из фактов в базе данных assume.
Если этот предикат является доказуемым как true или false,
is возвращает true или false, соответственно.
Иначе, возвращаемое значение управляется глобальным флагом prederror.
Когда prederror есть true,
is выдает сообщение об ошибке.
Иначе, is возвращает unknown.
Выражение ev(expr, pred)
(который можно переписать как expr, pred в интерактивной строке)
эквивалентно is(expr).
См. также assume, facts и maybe.
Примеры:
is вызывает вычисление предикатов.
(%i1) %pi > %e; (%o1) %pi > %e (%i2) is (%pi > %e); (%o2) true
is пытается вывести предикаты из базы данных assume.
(%i1) assume (a > b); (%o1) [a > b] (%i2) assume (b > c); (%o2) [b > c] (%i3) is (a < b); (%o3) false (%i4) is (a > c); (%o4) true (%i5) is (equal (a, c)); (%o5) false
Если is не может доказать или опровергнуть предикат из базы данных assume,
глобальный флаг prederror управляет поведением is.
(%i1) assume (a > b); (%o1) [a > b] (%i2) prederror: true$ (%i3) is (a > 0); Maxima was unable to evaluate the predicate: a > 0 -- an error. Quitting. To debug this try debugmode(true); (%i4) prederror: false$ (%i5) is (a > 0); (%o5) unknown
Пытается определить, является ли предикат expr 
 доказуемым исходя из фактов в базе данных assume.
Если этот предикат доказуем как true или false,
maybe возвращает true или false, соответственно.
Иначе, maybe возвращает unknown.
maybe функционально эквивалентен is с prederror: false,
но результат вычислен без реального присвоение значения prederror.
См. также assume, facts и is.
Примеры:
(%i1) maybe (x > 0); (%o1) unknown (%i2) assume (x > 1); (%o2) [x > 1] (%i3) maybe (x > 0); (%o3) true
Возвращает "целый квадратный корень" абсолютного значения x, которое есть целое.
Когда L есть список или множество, возвращает apply ('max, args (L)).  Когда L не является 
списком или множеством, выдает ошибку.
Когда L есть список или множество, возвращает apply ('min, args (L)). Когда L не является 
списком или множеством, выдает ошибку.
Возвращает упрощенное значение максимума выражений от x_1 до x_n.
Когда get (trylevel, maxmin) есть 2 или больше, max использует  упрощение 
max (e, -e) --> |e|.  Когда get (trylevel, maxmin) есть 3 или больше, max старается
исключить выражения, заключенные по значению между двумя другими аргументами. Например,
max (x, 2*x, 3*x) --> max (x, 3*x). Для установки значения  trylevel в 2, используется
put (trylevel, 2, maxmin).
Возвращает упрощенное значение минимума выражений от x_1 до x_n.
Когда get (trylevel, maxmin) есть 2 или больше, min использует  упрощение
min (e, -e) --> -|e|.  Когда get (trylevel, maxmin) есть 3 или больше, min старается
исключить выражения, заключенные по значению между двумя другими аргументами. Например,
min (x, 2*x, 3*x) --> min (x, 3*x). Для установки значения  trylevel в 2, используется
put (trylevel, 2, maxmin).
Конвертирует многочлен p в модулярное представление,
с учетом текущего модуля, которое является значением переменной
modulus.  
polymod (p, m) определяет модуль m, который будет использоваться 
вместо текущего значения modulus.
См. modulus.
Если x и y есть вещественные числа и y не отрицательно,
возвращает x - y * floor(x / y).
Далее для всех вещественных x имеем mod (x, 0) = x. Подробное обсуждение 
определения mod (x, 0) = x есть в разделе 3.4 "Concrete Mathematics," 
авторов Graham, Knuth и Patashnik. Функция mod (x, 1) 
есть пилообразная функция с периодом 1, mod (1, 1) = 0 и 
mod (0, 1) = 0.
Чтобы найти главный аргумент (число в интервале (-%pi, %pi]) для комплексного числа, 
используется функция x |-> %pi - mod (%pi - x, 2*%pi), где 
x есть аргумент.
Когда x и y есть константные выражения (например 10 * %pi), mod
использует то же вычисления с числами с плавающей точкой повышенной точности, что и,  floor и ceiling.
Опять же, возможно, хотя маловероятно, что mod может вернуть ошибочное значение в таких случаях.
Для не численных аргументов x или y, mod знает несколько правил упрощения:
(%i1) mod (x, 0); (%o1) x (%i2) mod (a*x, a*y); (%o2) a mod(x, y) (%i3) mod (0, x); (%o3) 0
есть true если expr есть нечетное целое.
false возвращается во всех других случаях.
В качестве аргумента в вызове ev (expr),
pred вызывает вычисление предикатов (выражений, которые вычисляются в true
или false) .
См. ev.
Объект случайного состояния представляет собой состояние генератора случайных чисел. Оно содержит 627 32-битных слова.
make_random_state (n) возвращает новое случайное состояние объекта
созданного из затравочного целого числа, равного n по модулю 2^32.
n может быть отрицательным.
make_random_state (s) возвращает копию случайного состояния s.
make_random_state (true) возвращает новое случайное состояние объекта,
используя текущее значение часов компьютера в качестве затравочного числа.
make_random_state (false) возвращает копию текущего состояния
генератора случайных чисел.
Копирует s в состояние генератора случайных чисел.
set_random_state всегда возвращает done.
Возвращает псевдослучайное число. Если x есть целое, random (x) возвращает 
целое в пределах от 0 до x - 1 включительно. Если x есть число с плавающей точкой,
random (x) возвращает неотрицательное число с плавающей точкой меньше чем x.
Функция random выдает сообщение об ошибке, если x не есть целое, или не число с плавающей точкой, 
или если x неположительное.
Функции make_random_state и set_random_state
сохраняют состояние генератора случайных чисел.
Генератор случайных чисел Maxima - это реализация Mersenne twister MT 19937.
Примеры:
(%i1) s1: make_random_state (654321)$ (%i2) set_random_state (s1); (%o2) done (%i3) random (1000); (%o3) 768 (%i4) random (9573684); (%o4) 7657880 (%i5) random (2^75); (%o5) 11804491615036831636390 (%i6) s2: make_random_state (false)$ (%i7) random (1.0); (%o7) .2310127244107132 (%i8) random (10.0); (%o8) 4.394553645870825 (%i9) random (100.0); (%o9) 32.28666704056853 (%i10) set_random_state (s2); (%o10) done (%i11) random (1.0); (%o11) .2310127244107132 (%i12) random (10.0); (%o12) 4.394553645870825 (%i13) random (100.0); (%o13) 32.28666704056853
Конвертирует все числа с плавающей точкой двойной точности и повышенной точности в выражении
expr в рациональные эквивалентны. Если вы не знакомы с
бинарным представлением чисел с плавающей точкой, вы может
быть удивлены тем, что rationalize (0.1) не равно 1/10.  Это поведение
имеет место не только в Maxima – число 1/10 имеет периодическое, не заканчивающееся,
двоичное представление.
(%i1) rationalize (0.5);
                                1
(%o1)                           -
                                2
(%i2) rationalize (0.1);
                               1
(%o2)                          --
                               10
(%i3) fpprec : 5$
(%i4) rationalize (0.1b0);
                             209715
(%o4)                        -------
                             2097152
(%i5) fpprec : 20$
(%i6) rationalize (0.1b0);
                     236118324143482260685
(%o6)                ----------------------
                     2361183241434822606848
(%i7) rationalize (sin (0.1*x + 5.6));
                              x    28
(%o7)                     sin(-- + --)
                              10   5
Пример использования:
(%i1) unitfrac(r) := block([uf : [], q],
    if not(ratnump(r)) then
       error("The input to 'unitfrac' must be a rational number"),
    while r # 0 do (
        uf : cons(q : 1/ceiling(1/r), uf),
        r : r - q),
    reverse(uf));
(%o1) unitfrac(r) := block([uf : [], q], 
if not ratnump(r) then
   error("The input to 'unitfrac' must be a rational number"),
                                  1
while r # 0 do (uf : cons(q : ----------, uf), r : r - q), 
                                      1
                              ceiling(-)
                                      r
reverse(uf))
(%i2) unitfrac (9/10);
                            1  1  1
(%o2)                      [-, -, --]
                            2  3  15
(%i3) apply ("+", %);
                               9
(%o3)                          --
                               10
(%i4) unitfrac (-9/10);
                                  1
(%o4)                       [- 1, --]
                                  10
(%i5) apply ("+", %);
                                9
(%o5)                         - --
                                10
(%i6) unitfrac (36/37);
                        1  1  1  1    1
(%o6)                  [-, -, -, --, ----]
                        2  3  8  69  6808
(%i7) apply ("+", %);
                               36
(%o7)                          --
                               37
Если x является вещественным числом, то возвращает ближайшее к x
целое.  Числа, кратные 1/2, округляются до ближайшего четного целого.
Вычисление x аналогично функциям floor и ceiling.
Пытается определить знак expr
на основе фактов в текущей базе данных. Она возвращает один из
следующих ответов: pos (положительное), neg (отрицательное), zero (нулевое), pz
(положительное или ноль), nz (отрицательное или ноль), pn (положительное или отрицательное),
или pnz (положительное, отрицательное или ноль, т.е. ничего не известно).
Для численного значения x, возвращает 0, если x есть 0, иначе возвращает -1 или +1, когда x меньше чем или больше чем 0, соответственно.
Если x не есть численное значение, то возвращается эквивалентная, но упрощенная форма.
Например, signum(-x) дает -signum(x).
Сортирует список L согласно предикату P двух аргументов,
так чтобы P (L[k], L[k + 1]) было равно true
для любых двух последовательных элементов.
Предикат может быть задан как имя функции или бинарный инфиксный оператор,
или как лямбда-выражение.
Если он задан как имя оператора,
это имя берется в "двойные кавычки".
Отсортированный список возвращается как новый объект;
аргумент L не изменяется.
При возврате значения,
sort делает копию верхнего уровня (shallow copy) элементов L.
Если предикат P не задает полное упорядочивание элементов L,
то sort может пробежать до конца без ошибки,
но результат будет неопределенный.
sort выдает сообщение, если предикат вычисляется до чего-то отличного
от true или false.
sort (L) эквивалентно sort (L, orderlessp).
То есть, порядок сортировки по умолчанию будет восходящим,
как определено для orderlessp.
Все Maxima атомы и выражения сравнимы по orderlessp,
хотя есть отдельные примеры выражений, для которых orderlessp не транзитивна
(это ошибка).
Примеры:
(%i1) sort ([11, -17, 29b0, 7.55, 3, -5/2, b + a, 9 * c,
      19 - 3 * x]);
               5
(%o1) [- 17, - -, 3, 7.55, 11, 2.9b1, b + a, 9 c, 19 - 3 x]
               2
(%i2) sort ([11, -17, 29b0, 7.55, 3, -5/2, b + a, 9*c, 19 - 3*x],
      ordergreatp);
                                                   5
(%o2) [19 - 3 x, 9 c, b + a, 2.9b1, 11, 7.55, 3, - -, - 17]
                                                   2
(%i3) sort ([%pi, 3, 4, %e, %gamma]);
(%o3)                [3, 4, %e, %gamma, %pi]
(%i4) sort ([%pi, 3, 4, %e, %gamma], "<");
(%o4)                [%gamma, %e, 3, %pi, 4]
(%i5) my_list: [[aa,hh,uu], [ee,cc], [zz,xx,mm,cc], [%pi,%e]];
(%o5) [[aa, hh, uu], [ee, cc], [zz, xx, mm, cc], [%pi, %e]]
(%i6) sort (my_list);
(%o6) [[%pi, %e], [aa, hh, uu], [ee, cc], [zz, xx, mm, cc]]
(%i7) sort (my_list, lambda ([a, b], orderlessp (reverse (a),
      reverse (b))));
(%o7) [[%pi, %e], [ee, cc], [zz, xx, mm, cc], [aa, hh, uu]]
Квадратный корень x. Внутренне представляется как
x^(1/2).  См. также rootscontract.
radexpand, если true, вызовет то, что n-ные корни множителей произведения,
которые есть степени n, будут вынесены за пределы радикала. Например,
sqrt(16*x^2) станет 4*x, только если radexpand есть true.
Значение по умолчанию: true
Когда sqrtdispflag есть false,
то sqrt выводится как степень с показателем 1/2.
Производит множественные параллельные подстановки в выражение.
Переменная sublis_apply_lambda управляет упрощением после
sublis.
Пример:
(%i1) sublis ([a=b, b=a], sin(a) + cos(b)); (%o1) sin(b) + cos(a)
Возвращает список элементов list, для которого 
предикат p возвращает true.
Пример:
(%i1) L: [1, 2, 3, 4, 5, 6]; (%o1) [1, 2, 3, 4, 5, 6] (%i2) sublist (L, evenp); (%o2) [2, 4, 6]
Значение по умолчанию: true
Управляет, будет ли подстановки для lambda применены в упрощении, 
после того как используется sublis или
нужно ли выполнить ev, чтобы эти элементы применились. 
true означает - выполнить применение.
Делает подстановку a для b в c.  
b должен быть атомом или полным подвыражением в c.  Например, x+y+z есть полное
подвыражение 2*(x+y+z)/w, а x+y нет. Когда b не имеет
эти характеристики, можно иногда использовать substpart или ratsubst
(см. ниже).  Альтернативно, если b задано в форме e/f, то можно
использовать subst (a*f, e, c), в то время как, если b задано в  форме e^(1/f), то можно 
использовать subst (a^f, e, c).  subst также различает x^y в x^-y,
так что subst (a, sqrt(x), 1/sqrt(x)) дает 1/a.  Аргументы a и b могут также быть
операторами выражения, заключенными в двойные кавычки ", или могут быть именами функций. 
Если есть желание подставить независимую переменную в
производных формах, то следует использовать функцию at (см. ниже).
subst - это псевдоним для substitute.
Выражения subst (eq_1, expr) или subst ([eq_1, ..., eq_k], expr)
- есть другие допустимые формы.  
eq_i - уравнения, указывающие какие подстановки нужно сделать.
Для каждого уравнения, правая сторона будет подставлена вместо левой в выражении expr.
Если exptsubst равно true, то позволяются подстановки,
на подобии y для %e^x в %e^(a*x).
Когда opsubst есть false,
subst не пытается подставить в оператор выражения.
Например, (opsubst: false, subst (x^2, r, r+r[0])) будет работать.
Примеры:
(%i1) subst (a, x+y, x + (x+y)^2 + y);
                                    2
(%o1)                      y + x + a
(%i2) subst (-%i, %i, a + b*%i);
(%o2)                       a - %i b
Чтобы узнать о других примерах, выполните example (subst).
Аналогично substpart, но substinpart работает с 
внутренним представление expr.
Примеры:
(%i1) x . 'diff (f(x), x, 2);
                              2
                             d
(%o1)                   x . (--- (f(x)))
                               2
                             dx
(%i2) substinpart (d^2, %, 2);
                                  2
(%o2)                        x . d
(%i3) substinpart (f1, f[1](x + 1), 0);
(%o3)                       f1(x + 1)
Если последний аргумент функции part есть список индексов, то будут выбраны
несколько подвыражений, каждый из которых будет соответствовать 
индексу в списке. Таким образом
(%i1) part (x + y + z, [1, 3]); (%o1) z + x
Переменная piece содержит значение последнего выражения, выбранного при использовании функции part.
Оно устанавливается во время выполнения функции и,
таким образом, может быть передано в саму функцию как показано ниже.
Если partswitch равно true, то end возвращается когда 
выбранная часть выражения не существует, иначе 
выдается сообщение об ошибке.
(%i1) expr: 27*y^3 + 54*x*y^2 + 36*x^2*y + y + 8*x^3 + x + 1;
              3         2       2            3
(%o1)     27 y  + 54 x y  + 36 x  y + y + 8 x  + x + 1
(%i2) part (expr, 2, [1, 3]);
                                  2
(%o2)                         54 y
(%i3) sqrt (piece/54);
(%o3)                        abs(y)
(%i4) substpart (factor (piece), expr, [1, 2, 3, 5]);
                               3
(%o4)               (3 y + 2 x)  + y + x + 1
(%i5) expr: 1/x + y/x - 1/z;
                             1   y   1
(%o5)                      - - + - + -
                             z   x   x
(%i6) substpart (xthru (piece), expr, [2, 3]);
                            y + 1   1
(%o6)                       ----- - -
                              x     z
Также, установка опции inflag в true и вызов part или substpart есть 
тоже самое, что и вызов inpart или substinpart.
Делает подстановку x в подвыражение,
выбираемое последними аргументами, как в part. Возвращает 
новое значение expr.  x может быть некоторым оператором для подстановки вместо
оператора в expr. В некоторых случаях x нужно заключать в двойной кавычки "
(Например, substpart ("+", a*b, 0) дает b + a).
(%i1) 1/(x^2 + 2);
                               1
(%o1)                        ------
                              2
                             x  + 2
(%i2) substpart (3/2, %, 2, 1, 2);
                               1
(%o2)                       --------
                             3/2
                            x    + 2
(%i3) a*x + f(b, y);
(%o3)                     a x + f(b, y)
(%i4) substpart ("+", %, 1, 0);
(%o4)                    x + f(b, y) + a
Также, установка опции inflag в true и вызов part или substpart, есть 
тоже самое, что и вызов inpart или substinpart.
Возвращает true, если expr есть переменная с индексом,
например a[i].
Возвращает true, если expr есть символ, иначе false.
На самом деле, symbolp(x) эквивалентно предикату atom(x) and not numberp(x).
См. также Идентификаторы.
Блокирует связывания, созданные последним вызовом упорядочивающих
команд ordergreat и orderless. ordergreat и orderless не могут
использоваться больше одного раза каждый, без вызова unorder. 
См. также ordergreat и orderless.
Примеры:
(%i1) unorder();
(%o1)                          []
(%i2) b*x + a^2;
                                   2
(%o2)                       b x + a
(%i3) ordergreat (a);
(%o3)                         done
(%i4) b*x + a^2;
 %th(1) - %th(3);
                             2
(%o4)                       a  + b x
(%i5) unorder();
                              2    2
(%o5)                        a  - a
Возвращает векторный потенциал заданного
вектора кручения, в текущей системе координат.
potentialzeroloc имеет аналогичную роль для potential, но порядок 
левосторонних частей уравнений должен быть циклической перестановкой 
координатных переменных.
Объединяет все члены expr (которое должно быть суммой) для общего знаменателя 
без раскрытия произведений и степеней сумм,
что делает ratsimp.  Функция xthru сокращает общие множители в числителе и
знаменателе рациональных выражений, но только если эти множители явные.
Иногда лучше использовать xthru перед выражением, упрощенным с помощью ratsimp, 
для того чтобы вызывать сокращение явных множителей наибольшего общего делителя 
числителя и знаменателя, таким образом, упрощая выражение перед ratsimp.
(%i1) ((x+2)^20 - 2*y)/(x+y)^20 + (x+y)^(-19) - x/(x+y)^20;
                                20
                 1       (x + 2)   - 2 y       x
(%o1)        --------- + --------------- - ---------
                    19             20             20
             (y + x)        (y + x)        (y + x)
(%i2) xthru (%);
                                 20
                          (x + 2)   - y
(%o2)                     -------------
                                   20
                            (y + x)
Проверяет эквивалентно ли выражение expr в переменной
v нулю, возвращает true, false или
dontknow.
zeroequiv имеет следующие ограничения:
Например zeroequiv (sin(2*x) - 2*sin(x)*cos(x), x) возвращает
true и zeroequiv (%e^x + x, x) возвращает false.
С другой стороны zeroequiv (log(a*b) - log(a) - log(b), a) возвращает 
dontknow из-за присутствия дополнительного параметра b.
Previous: Операторы отношения, Up: Операторы [Contents][Index]