It's possible you can get decent results just by sorting the dot products before converting to multiplication, like (<e1, e1>*<e0, e1> => <e0, e1>*<e1, e1>).
I'm more worried about the order in the dot products themselves. You could sort within the dot products themselves, like <e1, e0> => <e0, e1>, but you might still run into problems, e.g., <e0, e1> + <e1, e2> won't combine. Most likely the safest bet is that whatever you used to generate your expression put the dot products in the order they should be for the best simplification. And of course, if you are dealing with complex inner products, you probably just want the expression with no conjugates (since <a, b> + conjugate(<a, c>) doesn't really simplify anyway). It's not possible to have a*b*c*d = c*d*a*b but not a*b = b*a. The way noncommutativity works is that it is defined on symbols. Each product of terms pulls out the "commutative part" (everything with commutative=True) to the front, and then keeps the rest, the noncommutative part, in the order it was created in. For example: In [27]: var('a') Out[27]: a In [28]: var("A B", commutative=False) Out[28]: (A, B) In [29]: A*a*B Out[29]: a⋅A⋅B There have been discussions in the past on being able to represent more complex commutation relationships. But even if that were implemented, you would need some algorithms for simplifying expressions. Aaron Meurer On Mon, Feb 27, 2017 at 4:31 PM, Nico Schlömer <nico.schloe...@gmail.com> wrote: > Thanks for the suggestions. > > The noncommutative option is probably too strict since `<a,b><c, d> != > <c,d><a,b>` then. Or can I make only some multiplications noncommutative? > >> You might need to write a naive factor > > Is there any documentation on this? > > Cheers, > Nico > > > On Monday, February 27, 2017 at 9:44:45 PM UTC+1, Aaron Meurer wrote: >> >> 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 <asme...@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.sc...@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+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/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/8b71de13-95d8-410d-9f1e-d73f3c555aac%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%3D6JbkS4od8FQtUQwJsRpBNpecphOg0qLcwKBqSUdacPoww%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.