Artifact 75e6cf28db0c39d1a8e692f31e98a481e78d9c33f9686d53cb2e499e8da81a5a:
- Executable file
r38/packages/groebner/groebsea.red
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 3686) [annotate] [blame] [check-ins using] [more...]
module groebsea; % Support of search for reduction polynomials. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Search for reduction candidates in a list. symbolic procedure groebsearchinlist(vev,g); % Search for a polynomial in the list 'g',such that the lcm divides % vev;'g' is expected to be sorted in descending sequence. if null g then nil else if buchvevdivides!?(vdpevlmon car g,vev)then car g else groebsearchinlist(vev,cdr g); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Search list for polynomials; % simple variant: mapped to list. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% symbolic procedure groeblistadd(poly,stru); % Add one polynomial to the tree; % if this is a simple polynomial(mono or bino), reform % the list. if hcount!* #< 5000 then vdplsortin(poly,stru) else vdplsortinreplacing(poly,stru); symbolic procedure groebstreeadd(poly,stru); % Map 'groebstreeadd' to 'groeblistadd'. groeblistadd(poly,stru); % symbolic procedure groeblistreconstruct u; % % Reconstructs a tree from a linear list of polynomials. % vdplsort u; symbolic procedure groebvevdivides!?(e1,e2); % Look, if 'e1' is a factor of 'e2'. if null e1 then t else if null e2 then(if vevzero!? e1 then t else nil)else if car e1 #> car e2 then nil else groebvevdivides!?(cdr e1,cdr e2); % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % Reforming g, d and g99 when a very simple polynomial was % found(e.g. a monomial, a binomial). symbolic procedure groebsecondaryreduction(poly,g,g99,d,gc, mode); % If poly is a simple polynomial, the polynomials in 'g' and 'g99' % are reduced in a second pass. Result is 'g',secondvalue is 'g99'. % 'mode' says, that 'g99' has to be modified in place. begin scalar break,first,p,pl,rep,rpoly,vev,x; mode:=nil; secondvalue!*:=g99;thirdvalue!*:=d;fourthvalue!*:=gc; vev:=vdpevlmon poly;rpoly:=vdpred poly; % Cancel redundant elements in 'g99'. for each p in g99 do if buchvevdivides!?(vev,vdpevlmon p) then g99:=delete(p,g99); if vdplength poly > 2 or vevzero!? vev then return g; if !*groebweak and not vdpzero!? rpoly and(groebweaktestbranch!=1(poly,g,d)) then return 'abort; !*trgroeb and groebmess50 g; pl:=union(g,g99);first:=t; while pl and not break do <<p:= car pl;pl:=cdr pl; if groebprofitsfromvev(p,vev)then % Replace by simplified version. <<x:=groebnormalform1(p,poly); x:=groebsimpcontnormalform x;x:=vdpenumerate x; if first then !*trgroeb and groebmess20(poly); first:=nil;!*trgroeb and groebmess21(p,x); rep:=( p.x).rep; if not vdpzero!? x and vevzero!? vdpevlmon x then break:=t;% 1 found. >>>>; if break then return 'abort; % Reform 'g99'. g99:=for each p in g99 collect groebsecondaryreplace(p,rep); secondvalue!*:= groebsecondaryremovemultiples g99; thirdvalue!*:=d;% Reform 'd'. fourthvalue!*:=groebsecondaryremovemultiples % Reform 'gc'. for each y in gc collect groebsecondaryreplace(y,rep); g:=for each y in g collect groebsecondaryreplace(y,rep); !*trgroeb and groebmess50 g; return groebsecondaryremovemultiples g end; symbolic procedure groebsecondaryremovemultiples g; if null g then nil else if vdpzero!? car g or member(car g,cdr g)then groebsecondaryremovemultiples cdr g else car g.groebsecondaryremovemultiples cdr g; symbolic procedure groebsecondaryreplace(x,rep); (if y then cdr y else x)where y=atsoc(x,rep); endmodule;;end;