123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- module groebsea;
-
- % support of search for reduction polynomials
-
- fluid '(thirdvalue!* fourthvalue!* hcount!* !*groebWeak);
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % 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 buch!-vevdivides!?(vdpevlmon car g, vev) then car g
- else groebsearchinlist (vev,cdr g);
-
-
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % search tree for polynomials
- % simple variant: mapped to search list
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- symbolic procedure groebstreeadd (poly,stru);
- % add one polynomial to the tree
- % if this is a simple polynomial (mono or bino), reform
- % the tree
- if hcount!* #< 5000 then vdplsortin(poly,stru)
- else vdplsortinreplacing(poly,stru);
-
- symbolic procedure groebsearchinstree (vev,stru);
- % search a polynomial corresponding to the exponent vector vev
- groebsearchinlist (vev,stru);
- symbolic procedure groebstreeextract stru;
- % gives a linear list of all polynomials in the tree
- stru;
- symbolic procedure groebstreereconstruct u;
- % reconstructs a tree from a linear list of polynomials
- vdplsort u;
- % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
- % 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 vev,p,pl,x,rep,first,rpoly,break;
- 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 buch!-vevdivides!?(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;
- % reform D
- thirdvalue!* := d;
- % reform Gc
- fourthvalue!* :=
- groebsecondaryremovemultiples
- 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;
|