Advanced Math - New Features in Maple 2020 - Maplesoft

What's New in Maple 2020

Advanced Mathematics

Maple 2020 includes a very large number of improvements that strengthen the math engine, expanding Maple's abilities to handle new areas of mathematics and solve harder problems, faster. In addition to the advancements in ODEs/PDEs, graph theory, group theory, integral transforms, and other topics that are detailed elsewhere, there are also enhancements to fundamental routines that are used regularly both by customers and by other Maple commands.

assume, is, coulditbe, getassumptions, about 

User friendly improvements to getassumptions 

The getassumptions command now returns all assumptions directly or indirectly related to the variables in the input. now returns all assumptions directly or indirectly related to the variables in the input. 

>
 

In the following, the two assumption not directly involving x; are now also returned because together with the other assumption they provide extra information about x; , namely that x; is real and greater than 0. These facts cannot be inferred from the assumption `>`(`+`(x, `-`(y)), 0); alone. 

> getassumptions(x);
 

{z::real, (`+`(x, `-`(y)))::(RealRange(Open(0), infinity)), (`+`(y, `-`(z)))::(RealRange(Open(0), infinity))}
 

> x, y, z := 'x, y, z'; -1
 

assume can now handle generic Or-type assumptions  

Previously Maple could only handle Or-type assumptions involving the same subexpression, such as:

assume(Or(`<`(exp(x), 0), `>`(exp(x), 1)));

Now, any conditions that can be assumed independently can also appear in an Or-type assumption:
 

> assume(Or(`<`(0, x), `<`(0, y)));
 

> is(`<`(0, x));
 

false
 

> `assuming`([is(`<`(0, x))], [additionally, `<=`(y, 0)]);
 

true
 

> x, y := 'x, y'; -1
 

is now makes calls to the SMTLIB package 

The is command now makes use of SMTLIB:-Satisfy to help compute some answers involving real variables. 

> `assuming`([is(x = 0)], [`<`(0, abs(x))]);
 

false
 

> `assuming`([coulditbe(x = 0)], [`<`(0, abs(x))]);
 

false
 

> `assuming`([is(`<=`(0, `+`(`*`(`^`(a, 2)), `*`(`^`(b, 2)), `*`(2, `*`(a, `*`(b))), abs(`*`(`^`(r, 2))))))], [real]);
 

true
 

> `assuming`([is(abs(`*`(x, `*`(y))) = `*`(abs(x), `*`(abs(y))))], [real]);
 

true
 

> `assuming`([is(`<=`(0, `+`(`*`(`^`(`+`(a, `-`(b)), 2)), `*`(`^`(`+`(c, `-`(d)), 2)))))], [real]);
 

true
 

Triangle Inequality: 

> `assuming`([is(`<=`(abs(`+`(x, y)), `+`(abs(x), abs(y))))], [real]);
 

true
 

Other new results from is and coulditbe 

> `assuming`([is(`/`(`*`(('abs')(`+`(`*`(x1, `*`(y2)), `-`(`*`(x2, `*`(y1)))))), `*`(`+`(`*`(x1, `*`(x2)), `*`(y1, `*`(y2))))), rational)], [x1::'posint', x2::'posint', y1::'posint', y2::'posint']);
 

true
 

> `assuming`([is(abs(`+`(x1, `-`(x2))), posint)], [x1::'posint', x2::'posint', y1::'posint', y2::'posint']);
 

false
 

> coulditbe(`*`(`^`(-1, `/`(1, 4))) = I);
 

false
 

> coulditbe(sqrt(2) = I);
 

false
 

> coulditbe(`*`(I, `*`(sqrt(2))) = -1);
 

false
 

> `assuming`([is(a, real)], [`/`(1, `*`(`+`(`*`(a, `*`(y)), `-`(sqrt(`+`(`-`(`*`(a, `*`(b))))))))) = z, y = sqrt(x), `<`(0, x)]);
 

false
 

> `assuming`([is(`<`(0, exp(f(x))))], [`<`(0, x)]);
 

false
 

> is(f(0) = 0);
 

false
 

> `assuming`([coulditbe(x, {1, 2})], [x::set]);
 

true
 

> is(`<`(`+`(`-`(infinity)), Y(infinity)));
 

false
 

> `assuming`([is(randpoly([x, n]), integer)], [x, real, n, prime]);
 

false
 

> `assuming`([is(exp(x), real)], [x::imaginary]);
 

false
 

> `assuming`([is(`+`(`-`(n), `-`(1)), {-1, 0, posint})], [n::'nonposint']);
 

true
 

> `assuming`([coulditbe(`<=`(`+`(`-`(`/`(1, `*`(f(x))))), 0))], [Not(`<`(0, f(x)))]);
 

false
 

> `assuming`([is(x, complex)], [x::(Non(0))]);
 

false
 

> `assuming`([is(abs(`+`(`*`(x1, `*`(y2)), `-`(`*`(x2, `*`(y1))))), integer)], [x1::'posint', x2::'posint', y1::'posint', y2::'posint']);
 

true
 

> `assuming`([is(`<`(0, `+`(`-`(`*`(`^`(RootOf(`+`(`*`(1024, `*`(`^`(_Z, 19))), `*`(1216, `*`(`^`(_Z, 13))), `-`(`*`(1691, `*`(`^`(_Z, 7)))), `-`(`*`(54, `*`(_Z)))), -.9720806486), 3))), `*`(3, `*`(Root...
`assuming`([is(`<`(0, `+`(`-`(`*`(`^`(RootOf(`+`(`*`(1024, `*`(`^`(_Z, 19))), `*`(1216, `*`(`^`(_Z, 13))), `-`(`*`(1691, `*`(`^`(_Z, 7)))), `-`(`*`(54, `*`(_Z)))), -.9720806486), 3))), `*`(3, `*`(Root...
`assuming`([is(`<`(0, `+`(`-`(`*`(`^`(RootOf(`+`(`*`(1024, `*`(`^`(_Z, 19))), `*`(1216, `*`(`^`(_Z, 13))), `-`(`*`(1691, `*`(`^`(_Z, 7)))), `-`(`*`(54, `*`(_Z)))), -.9720806486), 3))), `*`(3, `*`(Root...
 

true
 

> `assuming`([coulditbe(m, 0)], [`<`(`+`(`*`(`/`(1, 2), `*`(`^`(n, 2))), `-`(`*`(`/`(1, 2), `*`(n)))), m), n::'integer', Or(`<`(n, 0), `<`(1, n))]);
 

false
 

The following result used to be true.  It now returns FAIL since is cannot determine if the property is always satisfied. 

> `assuming`([is(sqrt(x), real)], [x::'integer']);
 

FAIL
 

about 

This result from about is now simpler: 

> `assuming`([about(x)], [x::(RealRange(0, infinity)), (`+`(`-`(x)))::(RealRange(`+`(`-`(infinity)), 0))]);
 

Originally x, renamed x~:  is assumed to be: RealRange(0,infinity)
 

asympt 

Maple can now compute asymptotic expansions for various mathematical functions of type `#mscripts(mi( with rational parameter values. 

> asympt(KummerM(`/`(1, 3), 1, x), x, 4);
 

`*`(`+`(`/`(`*`(`/`(1, 2), `*`(`^`(3, `/`(1, 2)), `*`(GAMMA(`/`(2, 3)), `*`(`^`(`/`(1, `*`(x)), `/`(2, 3)))))), `*`(Pi)), `/`(`*`(`/`(2, 9), `*`(`^`(3, `/`(1, 2)), `*`(GAMMA(`/`(2, 3)), `*`(`^`(`/`(1,...
 

> asympt(KummerU(-`/`(1, 3), 2, `+`(`-`(x))), x, 4);
 

`+`(`/`(`*`(`+`(`/`(1, 2), `*`(`*`(`/`(1, 2), `*`(I)), `*`(`^`(3, `/`(1, 2)))))), `*`(`^`(`/`(1, `*`(x)), `/`(1, 3)))), `*`(`+`(`/`(2, 9), `*`(`*`(`/`(2, 9), `*`(I)), `*`(`^`(3, `/`(1, 2))))), `*`(`^`...
 

> asympt(WhittakerW(`/`(1, 3), 1, x), x, 4);
 

`/`(`*`(`+`(`/`(1, `*`(`^`(`/`(1, `*`(x)), `/`(1, 3)))), `*`(`/`(35, 36), `*`(`^`(`/`(1, `*`(x)), `/`(2, 3)))), `-`(`*`(`/`(455, 2592), `*`(`^`(`/`(1, `*`(x)), `/`(5, 3))))), `*`(`/`(60515, 279936), `...
 

ComputationalGeometry:-PointInPolygon 

The new command PointInPolygon determines if a point lies within the polygon formed by a list of points. 

> with(ComputationalGeometry); -1
 

> Q := [[1.1180, .36327], [0., 1.1756], [-1.1180, .36327], [-.69098, -.95106], [.69098, -.95106]]; -1
 

> a := [0., 0.]; -1b := [1., 1.]; -1c := `+`(`*`(.5, `*`(Q[1])), `*`(.5, `*`(Q[2]))); -1
 

> plots:-display(plottools:-point([a, b, c], symbolsize = 20), plots:-textplot([a[],
plots:-display(plottools:-point([a, b, c], symbolsize = 20), plots:-textplot([a[],
 

Plot_2d
 

> PointInPolygon(a, Q);
 

inside
 

> PointInPolygon(b, Q);
 

outside
 

> PointInPolygon(c, Q);
 

boundary
 

evala 

The new command evala/Minpoly computes the minimal polynomial of 

  • an algebraic number over the field of rational numbers (or a user-specified extension field thereof), or

  • an algebraic function over the field of rational functions (or a user-specified extension field thereof).
 

> restart; 1
 

> evala(Minpoly(`+`(RootOf(`+`(`*`(`^`(_Z, 2)), `-`(2))), 1), x));
 

`+`(`*`(`^`(x, 2)), `-`(`*`(2, `*`(x))), `-`(1))
 

> sort(evala(Minpoly(`*`(`^`(-1, `/`(1, 4))), x, {sqrt(2)})));
 

`+`(`*`(`^`(x, 2)), `-`(`*`(`^`(2, `/`(1, 2)), `*`(x))), 1)
 

> radnormal(eval(`+`(`*`(`^`(x, 2)), `-`(`*`(`^`(2, `/`(1, 2)), `*`(x))), 1), x = `*`(`^`(-1, `/`(1, 4)))));
 

0
 

> sort(evala(Minpoly(`*`(`^`(-1, `/`(1, 4))), x, {I})));
 

`+`(`*`(`^`(x, 2)), `-`(I))
 

A subset of this functionality is also available through a new calling sequence in the MinimalPolynomial command in the PolynomialTools package. 

> PolynomialTools:-MinimalPolynomial(`+`(sqrt(2), sqrt(-5)), x);
 

`+`(`*`(`^`(x, 4)), `*`(6, `*`(`^`(x, 2))), 49)
 

> radnormal(eval(`+`(`*`(`^`(x, 4)), `*`(6, `*`(`^`(x, 2))), 49), x = `+`(sqrt(2), sqrt(-5))));
 

0
 

Integration 

There have been some improvements in integration of algebraic, elementary, and piecewise functions: 

> simplify(int(`+`(`-`(`/`(`*`(`/`(1, 4), `*`(`+`(`-`(`*`(8, `*`(`^`(x, 3)))), `*`(sqrt(6), `*`(sqrt(`/`(`*`(`+`(`-`(`*`(`^`(x, 3))), `*`(I, `*`(`^`(x, 3), `*`(sqrt(3)))), `*`(3, `*`(`^`(x, 2))), `*`(`*...
simplify(int(`+`(`-`(`/`(`*`(`/`(1, 4), `*`(`+`(`-`(`*`(8, `*`(`^`(x, 3)))), `*`(sqrt(6), `*`(sqrt(`/`(`*`(`+`(`-`(`*`(`^`(x, 3))), `*`(I, `*`(`^`(x, 3), `*`(sqrt(3)))), `*`(3, `*`(`^`(x, 2))), `*`(`*...
 

`+`(`/`(`*`(`/`(1, 16), `*`(`^`(2, `/`(1, 2)), `*`(`+`(`-`(`*`(`/`(4, 3), `*`(`^`(`+`(3, `-`(`*`(`+`(`*`(3, `*`(I))), `*`(`^`(3, `/`(1, 2)))))), `/`(1, 2)), `*`(`+`(`*`(`+`(`*`(`+`(x, `/`(1, 2)), `*`(...
`+`(`/`(`*`(`/`(1, 16), `*`(`^`(2, `/`(1, 2)), `*`(`+`(`-`(`*`(`/`(4, 3), `*`(`^`(`+`(3, `-`(`*`(`+`(`*`(3, `*`(I))), `*`(`^`(3, `/`(1, 2)))))), `/`(1, 2)), `*`(`+`(`*`(`+`(`*`(`+`(x, `/`(1, 2)), `*`(...
`+`(`/`(`*`(`/`(1, 16), `*`(`^`(2, `/`(1, 2)), `*`(`+`(`-`(`*`(`/`(4, 3), `*`(`^`(`+`(3, `-`(`*`(`+`(`*`(3, `*`(I))), `*`(`^`(3, `/`(1, 2)))))), `/`(1, 2)), `*`(`+`(`*`(`+`(`*`(`+`(x, `/`(1, 2)), `*`(...
`+`(`/`(`*`(`/`(1, 16), `*`(`^`(2, `/`(1, 2)), `*`(`+`(`-`(`*`(`/`(4, 3), `*`(`^`(`+`(3, `-`(`*`(`+`(`*`(3, `*`(I))), `*`(`^`(3, `/`(1, 2)))))), `/`(1, 2)), `*`(`+`(`*`(`+`(`*`(`+`(x, `/`(1, 2)), `*`(...
`+`(`/`(`*`(`/`(1, 16), `*`(`^`(2, `/`(1, 2)), `*`(`+`(`-`(`*`(`/`(4, 3), `*`(`^`(`+`(3, `-`(`*`(`+`(`*`(3, `*`(I))), `*`(`^`(3, `/`(1, 2)))))), `/`(1, 2)), `*`(`+`(`*`(`+`(`*`(`+`(x, `/`(1, 2)), `*`(...
 

> simplify(int(`/`(`*`(`^`(x, 2), `*`(`+`(`*`(40545, `*`(x, `*`(sqrt(3)))), `-`(`*`(29681, `*`(sqrt(3)))), `-`(`*`(70226, `*`(x))), 51409), `*`(sqrt(`+`(`*`(4, `*`(`^`(x, 3))), `*`(`^`(x, 2)), `*`(2, `*...
 

`+`(`/`(`*`(3912488, `*`(`^`(`*`(`+`(`*`(`^`(x, 3)), 1), `*`(`^`(`+`(`-`(x), `-`(1), `*`(`^`(3, `/`(1, 2)))), 2))), `/`(1, 2)), `*`(`+`(`*`(`^`(`/`(`*`(`+`(`*`(I, `*`(`^`(3, `/`(1, 2)))), `*`(2, `*`(x...
`+`(`/`(`*`(3912488, `*`(`^`(`*`(`+`(`*`(`^`(x, 3)), 1), `*`(`^`(`+`(`-`(x), `-`(1), `*`(`^`(3, `/`(1, 2)))), 2))), `/`(1, 2)), `*`(`+`(`*`(`^`(`/`(`*`(`+`(`*`(I, `*`(`^`(3, `/`(1, 2)))), `*`(2, `*`(x...
`+`(`/`(`*`(3912488, `*`(`^`(`*`(`+`(`*`(`^`(x, 3)), 1), `*`(`^`(`+`(`-`(x), `-`(1), `*`(`^`(3, `/`(1, 2)))), 2))), `/`(1, 2)), `*`(`+`(`*`(`^`(`/`(`*`(`+`(`*`(I, `*`(`^`(3, `/`(1, 2)))), `*`(2, `*`(x...
`+`(`/`(`*`(3912488, `*`(`^`(`*`(`+`(`*`(`^`(x, 3)), 1), `*`(`^`(`+`(`-`(x), `-`(1), `*`(`^`(3, `/`(1, 2)))), 2))), `/`(1, 2)), `*`(`+`(`*`(`^`(`/`(`*`(`+`(`*`(I, `*`(`^`(3, `/`(1, 2)))), `*`(2, `*`(x...
`+`(`/`(`*`(3912488, `*`(`^`(`*`(`+`(`*`(`^`(x, 3)), 1), `*`(`^`(`+`(`-`(x), `-`(1), `*`(`^`(3, `/`(1, 2)))), 2))), `/`(1, 2)), `*`(`+`(`*`(`^`(`/`(`*`(`+`(`*`(I, `*`(`^`(3, `/`(1, 2)))), `*`(2, `*`(x...
`+`(`/`(`*`(3912488, `*`(`^`(`*`(`+`(`*`(`^`(x, 3)), 1), `*`(`^`(`+`(`-`(x), `-`(1), `*`(`^`(3, `/`(1, 2)))), 2))), `/`(1, 2)), `*`(`+`(`*`(`^`(`/`(`*`(`+`(`*`(I, `*`(`^`(3, `/`(1, 2)))), `*`(2, `*`(x...
 

> simplify(int(`+`(`/`(`*`(`/`(1, 3), `*`(`+`(`-`(x), `-`(2)), `*`(sqrt(`*`(`+`(`*`(I, `*`(sqrt(3))), `-`(`*`(2, `*`(x))), `-`(1)), `*`(`+`(x, `-`(1)))))))), `*`(`+`(`*`(`^`(x, 2)), x, 1)))), x));
 

`+`(`/`(`*`(4, `*`(`^`(2, `/`(1, 2)), `*`(`+`(`*`(`+`(`*`(`+`(`*`(I, `*`(x)), `*`(2, `*`(I))), `*`(`^`(3, `/`(1, 2)))), `-`(`*`(3, `*`(x)))), `*`(ln(`/`(`*`(`+`(`*`(`*`(2, `*`(I)), `*`(`^`(`+`(3, `-`(...
`+`(`/`(`*`(4, `*`(`^`(2, `/`(1, 2)), `*`(`+`(`*`(`+`(`*`(`+`(`*`(I, `*`(x)), `*`(2, `*`(I))), `*`(`^`(3, `/`(1, 2)))), `-`(`*`(3, `*`(x)))), `*`(ln(`/`(`*`(`+`(`*`(`*`(2, `*`(I)), `*`(`^`(`+`(3, `-`(...
`+`(`/`(`*`(4, `*`(`^`(2, `/`(1, 2)), `*`(`+`(`*`(`+`(`*`(`+`(`*`(I, `*`(x)), `*`(2, `*`(I))), `*`(`^`(3, `/`(1, 2)))), `-`(`*`(3, `*`(x)))), `*`(ln(`/`(`*`(`+`(`*`(`*`(2, `*`(I)), `*`(`^`(`+`(3, `-`(...
`+`(`/`(`*`(4, `*`(`^`(2, `/`(1, 2)), `*`(`+`(`*`(`+`(`*`(`+`(`*`(I, `*`(x)), `*`(2, `*`(I))), `*`(`^`(3, `/`(1, 2)))), `-`(`*`(3, `*`(x)))), `*`(ln(`/`(`*`(`+`(`*`(`*`(2, `*`(I)), `*`(`^`(`+`(3, `-`(...
 

> simplify(int(`/`(`*`(`+`(`*`(A, `*`(x)), B)), `*`(`+`(`*`(`^`(x, 2)), 1), `*`(sqrt(`+`(`*`(b, `*`(x)), `*`(`^`(x, 2)), `*`(I, `*`(b)), 1))))), x));
 

`/`(`*`(`+`(`*`(`^`(`+`(`*`(`+`(x, I), `*`(b)), `*`(`^`(x, 2)), 1), `/`(1, 2)), `*`(`^`(`*`(I, `*`(b)), `/`(1, 2)), `*`(`+`(`*`(I, `*`(B)), A)))), `*`(`/`(1, 4), `*`(`+`(`*`(`+`(`*`(`+`(`-`(`*`(`+`(I)...
`/`(`*`(`+`(`*`(`^`(`+`(`*`(`+`(x, I), `*`(b)), `*`(`^`(x, 2)), 1), `/`(1, 2)), `*`(`^`(`*`(I, `*`(b)), `/`(1, 2)), `*`(`+`(`*`(I, `*`(B)), A)))), `*`(`/`(1, 4), `*`(`+`(`*`(`+`(`*`(`+`(`-`(`*`(`+`(I)...
`/`(`*`(`+`(`*`(`^`(`+`(`*`(`+`(x, I), `*`(b)), `*`(`^`(x, 2)), 1), `/`(1, 2)), `*`(`^`(`*`(I, `*`(b)), `/`(1, 2)), `*`(`+`(`*`(I, `*`(B)), A)))), `*`(`/`(1, 4), `*`(`+`(`*`(`+`(`*`(`+`(`-`(`*`(`+`(I)...
 

> `assuming`([simplify(int(`/`(`*`(arctan(`+`(`*`(z, `*`(sqrt(2))), `-`(1)))), `*`(`+`(`*`(`^`(z, 2)), 1))), z))], [`<`(0, z)]);
 

`+`(`*`(arctan(z), `*`(arctan(`+`(`*`(z, `*`(`^`(2, `/`(1, 2)))), `-`(1))))), `*`(`*`(`/`(1, 2), `*`(I)), `*`(arctan(z), `*`(ln(`/`(`*`(`+`(`*`(`+`(1, I), `*`(`^`(2, `/`(1, 2)))), `-`(`*`(2, `*`(z))))...
`+`(`*`(arctan(z), `*`(arctan(`+`(`*`(z, `*`(`^`(2, `/`(1, 2)))), `-`(1))))), `*`(`*`(`/`(1, 2), `*`(I)), `*`(arctan(z), `*`(ln(`/`(`*`(`+`(`*`(`+`(1, I), `*`(`^`(2, `/`(1, 2)))), `-`(`*`(2, `*`(z))))...
 

> int(`+`(`/`(`*`(4, `*`(cosh(`+`(`*`(`/`(1, 2), `*`(Pi, `*`(`+`(y, `-`(3))))))))), `*`(Pi, `*`(cosh(`+`(`*`(`/`(3, 2), `*`(Pi))))))), `-`(`/`(`*`(`/`(4, 3), `*`(cosh(`+`(`*`(`/`(3, 2), `*`(Pi, `*`(`+`(...
 

`+`(`/`(`*`(`/`(4, 99225), `*`(`+`(`*`(91369, `*`(exp(`+`(`*`(57, `*`(Pi)))))), `-`(`*`(381188, `*`(exp(`+`(`*`(54, `*`(Pi))))))), `*`(869457, `*`(exp(`+`(`*`(51, `*`(Pi)))))), `-`(`*`(1534126, `*`(ex...
`+`(`/`(`*`(`/`(4, 99225), `*`(`+`(`*`(91369, `*`(exp(`+`(`*`(57, `*`(Pi)))))), `-`(`*`(381188, `*`(exp(`+`(`*`(54, `*`(Pi))))))), `*`(869457, `*`(exp(`+`(`*`(51, `*`(Pi)))))), `-`(`*`(1534126, `*`(ex...
`+`(`/`(`*`(`/`(4, 99225), `*`(`+`(`*`(91369, `*`(exp(`+`(`*`(57, `*`(Pi)))))), `-`(`*`(381188, `*`(exp(`+`(`*`(54, `*`(Pi))))))), `*`(869457, `*`(exp(`+`(`*`(51, `*`(Pi)))))), `-`(`*`(1534126, `*`(ex...
`+`(`/`(`*`(`/`(4, 99225), `*`(`+`(`*`(91369, `*`(exp(`+`(`*`(57, `*`(Pi)))))), `-`(`*`(381188, `*`(exp(`+`(`*`(54, `*`(Pi))))))), `*`(869457, `*`(exp(`+`(`*`(51, `*`(Pi)))))), `-`(`*`(1534126, `*`(ex...
`+`(`/`(`*`(`/`(4, 99225), `*`(`+`(`*`(91369, `*`(exp(`+`(`*`(57, `*`(Pi)))))), `-`(`*`(381188, `*`(exp(`+`(`*`(54, `*`(Pi))))))), `*`(869457, `*`(exp(`+`(`*`(51, `*`(Pi)))))), `-`(`*`(1534126, `*`(ex...
 

> int(`+`(`*`(`/`(1, 2), `*`(sin(`*`(Pi, `*`(y))), `*`(sin(`*`(_Z4, `*`(Pi, `*`(y)))), `*`(sqrt(2), `*`(piecewise(_Z3 = 1, `+`(`*`(4, `*`(`^`(cos(`*`(Pi, `*`(y))), 2))), `-`(1)), _Z3 = 2, 1, 0))))))), y...
 

Typesetting:-mprintslash([`+`(`*`(`/`(1, 2), `*`(`^`(2, `/`(1, 2)), `*`(PIECEWISE([`/`(`*`(`+`(`*`(`+`(_Z4, 3), `*`(sin(`*`(`+`(_Z4, `-`(3)), `*`(y, `*`(Pi)))))), `-`(`*`(sin(`*`(`+`(_Z4, 3), `*`(y, `...
 

> int(piecewise(`<`(`+`(s, `-`(`*`(6, `*`(floor(`+`(`*`(`/`(1, 6), `*`(s)), `/`(1, 2))))))), -3), 0, `<`(`+`(s, `-`(`*`(6, `*`(floor(`+`(`*`(`/`(1, 6), `*`(s)), `/`(1, 2))))))), 0), `+`(`-`(`*`(10, `*`(...
 

`+`(`-`(`/`(`*`(10, `*`(`+`(`*`(2048, `*`(`^`(cos(`*`(Pi, `*`(x))), 2), `*`(`^`(cos(`*`(Pi, `*`(floor(`+`(`*`(`/`(1, 6), `*`(x)), `/`(1, 2)))))), 12)))), `*`(2048, `*`(sin(`*`(Pi, `*`(x))), `*`(cos(`*...
`+`(`-`(`/`(`*`(10, `*`(`+`(`*`(2048, `*`(`^`(cos(`*`(Pi, `*`(x))), 2), `*`(`^`(cos(`*`(Pi, `*`(floor(`+`(`*`(`/`(1, 6), `*`(x)), `/`(1, 2)))))), 12)))), `*`(2048, `*`(sin(`*`(Pi, `*`(x))), `*`(cos(`*...
`+`(`-`(`/`(`*`(10, `*`(`+`(`*`(2048, `*`(`^`(cos(`*`(Pi, `*`(x))), 2), `*`(`^`(cos(`*`(Pi, `*`(floor(`+`(`*`(`/`(1, 6), `*`(x)), `/`(1, 2)))))), 12)))), `*`(2048, `*`(sin(`*`(Pi, `*`(x))), `*`(cos(`*...
`+`(`-`(`/`(`*`(10, `*`(`+`(`*`(2048, `*`(`^`(cos(`*`(Pi, `*`(x))), 2), `*`(`^`(cos(`*`(Pi, `*`(floor(`+`(`*`(`/`(1, 6), `*`(x)), `/`(1, 2)))))), 12)))), `*`(2048, `*`(sin(`*`(Pi, `*`(x))), `*`(cos(`*...
`+`(`-`(`/`(`*`(10, `*`(`+`(`*`(2048, `*`(`^`(cos(`*`(Pi, `*`(x))), 2), `*`(`^`(cos(`*`(Pi, `*`(floor(`+`(`*`(`/`(1, 6), `*`(x)), `/`(1, 2)))))), 12)))), `*`(2048, `*`(sin(`*`(Pi, `*`(x))), `*`(cos(`*...
`+`(`-`(`/`(`*`(10, `*`(`+`(`*`(2048, `*`(`^`(cos(`*`(Pi, `*`(x))), 2), `*`(`^`(cos(`*`(Pi, `*`(floor(`+`(`*`(`/`(1, 6), `*`(x)), `/`(1, 2)))))), 12)))), `*`(2048, `*`(sin(`*`(Pi, `*`(x))), `*`(cos(`*...
`+`(`-`(`/`(`*`(10, `*`(`+`(`*`(2048, `*`(`^`(cos(`*`(Pi, `*`(x))), 2), `*`(`^`(cos(`*`(Pi, `*`(floor(`+`(`*`(`/`(1, 6), `*`(x)), `/`(1, 2)))))), 12)))), `*`(2048, `*`(sin(`*`(Pi, `*`(x))), `*`(cos(`*...
 

> `assuming`([int(BesselJ(n, x), x)], [n::odd]);
 

`+`(1, `-`(BesselJ(0, x)), `-`(`*`(2, `*`(sum(BesselJ(`+`(`*`(2, `*`(i))), x), i = 1 .. `+`(`*`(`/`(1, 2), `*`(n)), `-`(`/`(1, 2))))))))
 

Maple now performs this change of variables correctly. 

> IntegrationTools:-Change(Int(`*`(exp(`+`(`*`(`/`(3, 8), `*`(cos(x))))), `*`(cos(`+`(`*`(`/`(3, 8), `*`(sin(x))))))), x = 0 .. `+`(`*`(2, `*`(Pi)))), cos(x) = t);
 

Typesetting:-mprintslash([`+`(`*`(2, `*`(Int(`/`(`*`(exp(`+`(`*`(`/`(3, 8), `*`(t)))), `*`(cos(`+`(`*`(`/`(3, 8), `*`(`^`(`+`(`-`(`*`(`^`(t, 2))), 1), `/`(1, 2)))))))), `*`(`^`(`+`(`-`(`*`(`^`(t, 2)))...
 

The integral transforms of the inttrans package have also added more functionality - see What's New in Integral Transforms. 

Jacobi polynomials 

The definition of the JacobiP function has been extended to cases when the 2nd or 3rd argument is a negative integer. 

In Maple 2019 and earlier, the following used to return undefined; or unevaluated: 

> JacobiP(5, -3, 0, .5);
 

-0.5957031250e-1
 

> JacobiP(.5, -3, 0, .5);
 

-0.1269583779e-2
 

> JacobiP(-1, -3, 0, .5);
 

0.1562500000e-1
 

> sort(expand(JacobiP(5, -3, 0, x)));
 

`+`(`*`(`/`(21, 32), `*`(`^`(x, 5))), `-`(`*`(`/`(45, 32), `*`(`^`(x, 4)))), `*`(`/`(5, 16), `*`(`^`(x, 3))), `*`(`/`(15, 16), `*`(`^`(x, 2))), `-`(`*`(`/`(15, 32), `*`(x))), `-`(`/`(1, 32)))
 

> expand(JacobiP(5, -3, 0, `/`(1, 2)));
 

-`/`(61, 1024)
 

Logic 

The Logic package contains a number of new routines for understanding the structure of logical expressions. 

Incidence graph and primal graph 

The new IncidenceGraph and PrimalGraph command return Graph objects which encode the incidence graph and the primal graph of a logical expression. 

If e is a Boolean expression in conjunctive normal form (CNF), the primal graph of e is a graph whose vertices are the variables of e. An edge exists between two variables if these variables occur together in a clause of e, in either negated or non-negated form. 

In the following example, the variables a and b share an edge because they appear together in the first clause, while a and c do not share an edge because they appear in distinct clauses. 

with(Logic); -1 

expr := `and`(`and`(`or`(`or`(not a, b), not d), `or`(`or`(not b, c), not d)), `or`(`or`(b, not c), d)); -1 

PG := PrimalGraph(expr);  

Typesetting:-mprintslash([PG := `Graph 1: an undirected unweighted graph with 4 vertices and 5 edge(s)`], [GRAPHLN(undirected, unweighted, [a, b, c, d], Array(%id = 18446744078203540534), `GRAPHLN/tab...
 

GraphTheory:-DrawGraph(PG, size = [200, 200]);  

Plot_2d
 

Similarly, if e is a Boolean expression in CNF, the incidence graph of e is a bipartite graph whose vertices correspond to the variables and clauses of e.  Edges in the graph consist of pairs (v,c) where v is a variable and c is a clause, and clause c contains v in negated or non-negated form. 

In the example seen earlier, the vertex Clause 1 shares edges with variables a, b, and d because each of these appears in the first clause of expr, but does not share an edge with c as it does not appear in this clause. 

IG := Logic:-IncidenceGraph(expr);  

Typesetting:-mprintslash([IG := `Graph 2: an undirected unweighted graph with 7 vertices and 9 edge(s)`], [GRAPHLN(undirected, unweighted, [a, b, c, d,
 

GraphTheory:-DrawGraph(IG, size = [350, 300]);  

Plot_2d
 

Symmetry group 

The new SymmetryGroup command returns a Group object describing the group of symmetries of a logical expression. 

Let e be a logical expression with variables v__1, () .. (), v__k; .  A symmetry is an f; which maps each variable v__i; to either v__j; or not v__j; for some j; , while preserving the structure of e.  Symmetry detection is an important problem in the simplification of logical expressions and especially in determining satisfiability, as a straightforward effort to find solutions for a highly symmetric expression could waste resources exploring paths which are the symmetric analogues of paths already visited. 

In this example, we can see that the symmetry group of this logical expression has order 2: 

expr := `and`(`and`(`or`(`or`(not a, b), not d), `or`(`or`(not b, c), not d)), `or`(`or`(b, not c), d)); -1 

SG := SymmetryGroup(expr);  

Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mi(
 

GroupTheory:-GroupOrder(SG);  

2
 

The generators of the symmetry group correspond to variables and clauses of the input expression. If we wish to see the correspondence, we can request both the group and the expressions using the output option: 

SymmetryGroup(expr, output = [expressions, group]);  

Typesetting:-mprintslash([[a, b, c, d, Logic:-`¬`(a), Logic:-`¬`(b), Logic:-`¬`(c), Logic:-`¬`(d), Logic:-`&or`(Logic:-`¬`(a), b, Logic:-`¬`(d)), Logic:-`&or`(Logic:-`¬`(b), c, Lo...
 

Examining the above output and comparing the elements of the first list with the generators of the symmetry group, we can see that the symmetry discovered here is the one which leaves variable a; unchanged but which maps b, c, d; to not d, not c, not b; . 

 

NumberTheory:-JordanTotient 

The new JordanTotient command in the NumberTheory package computes the k; th Jordan totient of a positive integer n; , defined as the number of k; -tuples a[1], () .. (), a[k]; of positive integers such that the greatest common divisor gcd(a[1], () .. (), a[k], n); is equal to 1; .  This generalizes the Euler totient, which is the special case in which k = 1; . 

 

> with( NumberTheory ):
 

> seq( Totient( n ) = JordanTotient( 1, n ), n = 1 .. 10 );
 

1 = 1, 1 = 1, 2 = 2, 2 = 2, 4 = 4, 2 = 2, 6 = 6, 4 = 4, 6 = 6, 4 = 4
 

> seq( JordanTotient( 2, n ), n = 1 ..10 );
 

1, 3, 8, 12, 24, 24, 48, 48, 72, 72
 

> Matrix( 10, 10, JordanTotient );
 

rtable(1 .. 10, 1 .. 10, [[1, 1, 2, 2, 4, 2, 6, 4, 6, 4], [1, 3, 8, 12, 24, 24, 48, 48, 72, 72], [1, 7, 26, 56, 124, 182, 342, 448, 702, 868], [1, 15, 80, 240, 624, 1200, 2400, 3840, 6480, 9360], [1, ...
 

 

Parametric limits 

The limit command has a new option parametric. If specified, limit will attempt to return a (piecewise) answer that is correct for all real parameter values. 

> limit(`^`(x, a), x = infinity);
 

limit(`^`(x, a), x = infinity)
 

> limit(`^`(x, a), x = infinity, 'parametric');
 

Typesetting:-mprintslash([PIECEWISE([0, `<`(a, 0)], [1, a = 0], [infinity, `<`(0, a)], [Limit(`^`(x, a), x = infinity), otherwise])], [piecewise(`<`(a, 0), 0, a = 0, 1, `<`(0, a), infinity, Limit(`^`(...
 

Simplification 

abs, csgn, signum, and sqrt have improved normalization and simplification: 

> restart; 1
 

> `+`(abs(`*`(t, `*`(`+`(x, `-`(1))))), `-`(abs(`*`(t, `*`(`+`(1, `-`(x)))))));
 

0
 

> `+`(csgn(`*`(`^`(`+`(x, `-`(y)), 2))), `-`(csgn(`*`(`^`(`+`(y, `-`(x)), 2)))));
 

0
 

> abs(`/`(1, `*`(x, `*`(y))));
 

`/`(1, `*`(abs(`*`(x, `*`(y)))))
 

> signum(`/`(1, `*`(x, `*`(y))));
 

`/`(1, `*`(signum(`*`(x, `*`(y)))))
 

> `assuming`([sqrt(`*`(`^`(a, 2)))], [`<`(0, Re(a))]);
 

a
 

> `assuming`([sqrt(`*`(`^`(a, 2)))], [`<`(Re(a), 0)]);
 

`+`(`-`(a))
 

radnormal is now more careful at simplifying expressions containing roots of negative numbers: 

> radnormal(`+`(`-`(sqrt(`+`(`-`(`/`(`*`(2, `*`(`+`(`*`(sqrt(`+`(`-`(5), `*`(10, `*`(I)))), `*`(sqrt(`+`(`-`(5), `-`(`*`(10, `*`(I))))))), `-`(5)))), `*`(`^`(`+`(sqrt(`+`(`-`(5), `*`(10, `*`(I)))), `-`(...
 

`+`(`-`(`/`(`*`(`+`(I), `*`(`+`(`*`(`^`(`+`(`-`(5), `*`(10, `*`(I))), `/`(1, 2))), `*`(`^`(`+`(`-`(5), `-`(`*`(10, `*`(I)))), `/`(1, 2)))))), `*`(`+`(`*`(`^`(`+`(`-`(5), `*`(10, `*`(I))), `/`(1, 2))),...
 

simplify is more careful not to expand powers, avoiding large expressions: 

> simplify(`*`(`^`(`+`(cos(`+`(`*`(`/`(1, 60), `*`(Pi)))), `*`(I, `*`(sin(`+`(`*`(`/`(1, 60), `*`(Pi))))))), 20)));
 

`+`(`/`(1, 2), `*`(`*`(`/`(1, 2), `*`(I)), `*`(`^`(3, `/`(1, 2)))))
 

There have been some improvements in simplification of special functions: 

> simplify(`*`(`^`(WeierstrassP(t, 0, 1), 3), `*`(WeierstrassPPrime(t, 0, 1))));
 

`+`(`*`(`/`(1, 4), `*`(`^`(WeierstrassPPrime(t, 0, 1), 3))), `*`(`/`(1, 4), `*`(WeierstrassPPrime(t, 0, 1))))
 

> `assuming`([simplify(`+`(`-`(ln(`+`(`-`(`/`(1, `*`(LambertW(z))))))), LambertW(z)), LambertW)], [Not(`<`(0, LambertW(z)))]);
 

ln(`+`(`-`(z)))
 

This sum can now be evaluated to a float due to an improvement in simplification of Psi of large integers: 

> evalf(sum(`+`(`/`(`*`(1.), `*`(k))), k = 1 .. 4730400000000000000000000));
 

57.39326766
 

Trig simplifications have been improved: 

> simplify(`*`(`+`(cos(`+`(`*`(`/`(1, 12), `*`(Pi)))), `-`(sin(`+`(`*`(`/`(1, 12), `*`(Pi)))))), `*`(`+`(`*`(`^`(sin(4), 2)), `*`(`^`(cos(4), 2))), `*`(`+`(`*`(`^`(-1, `/`(1, 5)), `*`(sqrt(3))), `-`(`*`...
 

`+`(`*`(`/`(1, 2), `*`(t, `*`(`^`(6, `/`(1, 2))))))
 

Some improvements in simplification of piecewise functions: 

> simplify(piecewise(`<`(x, 0), `+`(`*`(`/`(1, 4), `*`(`^`(floor(x), 2))), `*`(`/`(1, 4), `*`(floor(x))), `-`(`*`(`/`(1, 2), `*`(sum(`*`(n, `*`(signum(`+`(n, `/`(1, 2))))), n = `+`(floor(x), 1) .. 0))))...
 

0
 

> `assuming`([simplify(`*`(g, `*`(`+`(`-`(`*`(`^`(c, 2), `*`(piecewise(`<`(x, `*`(c, `*`(t))), 0, x = `*`(c, `*`(t)), undefined, `<`(`*`(c, `*`(t)), x), 2)))), piecewise(`<`(t, `/`(`*`(x), `*`(c))), `+`...
 

0
 

> simplify(`/`(`*`(piecewise(mu = 0, `/`(`*`(Dirac(t)), `*`(sqrt(t))), `/`(`*`(sqrt(t)), `*`(mu)))), `*`(sqrt(t))));
 

Typesetting:-mprintslash([PIECEWISE([`/`(`*`(Dirac(t)), `*`(t)), mu = 0], [`/`(1, `*`(mu)), otherwise])], [piecewise(mu = 0, `/`(`*`(Dirac(t)), `*`(t)), `/`(1, `*`(mu)))])
 

simplify can now recognize that the following expressions are 0: 

> simplify(`+`(`*`(`/`(1, 10), `*`(`+`(`-`(`*`(20, `*`(ln(3)))), `*`(20, `*`(ln(2))), `*`(20, `*`(ln(5))), `-`(`*`(10, `*`(ln(`+`(9, `*`(80, `*`(exp(-1)))))))), `*`(10, `*`(ln(`+`(1, `*`(8, `*`(exp(-1))...
simplify(`+`(`*`(`/`(1, 10), `*`(`+`(`-`(`*`(20, `*`(ln(3)))), `*`(20, `*`(ln(2))), `*`(20, `*`(ln(5))), `-`(`*`(10, `*`(ln(`+`(9, `*`(80, `*`(exp(-1)))))))), `*`(10, `*`(ln(`+`(1, `*`(8, `*`(exp(-1))...
 

0
 

> simplify(`+`(`*`(`+`(`*`(I, `*`(sqrt(n), `*`(sqrt(`+`(n, 1))))), `-`(`/`(1, 2))), `*`(exp(`+`(`*`(`/`(1, 6), `*`(Pi, `*`(`+`(`*`(`*`(8, `*`(I)), `*`(sqrt(n), `*`(sqrt(`+`(n, 1)), `*`(t)))), `-`(`*`(`+...
simplify(`+`(`*`(`+`(`*`(I, `*`(sqrt(n), `*`(sqrt(`+`(n, 1))))), `-`(`/`(1, 2))), `*`(exp(`+`(`*`(`/`(1, 6), `*`(Pi, `*`(`+`(`*`(`*`(8, `*`(I)), `*`(sqrt(n), `*`(sqrt(`+`(n, 1)), `*`(t)))), `-`(`*`(`+...
simplify(`+`(`*`(`+`(`*`(I, `*`(sqrt(n), `*`(sqrt(`+`(n, 1))))), `-`(`/`(1, 2))), `*`(exp(`+`(`*`(`/`(1, 6), `*`(Pi, `*`(`+`(`*`(`*`(8, `*`(I)), `*`(sqrt(n), `*`(sqrt(`+`(n, 1)), `*`(t)))), `-`(`*`(`+...
 

0
 

Combining expressions with trig functions is now more efficient in many cases: 

> combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
combine(`+`(`-`(`*`(2, `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 10)), 2)), `-`(`*`(`^`(cos(`/`(1, 10)), 2))), 1), 4), `*`(`^`(`+`(`*`(`^`(sin(`/`(1, 5)), 2)), `-`(`*`(`^`(cos(`/`(1, 5)), 2))), 1), 8), `*`(`^`(`...
 

`+`(`*`(`/`(1, 32), `*`(`+`(cos(`/`(4, 5)), `*`(28, `*`(cos(`/`(2, 5)))), 35, `-`(`*`(8, `*`(cos(`/`(3, 5))))), `-`(`*`(56, `*`(cos(`/`(1, 5)))))), `*`(`^`(`+`(cos(`/`(2, 5)), `-`(1)), 8), `*`(`^`(`+`...
`+`(`*`(`/`(1, 32), `*`(`+`(cos(`/`(4, 5)), `*`(28, `*`(cos(`/`(2, 5)))), 35, `-`(`*`(8, `*`(cos(`/`(3, 5))))), `-`(`*`(56, `*`(cos(`/`(1, 5)))))), `*`(`^`(`+`(cos(`/`(2, 5)), `-`(1)), 8), `*`(`^`(`+`...
`+`(`*`(`/`(1, 32), `*`(`+`(cos(`/`(4, 5)), `*`(28, `*`(cos(`/`(2, 5)))), 35, `-`(`*`(8, `*`(cos(`/`(3, 5))))), `-`(`*`(56, `*`(cos(`/`(1, 5)))))), `*`(`^`(`+`(cos(`/`(2, 5)), `-`(1)), 8), `*`(`^`(`+`...
 

Miscellaneous 

Some other miscellaneous improvements: 

> series(tan(series(sqrt(csgn(BesselY(2, `+`(`*`(`^`(x, 2)), `-`(1))))), x)), x);
 

series(`+`(tan(`*`(`^`(csgn(BesselY(2, `+`(`*`(`^`(x, 2)), `-`(1)))), `/`(1, 2))))),x)
 

> `assuming`([signum(`+`(`*`(`^`(RootOf(`+`(`*`(1024, `*`(`^`(_Z, 19))), `*`(1216, `*`(`^`(_Z, 13))), `-`(`*`(1691, `*`(`^`(_Z, 7)))), `-`(`*`(54, `*`(_Z)))), -.9720806486), 2)), `-`(`*`(3, `*`(`^`(Root...
`assuming`([signum(`+`(`*`(`^`(RootOf(`+`(`*`(1024, `*`(`^`(_Z, 19))), `*`(1216, `*`(`^`(_Z, 13))), `-`(`*`(1691, `*`(`^`(_Z, 7)))), `-`(`*`(54, `*`(_Z)))), -.9720806486), 2)), `-`(`*`(3, `*`(`^`(Root...
 

1
 

evalrC has been improved. The output means that abs(1/xy) can take values in the interval from 0+0*I to infinity+0*I. 

> evalrC(abs(`/`(1, `*`(xy))));
 

INTERVAL(0, 0, infinity, 0)
 

This result from isolate is now correctly expressed in terms of a RootOf: 

> isolate(`+`(1, `-`(`/`(`*`(f), `*`(`^`(`+`(sqrt(g), 1), 2))))) = q, sqrt(g));
 

`*`(`^`(g, `/`(1, 2))) = `+`(RootOf(`+`(f, `*`(`+`(q, `-`(1)), `*`(`^`(_Z, 2))))), `-`(1))
 

frontend is now more careful when recursing: 

> frontend(proc (z) sign(normal(`*`(I, `*`(z)))) end proc, [`*`(I, `*`(y))]);
 

-1