wolfram alpha gives the following for `decompose c`: ``` (3*y**2 - 12*y*z**2 + 84*y*z + y + 12*z**4 - 168*z**3 + 586*z**2 + 14*z + 2) o (y**2 + y*z + 7*y) ``` and if you replace `y` in the first expression with the second expression it equals `c`. Written with the same semantics, the previous post results would be expressed as ``` (3*x**2 + x + 2) o (y**2 + y*z + 7*y - 2*z**2 + 14*z) ``` where `lhs.subs(x, rhs) == c`.
/c On Friday, December 17, 2021 at 8:13:17 PM UTC-6 Chris Smith wrote: > What is the best way to identify a multivariate change of variables for an > expression? Consider the followin: > ``` > >>> c > 3*y**4 + 6*y**3*z + 42*y**3 - 9*y**2*z**2 + 126*y**2*z + 148*y**2 - > 12*y*z**3 + > 589*y*z + 7*y + 12*z**4 - 168*z**3 + 586*z**2 + 14*z + 2 > >>> factor(c-2) > (y + 2*z)*(y - z + 7)*(3*y**2 + 3*y*z + 21*y - 6*z**2 + 42*z + 1) > >>> factor(_.args[-1]-1) > 3*(y + 2*z)*(y - z + 7) > >>> (x*(3*x+1)+2).subs(x,(y + 2*z)*(y - z + 7)).expand() == c > True > ``` > > This is a bit like `horner` (but `horner` gives something else in this > cse): > ``` > >>> horner(c) > y*(y*(y*(3*y + 6*z + 42) + z*(126 - 9*z) + 148) + z*(589 - 12*z**2) + 7) + > z*(z*(z*(12*z - 168) + 586) + 14) + 2 > ``` > It is also a bit like `decompose` (but `decompose` doesn't work on > multivariates). > > The ability to identify this multivariate generator allows for a > straightforward solution to the quartic in `y`: > ``` > >>> inv = solve(x - (y + 2*z)*(y - z + 7),y) > >>> xs = solve(x*(3*x+1)+2,x) > >>> ys = [i.subs(x, xi) for i in inv for xi in xs] > >>> ys > [-z/2 - sqrt(9*z**2 - 42*z + 145/3 - 2*sqrt(23)*I/3)/2 - 7/2, -z/2 - > sqrt(9*z**2 > - 42*z + 145/3 + 2*sqrt(23)*I/3)/2 - 7/2, -z/2 + sqrt(9*z**2 - 42*z + > 145/3 - 2 > *sqrt(23)*I/3)/2 - 7/2, -z/2 + sqrt(9*z**2 - 42*z + 145/3 + > 2*sqrt(23)*I/3)/2 - > 7/2] > ``` > Without identifying the generator the equation can also be solved > ``` > >>> sol=solve(c,y) > >>> sol > [sqrt(3)*(-sqrt(3)*z - sqrt(27*z**2 - 126*z + 145 - 2*sqrt(23)*I) - > 7*sqrt(3))/6 > , sqrt(3)*(-sqrt(3)*z + sqrt(27*z**2 - 126*z + 145 - 2*sqrt(23)*I) - > 7*sqrt(3))/ > 6, sqrt(3)*(-sqrt(3)*z - sqrt(27*z**2 - 126*z + 145 + 2*sqrt(23)*I) - > 7*sqrt(3)) > /6, sqrt(3)*(-sqrt(3)*z + sqrt(27*z**2 - 126*z + 145 + 2*sqrt(23)*I) - > 7*sqrt(3) > )/6] > ``` > The solutions are the same (but in different form). e.g. for `z = 3` > ``` > >>> [i.subs(z, 3).n(2) for i in sol] > [-6.0 + 0.4*I, -4.0 - 0.4*I, -6.0 - 0.4*I, -4.0 + 0.4*I] > >>> [i.subs(z, 3).n(2) for i in ys] > [-6.0 + 0.4*I, -6.0 - 0.4*I, -4.0 - 0.4*I, -4.0 + 0.4*I] > ``` > > /c > -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sympy+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/16c25b49-2afd-4634-8138-8e402d028caan%40googlegroups.com.