Re: Non Commutative Multiply
- To: mathgroup at smc.vnet.net
- Subject: [mg128607] Re: Non Commutative Multiply
- From: Roland Franzius <roland.franzius at uos.de>
- Date: Thu, 8 Nov 2012 19:01:50 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
- References: <k7fm4l$jko$1@smc.vnet.net>
Am 08.11.2012 08:14, schrieb Rodrigo AP: > Dear group, > > I want to multiply two matrices, for example, > > A = {{e, f}, {g, h}} > B = {{a, b}, {c, d}} > > Using A.B, Mathematica returns > > {{a e + b g, a f + b h}, {c e + d g, c f + d h}} > > I would like to get, however, the following result: > > {{e a + f c, e b + f d}, {g a + h c, g b + h d}} > > since, for me, the entries {a,b,c,d,e,f,g,h} are operators, i.e., they > are non-commutative. > > I could solve this problem clearing the attribute "Orderless" in the > built-in function Times: > > ClearAttributes[Times, Orderless] > > I know, however, this can be dangerous. I tried to define a function > Times2[a_,b_]:=Times[a,b] > and then use ClearAttributes[Times2, Orderless] but it doesn't work. > > How could I solve this problem? Changing fundamental operators like Times is not a solution. It will cause a breakdown of the algebra machine. Use operator Inner and a multiplicative oprator symbol from http://reference.wolfram.com/mathematica/tutorial/OperatorsWithoutBuiltInMeanings.html like CircleTimes, SmallCircle. SmallCircle[A_?MatrixQ, B_?MatrixQ]:=Inner[SmallCircle[#1,#2]&,A,B,Plus] SmallCircle[A_,B_, C___]:=SmallCircle[SmallCircle[A,B], C] Now you can enrich procedures like Simplify, Factor and Expand by the typical set of rules for the linear expressions with head Plus und Times, eg Unprotect[Simplify] Simplify[expression_]:= expression//. {SmallCircle[a___,b_?NumericQ,c___]:>b*SmallCircle[a,c], SmallCircle[a___,b_+c__,d___]:> SmallCircle[a,b,d]+SmallCircle[a,c,d], SmallCircle[a___,b_?NumericQ c__:1,d___]:>b*SmallCircle[a,b,d]} Probably it is better to give the class of noncommutative objects an identity by naming them explicitely in a logical statement as operators = {P,Q, d_Q, d_P} (OperatorQ[#]=True&)/@operators or OperatorQ[x_]:= MemberQ [ operators, x] and formulate the rules in such a way that only products and powers of operators remain inside the noncommutative operator product. This makes it easier to extract the typical scalar functions, starting with Power and in principle has to be applied to the body of all special complex functions. -- Roland Franzius