Actually, I think you can just convert the symbols to multiplications, but set them all as commutative=False so that they don't get rearranged. Then you can apply factor() (which I believe basically does the above algorithm for noncommutatives), and to convert back to dot products, convert each multiplication pairwise, like a*b*c*d -> <a, b>*<c, d> (also accounting for powers, like e1**2 == <e1, e1>). I'm not 100% sure this won't produce a wrong answer, so it's worth double checking it somehow (perhaps numerically).
This won't catch simplifications that require rearranging the inner products, like <a, b> = <b, a> (or <a, b> = conjugate(<b, a>) as the case may be). Aaron Meurer On Mon, Feb 27, 2017 at 3:39 PM, Aaron Meurer <asmeu...@gmail.com> wrote: > The function that does the simplification you want is factor(): > > In [22]: var('a b c d') > Out[22]: (a, b, c, d) > > In [23]: factor(a*c + b*d - a*d - b*c) > Out[23]: (a - b)⋅(c - d) > > However, I'm not sure how to apply it here. You can't just convert > your dot products to multiplications because it isn't true that <a, > b>*<c, d> = <a, c>*<b, d>. > > You might need to write a naive factor that recursively collects terms > with the same coefficient. For instance > > <a, c> + <b,d> - <b,c> - <a, d> > > -> <a, c - d> + <b, d - c> > -> <a - b, c - d> > > This also needs to recognize that c - d = -(d - c). > could_extract_minus_sign is useful for this. > > I don't recall if something like this is already written in SymPy. > > Aaron Meurer > > > On Mon, Feb 27, 2017 at 12:44 PM, Nico Schlömer > <nico.schloe...@gmail.com> wrote: >> Thanks for the reply. >> >>> I assume e0, e1, and e2 are arbitrary vectors. >> >> Indeed, they can be anything. (I'm looking at 3 dimensions here but given >> the fact that everything is a dot product I assume that doesn't play much of >> a role.) >> >> Cheers, >> Nico >> >> >> >> On Monday, February 27, 2017 at 6:37:59 PM UTC+1, brombo wrote: >>> >>> How the expression zeta obtained. Do input the expression you show or is >>> it obtained by vector algebraic operations on vector expressions. I assume >>> e0, e1, and e2 are arbitrary vectors. >>> >>> On Mon, Feb 27, 2017 at 12:04 PM, Nico Schlömer <nico.sc...@gmail.com> >>> wrote: >>>> >>>> I have a somewhat large expression in inner products, >>>> ``` >>>> zeta = ( >>>> - <e0, e0> * <e1, e1> * <e2, e2> >>>> + 4 * <e0, e1> * <e1, e2> * <e2, e0> >>>> + ( >>>> + <e0, e0> * <e1, e2> >>>> + <e1, e1> * <e2, e0> >>>> + <e2, e2> * <e0, e1> >>>> ) * ( >>>> + <e0, e0> + <e1, e1> + <e2, e2> >>>> - <e0, e1> - <e1, e2> - <e2, e0> >>>> ) >>>> - <e0, e0>**2 * <e1, e2> >>>> - <e1, e1>**2 * <e2, e0> >>>> - <e2, e2>**2 * <e0, e1> >>>> ) >>>> ``` >>>> and the symmetry in the expression has me suspect that it can be further >>>> simplified. Is sympy capable of simplifying vector/dot product expressions? >>>> A small example that, for example, takes >>>> ``` >>>> <a, c> + <b,d> - <b,c> - <a, d> >>>> ``` >>>> and spits out >>>> ``` >>>> <a-b, c-d> >>>> ``` >>>> would be great. >>>> >>>> -- >>>> 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+un...@googlegroups.com. >>>> To post to this group, send email to sy...@googlegroups.com. >>>> Visit this group at https://groups.google.com/group/sympy. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/sympy/2cb85a5e-2b5f-402f-82cb-fd4e2f738d93%40googlegroups.com. >>>> For more options, visit https://groups.google.com/d/optout. >>> >>> >> -- >> 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 post to this group, send email to sympy@googlegroups.com. >> Visit this group at https://groups.google.com/group/sympy. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/sympy/232c66f6-19a3-4672-8507-88631357e9c2%40googlegroups.com. >> >> For more options, visit https://groups.google.com/d/optout. -- 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 post to this group, send email to sympy@googlegroups.com. Visit this group at https://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAKgW%3D6LHNwZGhQMYpyfb3OGiCFfWNp%2BPaiDc2uot5NUh18oRgQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.