@@ -285,12 +285,20 @@ export const createSimplify = /* #__PURE__ */ factory(name, dependencies, (
285285 { l : 'log(e)' , r : '1' } ,
286286
287287 // temporary rules
288+ // Note initially we tend constants to the right because like-term
289+ // collection prefers the left, and we would rather collect nonconstants
288290 { l : 'n-n1' , r : 'n+-n1' } , // temporarily replace 'subtract' so we can further flatten the 'add' operator
289- { l : '-(c*v)' , r : '(-c) * v ' } , // make non-constant terms positive
290- { l : '-v' , r : '(-1) * v ' } ,
291+ { l : '-(c*v)' , r : 'v * (-c)' } , // make non-constant terms positive
292+ { l : '-v' , r : 'v * (-1)' } ,
291293 { l : 'n/n1^n2' , r : 'n*n1^-n2' } , // temporarily replace 'divide' so we can further flatten the 'multiply' operator
292294 { l : 'n/n1' , r : 'n*n1^-1' } ,
293295
296+ // remove parenthesis in the case of negating a quantity
297+ { l : 'n1 + (n2 + n3)*(-1)' , r : 'n1 + n2*(-1) + n3*(-1)' } ,
298+ // subsume resulting -1 into constants where possible
299+ { l : '(-1) * c' , r : '-c' } ,
300+ { l : '(-1) * (-c)' , r : 'c' } ,
301+
294302 // expand nested exponentiation
295303 { l : '(n ^ n1) ^ n2' , r : 'n ^ (n1 * n2)' } ,
296304
@@ -302,17 +310,15 @@ export const createSimplify = /* #__PURE__ */ factory(name, dependencies, (
302310 // collect like terms
303311 { l : 'n+n' , r : '2*n' } ,
304312 { l : 'n+-n' , r : '0' } ,
305- { l : 'n1*n2 + n2' , r : '(n1+1)*n2' } ,
306- { l : 'n1*n3 + n2*n3' , r : '(n1+n2)*n3' } ,
307-
308- // remove parenthesis in the case of negating a quantitiy
309- { l : 'n1 + -1 * (n2 + n3)' , r : 'n1 + -1 * n2 + -1 * n3' } ,
313+ { l : 'v*n + v' , r : 'v*(n+1)' } , // NOTE: leftmost position is special:
314+ { l : 'n3*n1 + n3*n2' , r : 'n3*(n1+n2)' } , // All sub-monomials tried there.
315+ { l : 'n*c + c' , r : '(n+1)*c' } ,
310316
311317 simplifyConstant ,
312318
313319 { l : '(-n)*n1' , r : '-(n*n1)' } , // make factors positive (and undo 'make non-constant terms positive')
314320
315- // ordering of constants
321+ // final ordering of constants
316322 { l : 'c+v' , r : 'v+c' , context : { add : { commutative : false } } } ,
317323 { l : 'v*c' , r : 'c*v' , context : { multiply : { commutative : false } } } ,
318324
@@ -376,7 +382,7 @@ export const createSimplify = /* #__PURE__ */ factory(name, dependencies, (
376382 r : removeParens ( parse ( rule . r ) )
377383 }
378384 if ( rule . context ) {
379- newRule . evaluate = rule . context
385+ newRule . context = rule . context
380386 }
381387 if ( rule . evaluate ) {
382388 newRule . evaluate = parse ( rule . evaluate )
0 commit comments