       Re: nested * and ** (rules for commutative quantities)

• To: mathgroup at smc.vnet.net
• Subject: [mg7797] Re: [mg7658] nested * and ** (rules for commutative quantities)
• From: "C. Woll" <carlw at u.washington.edu>
• Date: Tue, 8 Jul 1997 22:41:10 -0400
• Sender: owner-wri-mathgroup at wolfram.com

```On Tue, 8 Jul 1997, Marlies Brinksma wrote:

> Dear Carl,
>
> ...
>
> > > Times[4, Op[1,t],NonCommutativeMultiply[Op[2,v],Op[2,x]],Op[3,a],Op[6,s]]
> > >                                                        ^
> > > ...                                                    |
>
> I think you've missed one ] right behind Op[2,x]... ;)
>
> ...
>
Hi Marlies,

You're absolutely right. So, instead, how about the following approach.

Unprotect[NonCommutativeMultiply];
Clear[NonCommutativeMultiply];
Default[NonCommutativeMultiply]:=1;

Op[n_,a_] 		** Op[m_,b_] 		:= Op[m,b] Op[n,a] /; (n=!=m)
a_			** b_?NumberQ		:= a b
b_?NumberQ		** a_			:= a b

Op[n_,a_] 		** (Op[n_,b_]**c_. d_)	:= Op[n,a]**Op[n,b]**c d
(Op[n_,b_]**c_. d_) 	** Op[n_,a_] 		:= Op[n,b]**c**Op[n,a] d
(Op[n_,a_]**c_. d_) 	** (Op[n_,b_]**e_. f_)	:= (Op[n,a]**c**Op[n,b]**e d)**f

a_Times			** b_			:= a b
b_			** a_Times		:= a b

Protect[NonCommutativeMultiply];

a) The method works as follows:

1) First, absorb commuting quantities under a Times[ ] head.
2) Then, in adjacent expressions, collect Ops with the same index.
3) When there are no more Ops with the same index, then its okay
to absorb adjacent expressions under a common Times[ ] head.

b) You can choose as a default 1 (as above) or Sequence[]. The choice 1 is
clearer, but the choice Sequence[] is marginally faster.

c) You can avoid using defaults by adding some more definitions, e.g.,

Op[n_,a_] 		** (Op[n_,b_] d_)	:= Op[n,a]**Op[n,b] d
Op[n_,a_] 		** (Op[n_,b_]**c_ d_)	:= Op[n,a]**Op[n,b]**c d

d) If you have commuting quantities which are more complex than numbers,
change the NumberQ test appropriately.

e) The order of definitions is important.

f) There is something I don't understand about the way mma is handling the
first 3 definitions which causes it to exercise these definitions much
more often then necessary. It may have something to do with using a
default, which is why I suggested how you could avoid using a default.

I believe this accomplishes what you asked for. Good luck!

Carl Woll

```

• Prev by Date: But can it do...
• Next by Date: Re: Re: nested * and ** (rules for commutative quantities)
• Previous by thread: Re: nested * and ** (rules for commutative quantities)
• Next by thread: Re: Re: nested * and ** (rules for commutative quantities)