12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- module ncenv; % Non-communtative polynomial ring environment.
- % This module organizes an environment for computing with
- % non-commutative polynomials in algebraic mode, and an embedding
- % for non-commutative Groebner bases.
-
- % Author: H. Melenk, ZIB Berlin, J. Apel, University of Leipzig
- % Copyright: Konrad-Zuse-Zentrum Berlin, 1994
- share ncpi!-brackets!*,ncpi!-comm!-rules!*,ncpi!-name!-rules!*;
- algebraic operator nc!*;
- algebraic noncom nc!*;
- put('nc!*,'prifn,'pri!-nc!*);
- put('nc!*,'dipprifn,'dippri!-nc!*);
- symbolic procedure pri!-nc!* u;
- prin2!*(w and cdr w or u) where w=assoc(u,ncpi!-names!*);
- symbolic procedure dippri!-nc!* u;
- dipprin2(w and cdr w or u) where w=assoc(u,ncpi!-names!*);
- symbolic procedure ncpi!-setup u;
- begin scalar vars,al,b,b0,f,m,rs,rn,na,rh,lh,s,x,y,w,!*evallhseqp;
- if (w:=member('left,u)) or (w:=member('right,u)) then
- <<u:=delete(car w,u);!*ncg!-right:=car w='right>>;
- if length u > 2 then rederr "illegal number of arguments";
- if ncpi!-name!-rules!* then
- algebraic clearrules ncpi!-comm!-rules!*,ncpi!-name!-rules!*;
- u:=sublis(ncpi!-names!*,u);
- for each x in cdr listeval(car u,nil) collect
- <<x:=reval x;y:={'nc!*,mkid('!_,x)}; na:=(y.x).na;
- rn:={'replaceby,x,y}.rn; al:=(x.y).al;vars:=append(vars,{y})>>;
- ncpi!-names!*:=na;
- ncpi!-name!-rules!*:='list.rn;
- m:=for i:=1:length vars -1 join
- for j:=i+1:length vars collect nth(vars,i).nth(vars,j);
- if cdr u then ncpi!-brackets!*:=listeval(cadr u,nil);
- if null ncpi!-brackets!* then rederr "commutator relations missing";
- for each b in cdr ncpi!-brackets!* do
- <<b0:=sublis(al,b);
- w:= eqcar(b0,'equal) and (lh:=cadr b0) and (rh:=caddr b0)
- and eqcar(lh,'difference) and (f:=cadr lh) and (s:=caddr lh)
- and eqcar(f,'times) and eqcar(s,'times)
- and (x:=cadr f) and (y:=caddr f) and member(x,vars) and member(y,vars)
- and x=caddr s and y=cadr s;
- if not w then typerr(b,"commutator relation");
- % Invert commutator if necessary.
- if member(x.y,m) then <<w:=x;x:=y;y:=w; rh:={'minus,rh}>>;
- m:=delete(y.x,m);
- rs:={'replaceby,{'times,x,y},{'plus,{'times,y,x},rh}}.rs>>;
- % Initialize non-commutative distributive Polynomials.
- ncdsetup!*{'list.vars,'list.rs};
- apply('korder,{vars});
- apply('order,{vars});
- % Rules for commutating objects.
- for each c in m do
- rs:={'replaceby,{'times,cdr c,car c},{'times,car c,cdr c}}.rs;
- ncpi!-comm!-rules!*:='list.rs;
- algebraic let ncpi!-comm!-rules!*,ncpi!-name!-rules!* end;
- put('nc_setup,'psopfn,'ncpi!-setup);
- symbolic procedure nc_cleanup();
- <<algebraic clearrules ncpi!-comm!-rules!*,ncpi!-name!-rules!*;
- algebraic korder nil;algebraic order nil>>;
- put('nc_cleanup,'stat,'endstat);
- endmodule;;end;
|