Performance
frontend
iratrecon - rational reconstruction
sprem - sparse pseudo division
gcdex - extended Euclidean algorithm
Expand, Quo, and, Rem mod p
normal
indets, coeffs, degree, and miscellaneous
solve command and Groebner Bases
The frontend command is used extensively by Maple to map expressions to the domain of rational functions. It was rewritten for Maple 2017 to reduce time and memory usage. The typical gain is a factor of two but for complicated expressions it runs an order of magnitude faster. The example below runs over 30 times faster in Maple 2017.
expr≔randpolysinx,cosx,I:for i to 3 do expr ≔ addrandpolyexpri,i=−3..3; end:timefrontendlength,expr
0.265
The iratrecon command for rational reconstruction has been re-engineered in the kernel to improve performance. The first two examples below run about 9x and 5x faster, respectively. We have also added a new fraction-free syntax that returns true or false and assigns the numerator and denominator to the fifth and sixth arguments. By not constructing fractions, the new syntax gains an additional factor of five speedup.
m ≔ prevprime260⋅nextprime260:f ≔ mul⁡randpoly⁡i,'dense',i=x,y,z,t,u,v,w:f ≔ Expand⁡frand⁡modm:timeiratrecon⁡f,m;timeiratrecon⁡f,m,scaled
5.116
0.530
b ≔ isqrt⁡iquo⁡m,2:timeiratrecon⁡f,m,b,b,'n','d' # new syntax
0.124
The sprem command performs sparse fraction-free pseudo division on polynomials. In previous versions of Maple, sprem(f,g,x) would multiply by lcoeff(g,x) in each division step. In Maple 2017, sprem has been changed to compute gcds and use the smallest possible multiplier, allowing it to handle problems of much higher degree with less blowup. When degree(g)=degree(g,x) the command calls a dedicated division routine written in C. The example below runs about 360 times faster, and finds a multiplier that is 19x shorter.
f ≔ randpoly⁡x,degree=10000,terms=102:g ≔ randpoly⁡x,degree=5000,terms=102:timesprem⁡f,g,x,'m';lengthm
0.156
225
For univariate polynomials, gcdex now uses a sparse primitive polynomial remainder sequence together with the new code for sprem. For sparse structured problems the new routine is orders of magnitude faster. The example below was previously intractable.
f ≔ 128⁢x203−625591465⁢x196−1379565483492966⁢x189−69051360012922713930⁢x182+503269676439575515122310⁢x175−358607771626419731119489079⁢x168−147952840877635699778667316508⁢x161−1147922766589841137530437873498⁢x154−3283047528072876955188179107557⁢x147−5494471139223382529181506689788⁢x140−6295323446544817875033709377526⁢x133−5439730226339556502298385195313⁢x126−4047134740954486045236505654710⁢x119−2699447938384037396439601445910⁢x112−1005987107212742027676051174393⁢x105+1005987107212742027676051174393⁢x98+2699447938384037396439601445910⁢x91+4047134740954486045236505654710⁢x84+5439730226339556502298385195313⁢x77+6295323446544817875033709377526⁢x70+5494471139223382529181506689788⁢x63+3283047528072876955188179107557⁢x56+1147922766589841137530437873498⁢x49+147952840877635699778667316508⁢x42+358607771626419731119489079⁢x35−503269676439575515122310⁢x28+69051360012922713930⁢x21+1379565483492966⁢x14+625591465⁢x7−128:time⁡gcdex⁡∂∂x⁢f,f,x,'inv'
0.031
Expansion of fk mod p has been optimized in the case where p is a prime and k≥p, using the Frobenius map a+bp =ap+bp. The expansion below previously took a few seconds but is now instantaneous. Quo and Rem have also been improved for multivariate polynomials and the division below runs about 90x faster.
f ≔ Expand⁡x3+y⁢z+z+y⁢y+x⁢z4mod7:g ≔ CodeTools:-Usage⁡Expand⁡f50mod7:
memory used=75.71KiB, alloc change=0 bytes, cpu time=78.00ms, real time=140.00ms, gc time=0ns
r ≔ CodeTools:-Usage⁡Rem⁡g,f,x,'q'mod7:
memory used=13.05KiB, alloc change=0 bytes, cpu time=16.00ms, real time=4.00ms, gc time=0ns
Maple 2017 includes a powerful new algorithm for simplifying large multivariate rational expressions using normal. Previous versions of Maple could not do this problem automatically.
unassign⁡'g':
s1 ≔ l2⁢g⁢a223−l1⁢g⁢a12⁢a21⁢a222−l2⁢n22⁢a21⁢a222+l2⁢n11⁢a21⁢a222+2⁢l2⁢g⁢a12⁢a222−l1⁢g⁢a12⁢a222+l2⁢g2⁢a222−l2⁢n11⁢n22⁢a222+l2⁢n11⁢a222+l1⁢n22⁢a12⁢a212⁢a22−l1⁢n11⁢a12⁢a212⁢a22−l2⁢g⁢a212⁢a22−l1⁢g⁢a122⁢a21⁢a22−l2⁢g2⁢a12⁢a21⁢a22−l1⁢g2⁢a12⁢a21⁢a22+l2⁢n11⁢n22⁢a12⁢a21⁢a22+l1⁢n11⁢n22⁢a12⁢a21⁢a22−2⁢l2⁢n22⁢a12⁢a21⁢a22+l1⁢n22⁢a12⁢a21⁢a22+l2⁢n11⁢a12⁢a21⁢a22−2⁢l1⁢n11⁢a12⁢a21⁢a22−l2⁢g⁢a21⁢a22+l2⁢g⁢a122⁢a22−l1⁢g⁢a122⁢a22+l2⁢g2⁢a12⁢a22−l1⁢g2⁢a12⁢a22−l2⁢n11⁢n22⁢a12⁢a22+l1⁢n11⁢n22⁢a12⁢a22+l2⁢n11⁢a12⁢a22−l1⁢n11⁢a12⁢a22+l1⁢g⁢a12⁢a213+l1⁢g2⁢a122⁢a212−l1⁢n11⁢n22⁢a122⁢a212+l1⁢n22⁢a122⁢a212−l2⁢g⁢a12⁢a212+2⁢l1⁢g⁢a12⁢a212−l2⁢g2⁢a122⁢a21+l1⁢g2⁢a122⁢a21+l2⁢n11⁢n22⁢a122⁢a21−l1⁢n11⁢n22⁢a122⁢a21−l2⁢n22⁢a122⁢a21+l1⁢n22⁢a122⁢a21−l2⁢g⁢a12⁢a21+l1⁢g⁢a12⁢a21l2⁢g⁢a12⁢a21⁢a222−l1⁢g⁢a12⁢a21⁢a222−l2⁢n22⁢a21⁢a222+l1⁢n22⁢a21⁢a222+l1⁢l2⁢g⁢a12⁢a222−l1⁢g⁢a12⁢a222−l1⁢l2⁢n22⁢a222+l1⁢n22⁢a222+l2⁢n11⁢a12⁢a212⁢a22−l1⁢n11⁢a12⁢a212⁢a22−l2⁢g⁢a212⁢a22+l1⁢g⁢a212⁢a22−l1⁢l2⁢g⁢a122⁢a21⁢a22+2⁢l2⁢g⁢a122⁢a21⁢a22−l1⁢g⁢a122⁢a21⁢a22+l1⁢l2⁢n22⁢a12⁢a21⁢a22−2⁢l2⁢n22⁢a12⁢a21⁢a22+l1⁢n22⁢a12⁢a21⁢a22+l1⁢l2⁢n11⁢a12⁢a21⁢a22+l2⁢n11⁢a12⁢a21⁢a22−2⁢l1⁢n11⁢a12⁢a21⁢a22−l1⁢l2⁢g⁢a21⁢a22−l2⁢g⁢a21⁢a22+2⁢l1⁢g⁢a21⁢a22+l1⁢l2⁢g⁢a122⁢a22−l1⁢g⁢a122⁢a22−l1⁢l2⁢n22⁢a12⁢a22+l1⁢n22⁢a12⁢a22+l1⁢l2⁢n11⁢a12⁢a22−l1⁢n11⁢a12⁢a22−l1⁢l2⁢g⁢a22+l1⁢g⁢a22−l1⁢l2⁢n11⁢a122⁢a212+l2⁢n11⁢a122⁢a212+l1⁢l2⁢g⁢a12⁢a212−l2⁢g⁢a12⁢a212−l1⁢l2⁢g⁢a123⁢a21+l2⁢g⁢a123⁢a21+l1⁢l2⁢n22⁢a122⁢a21−l2⁢n22⁢a122⁢a21−l1⁢l2⁢n11⁢a122⁢a21+l2⁢n11⁢a122⁢a21+l1⁢l2⁢g⁢a12⁢a21−l2⁢g⁢a12⁢a21:s2 ≔ l2⁢g⁢a12⁢a222−l2⁢n22⁢a222+l2⁢a222−l1⁢g⁢a122⁢a21⁢a22+l1⁢n22⁢a12⁢a21⁢a22+l2⁢n11⁢a12⁢a21⁢a22−l2⁢a12⁢a21⁢a22−l1⁢a12⁢a21⁢a22−l2⁢g⁢a21⁢a22+l2⁢g⁢a122⁢a22−l1⁢g⁢a122⁢a22−l2⁢n22⁢a12⁢a22+l1⁢n22⁢a12⁢a22+l2⁢a12⁢a22−l1⁢a12⁢a22−l1⁢n11⁢a122⁢a212+l1⁢a122⁢a212+l1⁢g⁢a12⁢a212+l2⁢n11⁢a122⁢a21−l1⁢n11⁢a122⁢a21−l2⁢a122⁢a21+l1⁢a122⁢a21−l2⁢g⁢a12⁢a21+l1⁢g⁢a12⁢a21l2⁢g⁢a12⁢a222−g⁢a12⁢a222−l2⁢n22⁢a222+n22⁢a222−l1⁢g⁢a122⁢a21⁢a22+g⁢a122⁢a21⁢a22+l1⁢n22⁢a12⁢a21⁢a22−n22⁢a12⁢a21⁢a22+l2⁢n11⁢a12⁢a21⁢a22−n11⁢a12⁢a21⁢a22−l2⁢g⁢a21⁢a22+g⁢a21⁢a22+l2⁢g⁢a122⁢a22−g⁢a122⁢a22−l2⁢n22⁢a12⁢a22+n22⁢a12⁢a22+l2⁢n11⁢a12⁢a22−n11⁢a12⁢a22−l2⁢g⁢a22+g⁢a22−l1⁢n11⁢a122⁢a212+n11⁢a122⁢a212+l1⁢g⁢a12⁢a212−g⁢a12⁢a212−l1⁢g⁢a123⁢a21+g⁢a123⁢a21+l1⁢n22⁢a122⁢a21−n22⁢a122⁢a21−l1⁢n11⁢a122⁢a21+n11⁢a122⁢a21+l1⁢g⁢a12⁢a21−g⁢a12⁢a21:s3 ≔ l2⁢p21⁢a223−l1⁢p21⁢a12⁢a21⁢a222−l2⁢p22⁢a21⁢a222+l2⁢p11⁢a21⁢a222+2⁢l2⁢p21⁢a12⁢a222−l1⁢p21⁢a12⁢a222−l2⁢p11⁢p22⁢a222+l2⁢p12⁢p21⁢a222+l2⁢p11⁢a222+l1⁢p22⁢a12⁢a212⁢a22−l1⁢p11⁢a12⁢a212⁢a22−l2⁢p12⁢a212⁢a22−l1⁢p21⁢a122⁢a21⁢a22+l2⁢p11⁢p22⁢a12⁢a21⁢a22+l1⁢p11⁢p22⁢a12⁢a21⁢a22−2⁢l2⁢p22⁢a12⁢a21⁢a22+l1⁢p22⁢a12⁢a21⁢a22−l2⁢p12⁢p21⁢a12⁢a21⁢a22−l1⁢p12⁢p21⁢a12⁢a21⁢a22+l2⁢p11⁢a12⁢a21⁢a22−2⁢l1⁢p11⁢a12⁢a21⁢a22−l2⁢p12⁢a21⁢a22+l2⁢p21⁢a122⁢a22−l1⁢p21⁢a122⁢a22−l2⁢p11⁢p22⁢a12⁢a22+l1⁢p11⁢p22⁢a12⁢a22+l2⁢p12⁢p21⁢a12⁢a22−l1⁢p12⁢p21⁢a12⁢a22+l2⁢p11⁢a12⁢a22−l1⁢p11⁢a12⁢a22+l1⁢p12⁢a12⁢a213−l1⁢p11⁢p22⁢a122⁢a212+l1⁢p22⁢a122⁢a212+l1⁢p12⁢p21⁢a122⁢a212−l2⁢p12⁢a12⁢a212+2⁢l1⁢p12⁢a12⁢a212+l2⁢p11⁢p22⁢a122⁢a21−l1⁢p11⁢p22⁢a122⁢a21−l2⁢p22⁢a122⁢a21+l1⁢p22⁢a122⁢a21−l2⁢p12⁢p21⁢a122⁢a21+l1⁢p12⁢p21⁢a122⁢a21−l2⁢p12⁢a12⁢a21+l1⁢p12⁢a12⁢a21l2⁢p21⁢a12⁢a21⁢a222−l1⁢p21⁢a12⁢a21⁢a222−l2⁢p22⁢a21⁢a222+l1⁢p22⁢a21⁢a222+l1⁢l2⁢p21⁢a12⁢a222−l1⁢p21⁢a12⁢a222−l1⁢l2⁢p22⁢a222+l1⁢p22⁢a222+l2⁢p11⁢a12⁢a212⁢