Re: Working with Dot[..] or NonCommutativeMultiply[..]
- To: mathgroup at smc.vnet.net
- Subject: [mg6388] Re: Working with Dot[..] or NonCommutativeMultiply[..]
- From: Dick Zacher <dick at loc3.tandem.com>
- Date: Sun, 16 Mar 1997 19:24:55 -0500 (EST)
- Organization: Tandem Computers
- Sender: owner-wri-mathgroup at wolfram.com
Sergio Rojas wrote: > > Hello guys, > > Given: > > f = a*x1 + b*x2 ; > g = c*y1 ; > > where x1, x2, and y1 have non commutative product. The mathematica > output for: > > Distribute[Dot[f,g,f]] (* Distribute[NonCommutativeMultiply[f,g,f]] *) > is: > > Out[79]= (a x1) . (c y1) . (a x1) + (a x1) . (c y1) . (b x2) + > > > (b x2) . (c y1) . (a x1) + (b x2) . (c y1) . (b x2) > > How, using mathematica, Out[79] can be written in the form: > > a^2*c*(x1.y1.x1) + a*b*c*((x1.y1.x2) + (x2.y1.x1)) + b^2*c(x2.y1.x2) > > Regards, > > Sergio > > e-mail: sergio at scisun.sci.ccny.cuny.edu Probably there are much more elegant ways than this, but-- First, you could distinguish commuting, or scalar, quantities: In[1]:= scalar[n_?NumericQ]:=True In[2]:= scalar[x_*y_]:=scalar[x]&&scalar[y] In[3]:= scalar[x_+y_]:=scalar[x]&&scalar[y] In[4]:= scalar[x_^y_]:=scalar[x]/;scalar[y] And you could provide a way of defining quantities to be scalars: In[5]:= makeScalar[vars__]:=((scalar[#]^=True)&/@{vars};) Then you could define some rules for non-commuting multiplication (though you might prefer to use ** rather than Dot): In[6]:= ncrules={ x_ .(y_+z_):>x.y+x.z, (x_+y_).z_:>x.z+y.z, c_ .x_:>c*x/;scalar[c], x_ .(c_*y_):>c*(x.y)/;scalar[c], (c_*x_).y_:>c*(x.y)/;scalar[c] }; Then indicate which quantities are scalar and do the computation: In[7]:= makeScalar[a,b,c] In[8]:= f = a*x1 + b*x2 ; g = c*y1 ; In[9]:= f.g.f//.ncrules//InputForm Out[9]//InputForm= a^2*c*x1 . y1 . x1 + a*b*c*x1 . y1 . x2 + a*b*c*x2 . y1 . x1 + b^2*c*x2 . y1 . x2 The terms aren't collected in just the way you wanted, but you get the idea. -- ----------------------------- Dick Zacher Performance Engineering Dept., Tandem Computers zacher_dick at tandem.com phone: 408-285-5746 fax: 408-285-7079