Advanced Math - Maple Help
For the best experience, we recommend viewing online help using Google Chrome or Microsoft Edge.

Online Help

All Products    Maple    MapleSim


Advanced Math Improvements in Maple 2023

Maple 2023 includes many improvements to the math engine.  In addition to those described on this page, Maple 2023 includes a new package for Quantifier Elimination and updates to the Graph Theory package.

 

Better answers for indefinite integrals of algebraic functions

Enhanced 'method' option for indefinite integrals

Better assumption support of MeijerG integrals

Support in solve for element-wise equations of rtables

Polyhedral sets

New support for Z-polyhedral sets

Improvements to parametric limits on branch cuts

New certified univariate complex solver

New method option for fsolve, for a univariate polynomial

New method option for fsolve, for a univariate non-polynomial equation

New support for lazy multivariate Puiseux series

Better answers for indefinite integrals of algebraic functions

• 

The int command now uses Blake's heuristic to look for substitutions to find elementary forms for certain algebraic integrands. Blake's method works by considering algebraic function integrands of the form pxrxnmqx and then searching for substitutions (by solving systems of linear equations) that can put the integral into a simpler form, e.g. pxrxnmqxⅆx=vuau+bmwuⅆu, for which compact elementary answers can often be easily computed.

• 

Blake's heuristic has been available since Maple 2022 via the option method=pseudoelliptic but it is now tied directly into the default methods for computing integrals of algebraic functions.

Examples

• 

The following examples produced a very complicated expression in earlier versions of Maple, but now produce a simple, elementary answer.

• 

This is an example where in Maple 2022 the default answer comes from the elliptic integration method, and the answer is in terms of elliptic functions and is quite long.

intx32sqrtx31x3+1x3+x2+1,x,method=elliptic

2I3Ix12I323x+132+I32−Ix12+I323EllipticF3Ix12I3233,I332+I323x31+I2_α=RootOf_Z3+_Z2+1_αI21+2xI3x+13+I3I2I3+2x1_α2+3+I3_α22_α1EllipticPi3Ix12I3233,3_α22+3_αI_α232+32+3I32,I332+I32x31

(1)
• 

In Maple 2023 the answer is elementary and compact.

intx32sqrtx31x3+1x3+x2+1,x

2arctanhx31x

(2)
• 

In Maple 2022 the following integral produced an answer in terms of elliptic functions and RootOfs of length 790119, but now the answer is elementary and very compact.

intx4+x3+1sqrtx42x3+1x4+2x31x4+2x3+x21,x

arctanhx42x3+1x

(3)
• 

Finally, here is a fairly long integral with a compact new answer in Maple 2023. method=elliptic shows the answer previously returned in Maple 2022.

intx3+2112x64x5+3x4224x3+4x2+1122x3+x2212x416x68x5x432x3+8x2+16,x

9542x3+x2228x3+53x228622285+x3arctanh22x3+x22x6222124956+22arctanh22x3+x22x6+22x36222+1249586226+22x3

(4)

intx3+2112x64x5+3x4224x3+4x2+1122x3+x2212x416x68x5x432x3+8x2+16,x,method=elliptic

142x3+x223x3+532x3+x226x+142x3+x223+31I3107+631813616107+631813−Ix+107+63181312+112107+631813+16+I3107+631813616107+63181323107+631813616107+631813x107+631813616107+631813+16107+631813414107+631813I3107+631813616107+6318132Ix+107+63181312+112107+631813+16I3107+631813616107+63181323107+631813616107+631813EllipticF3−Ix+107+63181312+112107+631813+16+I3107+631813616107+63181323107+631813616107+6318133,−I3107+631813616107+631813107+631813414107+631813I3107+631813616107+631813262x3+x22+I2_α=RootOf16_Z68_Z5_Z432_Z3+8_Z2+16_α1520_α4760_α395_α21520_α+876107+6318131107+631813I22+12x+107+631813+1107+631813+I3107+6318131107+631813107+6318131107+6318131+6x107+6318131107+6318133107+6318133107+631813I3107+6318131107+631813I22+12x+107+631813+1107+631813I3107+6318131107+631813107+6318131107+631813320+64_α5+352_α468_α3+149I3_α3107+6310613+642I3107+6310613_α2+963I106107+6310623_α299I106107+6310613_α25730I3107+6310623_α2+66I3107+6310623_α592I3_α5107+6310613+8I3_α4107+6310613528I106_α3107+6310623+144I106_α4107+631062330I106_α3107+6310613+3137I3_α3107+6310623856I3_α4107+6310623384I106_α5107+6310623+96I106_α5107+6310613+2288I3_α5107+631062312I106107+6310623_α96I106_α107+6310613+570I3_α107+631061376I3107+63106133316I3107+6310623+558I106107+6310623+18I106107+6310613+61063107+63106131861063107+6310623216_α276107+6310613+3316107+63106233137_α3107+6310623+149_α3107+6310613+856_α4107+6310623+8_α4107+63106132288_α5107+6310623592_α5107+6310613+5730107+6310623_α266107+6310623_α+642107+6310613_α2+570_α107+6310613+128_α51063107+6310623+32_α51063107+6310613+176_α31063107+631062310_α31063107+631061348_α43107+631062310632106_α3107+6310613+4_α1063107+631062333_α21063107+6310613321_α2107+63106231063360_αEllipticPi3−Ix+107+63181312+112107+631813+16+I3107+631813616107+63181323107+631813616107+6318133,I1062811I_α2106565I_α310684+4I_α5106214I_α10621+74_α521_α421149_α3168311063107+631061356+1063107+631062356+101I3107+631061328949I3107+631062328+319I107+63106231065631I107+631061310656+1942107_α228+829107+63106138419107+631062384+149_α3107+63106233363137_α3107+6310613336+_α4107+631062342+107_α4107+63106134237_α5107+631062321143_α5107+631061321+107107+6310623_α256+95107+6310623_α56+955107+6310613_α25611_α107+631061356_α41063107+63106137341I_α33107+6310613112+991I_α23107+6310613168+443I107+6310623_α2106112107I107+6310613_α21061123959I107+6310623_α231686515I_α107+631062331687I_α53107+63106133+I_α43107+63106132+209I_α3107+631062310616844I_α4107+63106231067+11I_α3107+631061310621825I_α3107+63106233112+523I_α4107+631062331426I_α5107+631062310621+8I_α5107+631061310621+155I_α5107+6310623321+137I_α107+631062310621+I_α107+631061310684+7I_α3107+631061324I107+6310613_α41067+2_α51063107+631062321+8_α51063107+6310613215_α31063107+6310623168+11_α31063107+631061321+106_α3107+6310613842_α1063107+631062321107_α21063107+631061311211_α2107+6310623106311295_α28,−I3107+631813616107+631813107+631813414107+631813I3107+631813616107+63181322x3+x2264512

(5)

Enhanced 'method' option for indefinite integrals

• 

The int command now exposes more internal routines for indefinite integration through the method option.  It is now possible to directly call the integration by parts routine Parts and a parallel version of the Risch algorithm ParallelRisch.

int(ln(exp(x)),x,method=parallelrisch);

x22+xlnⅇx

(6)

int(4*x^2*arcsinh(x),x,method=parts);

4x3arcsinhx34x2x2+19+8x2+19

(7)

Better assumption support of MeijerG integrals

• 

The definite integration method that works via MeijerG convolutions now does a better job of checking conditions on parameters so that they are only applied under proper assumptions. As well, the methods will prompt via warning when the method could have produced an answer using additional assumptions.

int( x*exp(-a*x^3 - b*x), x=0..infinity );

Warning, not enough assumptions for a closed form integral: a MeijerG transformation may be possible with additional assumptions: a <> 0, 0 <= Re(a), b <> 0, 0 <= Re(b)

0x&ExponentialE;ax3bx&DifferentialD;x

(8)

assume(a::real, b::real);

int( x*exp(-a*x^3 - b*x), x=0..infinity );

Warning, not enough assumptions for a closed form integral: a MeijerG transformation may be possible with additional assumptions: 0 < a, 0 < b

0x&ExponentialE;a~x3b~x&DifferentialD;x

(9)

assume(c>0, d>0);

int( x*exp(-c*x^3 - d*x), x=0..infinity );

d~d~32c~131+LommelS21&comma;23&comma;2d~3239c~3c~56

(10)

restart:

Support in solve for element-wise equations of rtables

• 

The solve command can now directly accept element-wise relations between vectors and matrices. Inputs of the form M, M=c, or M=N are transformed into a list of scalar equations (where M and N are rtables of the same dimensions and c is any scalar, and instead of = any binary relation of type,relation can be used).

solve( (<<x+1|y+1>,<z+2|w+2>>) = 1 );

w=−1&comma;x=0&comma;y=0&comma;z=−1

(11)
• 

With no relations, a right-hand side of 0 is assumed

solve( (<<x+1|y+1>,<z+2|w+2>>) );

w=−2&comma;x=−1&comma;y=−1&comma;z=−2

(12)

solve( (<<x+1|y+1>,<z+2|w+2>>) = (<<1|1>,<2|2>>) );

w=0&comma;x=0&comma;y=0&comma;z=0

(13)

solve( (<<x+1|y+1>,<z+2|w+2>>) < (<<1|1>,<2|2>>) );

w<0&comma;x<0&comma;y<0&comma;z<0

(14)
• 

While it is now possible to solve linear equations this way, it is advisable to use LinearAlgebra:-LinearSolve instead.

n := 200:

M := LinearAlgebra:-RandomMatrix(n):

b := LinearAlgebra:-RandomVector(n):

v := Vector( [ seq(cat(`v__`,i), i=1..n)]):

CodeTools:-Usage( eval(v, solve( M.v = b )) ):

memory used=105.39MiB, alloc change=-0.93MiB, cpu time=1.89s, real time=1.80s, gc time=218.20ms

CodeTools:-Usage( LinearAlgebra:-LinearSolve(M, b) ):

memory used=54.48MiB, alloc change=4.65MiB, cpu time=1.08s, real time=1.00s, gc time=169.78ms

Polyhedral sets

• 

The IntegerHull command in the PolyhedralSets package has been extended to support higher dimensional polyhedral sets, both bounded and unbounded ones.

• 

The following example is an unbounded three-dimensional set.

with(PolyhedralSets):

ineqs := [-x[1] - 132/205*x[2] - 62/205*x[3] <= -1358/123,
          -x[1] + x[2] + x[3] <= 1405/17,
          x[1] - 6/59*x[2] + 83/177*x[3] <= 3500/59];

ineqsx1132x220562x32051358123&comma;x1+x2+x3140517&comma;x16x259+83x3177350059

(15)

poly := PolyhedralSet(ineqs, [x[1], x[2], x[3]]);

poly&lcub;Coordinates&colon;x1&comma;x2&comma;x3Relations&colon;x1132x220562x32051358123&comma;x1+x2+x3140517&comma;x16x259+83x3177350059

(16)

IsBounded(poly);

false

(17)

IntegerHull(poly);

−20&comma;36&comma;26&comma;−4&comma;−25&comma;103&comma;−2&comma;−30&comma;107&comma;−1&comma;−36&comma;117&comma;0&comma;−38&comma;118&comma;0&comma;−36&comma;118&comma;1&comma;−37&comma;112&comma;1&comma;−34&comma;117&comma;2&comma;−39&comma;113&comma;2&comma;−38&comma;114&comma;10&comma;−43&comma;95&comma;26&comma;−51&comma;60&comma;399&comma;−238&comma;−776&comma;403&comma;−240&comma;−785&comma;453&comma;−265&comma;−897&comma;1544&comma;−811&comma;−3342&comma;101&comma;260&comma;−159&comma;12072&comma;−6041&comma;−27054&comma;−70&comma;267&comma;−337

(18)
• 

A bounded four-dimensional example.

vertices := [[10, 10, 10, 10/3],
             [-140/8, -220/12, -10, -10/3],
             [60/8, 20, -100/12, -70/3],
             [-10/4, -100/12, 70/2, 35/3],
             [0, 0, 0, 50/3]];

vertices10&comma;10&comma;10&comma;103&comma;352&comma;553&comma;−10&comma;103&comma;152&comma;20&comma;253&comma;703&comma;52&comma;253&comma;35&comma;353&comma;0&comma;0&comma;0&comma;503

(19)

vars := [x[1], x[2], x[3], x[4]]:

poly := PolyhedralSet(vertices, [], vars);

poly&lcub;Coordinates&colon;x1&comma;x2&comma;x3&comma;x4Relations&colon;x1+503x2694+85x3694+311x4208277753123&comma;x1+2715x22234+603x32234+813x4223467751117&comma;x175x28659x34303x4430543&comma;x175x286+3x331821341x43182543&comma;x1123x2185153x337087x41480145148

(20)

IsBounded(poly);

true

(21)

IntegerHull(poly);

−15&comma;−16&comma;−6&comma;−2&comma;−15&comma;−15&comma;−9&comma;−4&comma;−14&comma;−15&comma;−4&comma;−1&comma;−13&comma;−13&comma;−8&comma;−1&comma;−13&comma;−12&comma;−9&comma;−5&comma;−12&comma;−13&comma;−4&comma;1&comma;−12&comma;−13&comma;−4&comma;2&comma;−12&comma;−12&comma;−3&comma;−3&comma;−11&comma;−12&comma;−3&comma;−1&comma;−11&comma;−11&comma;−6&comma;−3&comma;−11&comma;−11&comma;−1&comma;−3&comma;−10&comma;−8&comma;−8&comma;−5&comma;−9&comma;−6&comma;−8&comma;−8&comma;−7&comma;−7&comma;−4&comma;7&comma;−7&comma;−6&comma;−5&comma;3&comma;−7&comma;−3&comma;−8&comma;−10&comma;−7&comma;−3&comma;−7&comma;−10&comma;−6&comma;−4&comma;−5&comma;0&comma;−5&comma;−9&comma;23&comma;8&comma;−5&comma;−4&comma;−4&comma;5&comma;−5&comma;−4&comma;−3&comma;−2&comma;−4&comma;−5&comma;3&comma;10&comma;−4&comma;−5&comma;3&comma;11&comma;−4&comma;−3&comma;−2&comma;−3&comma;−4&comma;0&comma;−6&comma;−9&comma;−3&comma;−8&comma;30&comma;10&comma;−3&comma;−7&comma;23&comma;10&comma;−3&comma;−7&comma;23&comma;11&comma;−3&comma;−6&comma;24&comma;6&comma;−3&comma;3&comma;−8&comma;−12&comma;−3&comma;3&comma;−7&comma;−13&comma;−2&comma;−7&comma;31&comma;11&comma;−2&comma;−6&comma;24&comma;8&comma;−2&comma;−6&comma;24&comma;12&comma;−2&comma;−6&comma;26&comma;11&comma;−2&comma;−5&comma;25&comma;7&comma;−2&comma;−5&comma;26&comma;6&comma;−2&comma;−2&comma;−1&comma;13&comma;−2&comma;−1&comma;−1&comma;1&comma;−2&comma;3&comma;−4&comma;−8&comma;−1&comma;−5&comma;25&comma;12&comma;−1&comma;−5&comma;29&comma;9&comma;−1&comma;−4&comma;19&comma;13&comma;−1&comma;−4&comma;27&comma;7&comma;−1&comma;−3&comma;12&comma;13&comma;−1&comma;−3&comma;12&comma;14&comma;−1&comma;−1&comma;1&comma;14&comma;−1&comma;−1&comma;2&comma;0&comma;−1&comma;1&comma;11&comma;−4&comma;0&comma;−2&comma;22&comma;7&comma;0&comma;−1&comma;8&comma;14&comma;0&comma;−1&comma;20&comma;5&comma;0&comma;0&comma;1&comma;15&comma;0&comma;0&comma;2&comma;15&comma;0&comma;0&comma;13&comma;6&comma;0&comma;3&comma;−3&comma;4&comma;0&comma;8&comma;−8&comma;−16&comma;1&comma;−3&comma;27&comma;9&comma;1&comma;−2&comma;23&comma;9&comma;1&comma;0&comma;8&comma;3&comma;1&comma;0&comma;22&comma;3&comma;1&comma;2&comma;0&comma;12&comma;1&comma;2&comma;5&comma;9&comma;1&comma;2&comma;9&comma;6&comma;1&comma;3&comma;−1&comma;9&comma;1&comma;5&comma;5&comma;−5&comma;1&comma;8&comma;−3&comma;−13&comma;2&comma;1&comma;9&comma;3&comma;2&comma;1&comma;21&comma;3&comma;2&comma;2&comma;2&comma;14&comma;2&comma;2&comma;4&comma;1&comma;2&comma;5&comma;7&comma;0&comma;2&comma;5&comma;13&comma;−5&comma;2&comma;10&comma;−7&comma;−13&comma;2&comma;11&comma;−8&comma;−17&comma;3&comma;7&comma;−2&comma;3&comma;3&comma;7&comma;10&comma;−6&comma;3&comma;7&comma;11&comma;−7&comma;3&comma;8&comma;−3&comma;0&comma;3&comma;8&comma;6&comma;−7&comma;3&comma;11&comma;−2&comma;−15&comma;4&comma;2&comma;17&comma;6&comma;4&comma;8&comma;8&comma;−5&comma;4&comma;9&comma;−2&comma;−3&comma;4&comma;10&comma;−1&comma;−5&comma;4&comma;10&comma;3&comma;−8&comma;4&comma;11&comma;−3&comma;−13&comma;4&comma;11&comma;−2&comma;−13&comma;4&comma;12&comma;−5&comma;−15&comma;4&comma;12&comma;0&comma;−15&comma;4&comma;14&comma;−7&comma;−19&comma;5&comma;3&comma;18&comma;6&comma;5&comma;3&comma;18&comma;7&comma;5&comma;3&comma;19&comma;6&comma;5&comma;5&comma;6&comma;3&comma;5&comma;13&comma;−5&comma;−10&comma;5&comma;13&comma;1&comma;−14&comma;5&comma;14&comma;−6&comma;−13&comma;5&comma;15&comma;−7&comma;−18&comma;5&comma;15&comma;−7&comma;−17&comma;6&comma;9&comma;3&comma;−4&comma;6&comma;15&comma;−4&comma;−14&comma;6&comma;16&comma;−6&comma;−16&comma;6&comma;17&comma;−7&comma;−20&comma;7&comma;6&comma;14&comma;5&comma;7&comma;12&comma;1&comma;−7&comma;7&comma;13&comma;0&comma;−10&comma;7&comma;13&comma;2&comma;−9&comma;7&comma;13&comma;3&comma;−10&comma;7&comma;15&comma;−3&comma;−12&comma;7&comma;16&comma;−4&comma;−16&comma;7&comma;17&comma;−4&comma;−18&comma;7&comma;18&comma;−6&comma;−20&comma;8&comma;8&comma;8&comma;6&comma;8&comma;8&comma;9&comma;3&comma;8&comma;8&comma;12&comma;3&comma;8&comma;12&comma;3&comma;−4&comma;9&comma;10&comma;8&comma;1&comma;9&comma;10&comma;8&comma;2&comma;9&comma;10&comma;9&comma;1&comma;9&comma;13&comma;4&comma;−5&comma;

(22)

New support for Z-polyhedral sets

• 

The ZPolyhedralSets subpackage is new in Maple 2023. It is part of the PolyhedralSets package and deals with Z-polyhedral sets. A Z-polyhedral set is the intersection of a polyhedral set with an integer lattice.

with(PolyhedralSets): with(ZPolyhedralSets):

• 

Here is a three-dimensional polyhedral set.

ineqs := [0 <= -16 + 2*y + z, 0 <= -72 + 4*x + 4*y + 3*z, 0 <= 2*y - z, 0 <= -24 + 4*x + 4*y - 3*z, 0 <= -4*x + 4*y + 3*z, 0 <= 48 - 4*x + 4*y - 3*z, 0 <= 48 - 4*x - 4*y + 3*z, 0 <= 8 - 2*y + z, 0 <= -24 + 4*x - 4*y + 3*z, 0 <= 24 - 2*y - z, 0 <= 24 + 4*x - 4*y - 3*z, 0 <= 96 - 4*x - 4*y - 3*z]:

ps := PolyhedralSet(ineqs):

Plot(ps);

• 

Now we define the Z-polyhedral set of all integer lattice points in ps.

psz := ZPolyhedralSet(ineqs, [x, y, z]):

PlotIntegerPoints3d(psz);

Improvements to parametric limits on branch cuts

• 

The option parametric to the limit command has been extended to handle more cases where the expansion point may lie on the branch cut of a mathematical function for some real parameter values. Examples:

unassign('a'):

limit(ln(a+I*x), x=0, 'right', 'parametric');

lna+Iπa<0a=0lna0<alimx0+lna+Ixa0

(23)

limit(arccoth(a+I*x), x=0, 'right', 'parametric');

arccothaa<−1a=−1arctanhaIπ2a<1a=1arccotha1<alimx0+arccotha+Ixa0

(24)

limit(Li(a+I*x), x=0, 'right', 'parametric');

Eilna+Iπa<0Iπa=0Iπ+Eilnaa<1a=1Eilna1<alimx0+Lia+Ixa0

(25)

New certified univariate complex solver

• 

A new, faster method for isolating the complex roots of a univariate polynomial with complex(numeric) coefficients has been added to the RootFinding:-Isolate command. It is accessible through the option complex or method=HR and supports most of the existing options of RootFinding:-Isolate, as well as a new option domain for limiting the search space. See the corresponding help page for more details. Examples:

with(RootFinding):

Isolate(x^6-1, x, 'complex');

x=−1.&comma;x=1.&comma;x=0.5000000000+0.8660254038I&comma;x=0.50000000000.8660254038I&comma;x=−0.5000000000+0.8660254038I&comma;x=−0.50000000000.8660254038I

(26)

Isolate(x^2-I, x, 'complex', 'output=interval');

x=8548396450010082566043051208925819614629174706176+854839645001008256604305I1208925819614629174706176&comma;8548396450010102904031831208925819614629174706176+854839645001010290403183I1208925819614629174706176&comma;x=8548396450010102904031831208925819614629174706176854839645001010290403183I1208925819614629174706176&comma;8548396450010082566043051208925819614629174706176854839645001008256604305I1208925819614629174706176

(27)

Isolate(x^2-I, x, 'complex', 'digits'=100);

x=0.7071067811865475244008443621048490392848359376884740365883398689953662392310535194251937671638207864+0.7071067811865475244008443621048490392848359376884740365883398689953662392310535194251937671638207864I&comma;x=−0.70710678118654752440084436210484903928483593768847403658833986899536623923105351942519376716382078640.7071067811865475244008443621048490392848359376884740365883398689953662392310535194251937671638207864I

(28)
• 

Find 10 roots in the first quadrant.

Isolate(x^100+x^3-1, x, 'method=HR', 'domain'=[0,infinity+I*infinity], 'maxroots'=10);

x=0.9744076649&comma;x=0.9781052241+0.1737357669I&comma;x=0.9531760998+0.2980270829I&comma;x=0.9680195472+0.2362266682I&comma;x=0.9104543811+0.4181438477I&comma;x=0.9827791401+0.1111417351I&comma;x=0.9804852800+0.05036970385I&comma;x=0.1198693017+0.9978851093I&comma;x=0.4848690063+0.8826473106I&comma;x=0.2461381235+0.9755862161I

(29)

restart:

New method option for fsolve, for a univariate polynomial

• 

The fsolve command has been updated with a new method option.  When solving for roots of a univariate polynomial this option allows specification of the new solver within the RootFinding:-Isolate command, or the original modified Laguerre method of the NAG Library. The value for the option can be specified here as method=hefroots or method=NAG. The current default is method=NAG, unless fsolve determines that the problem is ill-conditioned.

[ fsolve(x^4-5.591265174*x^3+2.936595076*x^2+17.11912543*x-10.52786025, x=0..4, method=hefroots) ];

0.6180339885&comma;2.718281830&comma;3.872983345

(30)

New method option for fsolve, for a univariate non-polynomial equation

• 

When solving for roots of an equation in one variable that is not a polynomial, the new method option to fsolve lets you specify the method used. The value for the option can be specified here as method=subdivide or method=NextZero. This option must be accompanied by the maxsols option. The subdivide method repeatedly searches on new subintervals between roots already found, using a custom mix of approaches on each. The NextZero method utilizes the RootFinding:-NextZero command to repeatedly search past the last root found. The default is method=subdivide, which may be more suitable for equations that are not continuous or have non-isolated roots. For some problems the NextZero method may be significantly faster.

[ fsolve(BesselJ(0,x^3)-1/100*x^2-floor(x)+2, x=0..4, maxsols=10, method=subdivide) ];

2.040911370&comma;2.290794873&comma;2.446318006&comma;2.642712321&comma;2.748619065&comma;2.920713827&comma;2.995225008

(31)

[ fsolve(BesselJ(0,x^3)-1/100*x^2, x=0..4, maxsols=10, method=':-NextZero') ];

1.333416382&comma;1.777268850&comma;2.040911369&comma;2.290794872&comma;2.446318005&comma;2.642712321&comma;2.748619064&comma;2.920713827&comma;2.995225007&comma;3.155131991

(32)

New support for lazy multivariate Puiseux series

• 

The MultivariatePowerSeries package was introduced in Maple 2021. It deals with multivariate power series in a lazy fashion, meaning that extra terms for a given result can be computed quickly.

• 

In Maple 2023, this package can now deal with multivariate Puiseux series and univariate polynomials over multivariate Puiseux series.

with(MultivariatePowerSeries):

a := PowerSeries(exp(s + t)*ln(1+t));

aPow&ExponentialE;rS&ExponentialE;rⅈ&ExponentialE;s of &ExponentialE;s&ExponentialE;tln1+t : t+t22+st+t33+st22+s2t2+st33+s2t24+s3t6+3t540+s2t36+s3t212+s4t24+

(33)

b := PuiseuxSeries(a, [s = sqrt(x), t = y^(1/3)*x]);

bPuⅈs&ExponentialE;uxS&ExponentialE;rⅈ&ExponentialE;s of &ExponentialE;x&ExponentialE;y13xln1+y13x : y13x+y23x22+x32y13+yx33+x52y232+x2y132+x72y3+x3y234+x52y136+3y53x540+x4y6+x72y2312+x3y1324+

(34)

Truncate(1/b, 3, mode=absolute);

12+1xy131xy13+12y13x6y13+x2+x24y13x4x32120y13y13x12+x3212+x2720y13+x32y1312x248x525040y13x2y1324+x52240+5y23x224+x52y1372x31440

(35)
• 

The package can also compute a Puiseux factorization of a univariate polynomial over univariate Puiseux series. We set this up by defining a univariate Puiseux series.

c := PowerSeries(exp(t) * ln(1+t));

cPow&ExponentialE;rS&ExponentialE;rⅈ&ExponentialE;s of &ExponentialE;tln1+t : t+t22+t33+3t540+

(36)

d := PuiseuxSeries(c, [t = y^(1/3)]);

dPuⅈs&ExponentialE;uxS&ExponentialE;rⅈ&ExponentialE;s of &ExponentialE;y13ln1+y13 : y13+y232+y3+3y5340+

(37)
• 

We now define e as dz2&plus;1dz&plus;1 and compute its Puiseux factorization.

e := UnivariatePolynomialOverPuiseuxSeries([d, 1/d, PuiseuxSeries(1)], z);

eUnⅈvarⅈat&ExponentialE;PolynomⅈalOv&ExponentialE;rPuⅈs&ExponentialE;uxS&ExponentialE;rⅈ&ExponentialE;s: y13+y232+y3+3y5340++1y13+z+1z2

(38)

e_factors := PuiseuxFactorize(e, returnleadingcoefficient=false):

for f in e_factors do print(Truncate(f, 4)); end do:

1y23

y43+y+y13z

1y132y231219y24829y43720+y13z

(39)

Truncate(e - mul(f, f in e_factors), 6);

0

(40)
• 

We see that the factors are linear or constant in z and they multiply to e.