MathGroup Archive 2009

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

Search the Archive

Re: symbolic matrix manipulation

  • To: mathgroup at
  • Subject: [mg96080] Re: [mg96042] symbolic matrix manipulation
  • From: Daniel Lichtblau <danl at>
  • Date: Wed, 4 Feb 2009 05:21:18 -0500 (EST)
  • References: <>

ashwin.tulapurkar at wrote:
> Hi,
> I am trying to simplify the following matrix expression:
> a.b.b.a with the rule: replace a.b by (b.a+1). So I expect the final
> output to be
> a.b.b.a --> (b.a+1).b.a --> b.a.b.a+b.a --> b.(b.a+1).a+b.a -->
> b.b.a.a + 2 b.a
> Can you tell me how to do this?
> Thanks.
> -Ashwin

This really looks more like something from a general setting of 
noncommutative algebra. I'll recast that way so as to avoid explicit use 
of matrix operators such as Dot, which will not handle this well. I'm 
adapting code from

I use a "multiplication" operator I call ncTimes. I designate the symbol 
s for variables to be treated as noncommuting. We impose a commutator 
relation that s[i] s[j] = s[j] s[i] + 1 for j>i (so we just need to make 
sure b correspnds to an s ariable with larger index than a).

ncTimes[] := 1
ncTimes[a_] := a
ncTimes[a___,x_+y_,b___] := ncTimes[a,x,b] + ncTimes[a,y,b]
ncTimes[a___,ncTimes[b_,c__],d___] := ncTimes[a,b,c,d]
ncTimes[a___,i_Integer*c_,b___] := i*ncTimes[a,c,b]
ncTimes[a___,i_Integer,b___] := i*ncTimes[a,b]
ncTimes[a___,s[i_Integer],s[j_Integer],b___] /; j>i :=

a = s[1];
b = s[2];

Your example, in this setting, is done as below.

In[10]:= ncTimes[a,b,b,a]
Out[10]= 2 ncTimes[s[2], s[1]] + ncTimes[s[2], s[2], s[1], s[1]]

Daniel Lichtblau
Wolfram Research

  • Prev by Date: Re: Log[x]//TraditionalForm
  • Next by Date: Re: Taking sums across indices of a
  • Previous by thread: symbolic matrix manipulation
  • Next by thread: Re: symbolic matrix manipulation