Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
1997
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 1997

[Date Index] [Thread Index] [Author Index]

Search the Archive

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];

Some comments about the above definitions. 

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)