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 are now also returned because together with the other assumption they provide extra information about , namely that is real and greater than 0. These facts cannot be inferred from the assumption alone.

> |

> |

assume can now handle generic Or-type assumptions

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

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

> |

> |

> |

> |

**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.

> |

> |

> |

> |

> |

Triangle Inequality:

> |

Other new results from **is** and **coulditbe**

> |

> |

> |

> |

> |

> |

> |

> |

> |

> |

> |

> |

> |

> |

> |

> |

> |

> |

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

> |

about

This result from **about** is now simpler:

> |

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

Maple can now compute asymptotic expansions for various mathematical functions of type with rational parameter values.

> |

> |

> |

**ComputationalGeometry:-PointInPolygon**

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

> |

> |

> |

> |

> |

> |

> |

- 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).

The new command **evala/Minpoly** computes the minimal polynomial of

> |

> |

> |

> |

> |

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

> |

> |

**Integration**

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

> |

> |

> |

> |

> |

> |

> |

> |

> |

Maple now performs this change of variables correctly.

> |

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

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 or unevaluated:

> |

> |

> |

> |

> |

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.

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.

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 . A **symmetry** is an * *which maps each variable to either or for some , 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:

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:

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 unchanged but which maps to .

**NumberTheory:-JordanTotient**

The new **JordanTotient** command in the **NumberTheory** package computes the th Jordan totient of a positive integer , defined as the number of -tuples of positive integers such that the greatest common divisor is equal to . This generalizes the Euler totient, which is the special case in which .

> |
with( NumberTheory ): |

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

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

> |
Matrix( 10, 10, JordanTotient ); |

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.

> |

> |

**Simplification**

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

> |

> |

> |

> |

> |

> |

> |

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

> |

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

> |

There have been some improvements in simplification of special functions:

> |

> |

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

> |

Trig simplifications have been improved:

> |

Some improvements in simplification of piecewise functions:

> |

> |

> |

**simplify** can now recognize that the following expressions are 0:

> |

> |

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

> |

**Miscellaneous**

Some other miscellaneous improvements:

> |

> |

**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.

> |

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

> |

**frontend** is now more careful when recursing:

> |