source: git/Singular/LIB/ainvar.lib

spielwiese
Last change on this file was f054d7f, checked in by Hans Schoenemann <hannes@…>, 15 months ago
fix: remove some execute from ainvar, brnoeth, chern.lib
  • Property mode set to 100644
File size: 19.7 KB
RevLine 
[380a17b]1//////////////////////////////////////////////////////////////////////////////
[f054d7f]2version="version ainvar.lib 4.3.1.3 Feb_2023 "; // $Id$
[fd3fb7]3category="Invariant theory";
[5480da]4info="
[4ac997]5LIBRARY: ainvar.lib    Invariant Rings of the Additive Group
[51d95b]6AUTHORS: Gerhard Pfister (email: pfister@mathematik.uni-kl.de),
7         Gert-Martin Greuel (email: greuel@mathematik.uni-kl.de)
[4b35a90]8
[f34c37c]9PROCEDURES:
[68e678]10  invariantRing(m..);  compute ring of invariants of (K,+)-action given by m
[5b9dd1]11  derivate(m,f);       derivation of f with respect to the vector field m
[68e678]12  actionIsProper(m);   tests whether action defined by m is proper
13  reduction(p,I);      SAGBI reduction of p in the subring generated by I
[b9b906]14  completeReduction(); complete SAGBI reduction
[68e678]15  localInvar(m,p..);   invariant polynomial under m computed from p,...
[5b9dd1]16  furtherInvar(m..);   compute further invariants of m from the given ones
[b9b906]17  sortier(id);         sorts generators of id by increasing leading terms
[5480da]18";
[4b35a90]19
20LIB "inout.lib";
21LIB "general.lib";
[68e678]22LIB "algebra.lib";
[468f1c]23LIB "ring.lib";
[4b35a90]24///////////////////////////////////////////////////////////////////////////////
25
[4f3359]26proc sortier(def id)
[5b9dd1]27"USAGE:   sortier(id);  id ideal/module
[49f94f]28RETURN:  the same ideal/module but with generators ordered by their
29         leading terms, starting with the smallest
[68e678]30EXAMPLE: example sortier; shows an example
31"
[4b35a90]32{
33  if(size(id)==0)
[49f94f]34  {return(id); }
[4b35a90]35  intvec i=sortvec(id);
36  int j;
[68e678]37  if( typeof(id)=="ideal")
[49f94f]38  { ideal m; }
[68e678]39  if( typeof(id)=="module")
[49f94f]40  { module m; }
41  if( typeof(id)!="ideal" and  typeof(id)!="module")
42  { ERROR("input must be of type ideal or module"); }
43  for (j=1;j<=size(i);j++)
[4b35a90]44  {
45    m[j] = id[i[j]];
46  }
47  return(m);
48}
[82716e]49example
[4b35a90]50{ "EXAMPLE:"; echo = 2;
51   ring q=0,(x,y,z,u,v,w),dp;
52   ideal i=w,x,z,y,v;
[68e678]53   sortier(i);
[4b35a90]54}
55///////////////////////////////////////////////////////////////////////////////
56
[4f3359]57proc derivate (matrix m, def id)
[091424]58"USAGE:  derivate(m,id);  m matrix, id poly/vector/ideal
[b4a463]59ASSUME:  m is an nx1 matrix, where n = number of variables of the basering
[b9b906]60RETURN:  poly/vector/ideal (same type as input), result of applying the
[5b9dd1]61         vector field by the matrix m componentwise to id;
62NOTE:    the vector field is m[1,1]*d/dx(1) +...+ m[1,n]*d/dx(n)
[091424]63EXAMPLE: example derivate; shows an example
[d2b2a7]64"
[b9b906]65{
[68e678]66  ideal I = ideal(id);
67  matrix mh=matrix(jacob(I))*m;
[f054d7f]68  if(typeof(id)=="poly")
69  { poly j = mh[1,1];
[68e678]70  }
71  else
[f054d7f]72  { if (typeof(id)=="vector") { vector j = mh[1]; /*the first column*/ }
73    else { ideal j = ideal(mh[1]);}
[68e678]74  }
75  return(j);
[4b35a90]76}
[82716e]77example
[4b35a90]78{ "EXAMPLE:"; echo = 2;
79   ring q=0,(x,y,z,u,v,w),dp;
80   poly f=2xz-y2;
[68e678]81   matrix m[6][1] =x,y,0,u,v;
[091424]82   derivate(m,f);
[68e678]83   vector v = [2xz-y2,u6-3];
[091424]84   derivate(m,v);
85   derivate(m,ideal(2xz-y2,u6-3));
[4b35a90]86}
87
88///////////////////////////////////////////////////////////////////////////////
89
90proc actionIsProper(matrix m)
[8afd58]91"USAGE:  actionIsProper(m); m matrix
[68e678]92ASSUME:  m is a nx1 matrix, where n = number of variables of the basering
93RETURN:  int = 1, if the action defined by m is proper, 0 if not
94NOTE:    m defines a group action which is the exponential of the vector
95         field  m[1,1]*d/dx(1) +...+ m[1,n]*d/dx(n)
[4b35a90]96EXAMPLE: example actionIsProper; shows an example
[d2b2a7]97"
[4b35a90]98{
99  int i;
100  ideal id=maxideal(1);
101  def bsr=basering;
102
103  //changes the basering bsr to bsr[@t]
[62de185]104  ring s = create_ring(ring_list(basering)[1],"("+varstr(basering)+",@t)","dp","no_minpoly");
[4b35a90]105  poly inv,delta,tee,j;
106  ideal id=imap(bsr,id);
107  matrix @m[size(id)+1][1];
108  @m=imap(bsr,m),0;
[7e5454]109  int auxv;
[4b35a90]110
111  //computes the exp(@t*m)(var(i)) for all i
112  for(i=1;i<=nvars(basering)-1;i++)
113  {
114     inv=var(i);
[091424]115     delta=derivate(@m,inv);
[4b35a90]116     j=1;
[7e5454]117     auxv=1;
[4b35a90]118     tee=@t;
119     while(delta!=0)
120     {
121        inv=inv+1/j*delta*tee;
[7e5454]122        auxv=auxv+1;
123        j=j*auxv;
[4b35a90]124        tee=tee*@t;
[091424]125        delta=derivate(@m,delta);
[4b35a90]126     }
[82716e]127     id=id+ideal(inv);
[4b35a90]128  }
129  i=inSubring(@t,id)[1];
130  setring(bsr);
131  return(i);
132}
[82716e]133example
[4b35a90]134{ "EXAMPLE:"; echo = 2;
135
[68e678]136  ring rf=0,x(1..7),dp;
[4b35a90]137  matrix m[7][1];
138  m[4,1]=x(1)^3;
139  m[5,1]=x(2)^3;
140  m[6,1]=x(3)^3;
141  m[7,1]=(x(1)*x(2)*x(3))^2;
142  actionIsProper(m);
143
[68e678]144  ring rd=0,x(1..5),dp;
[4b35a90]145  matrix m[5][1];
146  m[3,1]=x(1);
147  m[4,1]=x(2);
[dc3a44]148  m[5,1]=1+x(1)*x(4)^2;
[4b35a90]149  actionIsProper(m);
150}
151///////////////////////////////////////////////////////////////////////////////
152
[e801fe]153proc reduction(poly p, ideal dom, list #)
[68e678]154"USAGE:   reduction(p,I[,q,n]); p poly, I ideal, [q monomial, n int (optional)]
155RETURN:  a polynomial equal to  p-H(f1,...,fr), in case the leading
[b9b906]156         term LT(p) of p is of the form H(LT(f1),...,LT(fr)) for some
[68e678]157         polynomial H in r variables over the base field, I=f1,...,fr;
[5b9dd1]158         if q is given, a maximal power a is computed such that q^a divides
[68e678]159         p-H(f1,...,fr), and then (p-H(f1,...,fr))/q^a is returned;
160         return p if no H is found
[5b9dd1]161         if n=1, a different algorithm is chosen which is sometimes faster
[68e678]162         (default: n=0; q and n can be given (or not) in any order)
[b9b906]163NOTE:    this is a kind of SAGBI reduction in the subalgebra K[f1,...,fr] of
[68e678]164         the basering
[4b35a90]165EXAMPLE: example reduction; shows an example
[d2b2a7]166"
[4b35a90]167{
[68e678]168  int i,choose;
169  int z=ncols(dom);
[4b35a90]170  def bsr=basering;
[68e678]171  if( size(#) >0 )
172  { if( typeof(#[1]) == "int")
173    { choose = #[1];
174    }
175    if( typeof(#[1]) == "poly")
176    { poly q = #[1];
177    }
178    if( size(#)>1 )
179    {  if( typeof(#[2]) == "poly")
180       { poly q = #[2];
181       }
182       if( typeof(#[2]) == "int")
183      { choose = #[2];
184      }
185    }
[4b35a90]186  }
[6a0d85]187
[68e678]188  // -------------------- first algorithm (default) -----------------------
189  if ( choose == 0 )
[4b35a90]190  {
[68e678]191     list L = algebra_containment(lead(p),lead(dom),1);
192     if( L[1]==1 )
193     {
194  // the ring L[2] = char(bsr),(x(1..nvars(bsr)),y(1..z)),(dp(n),dp(m)),
[3754ca]195  // contains polynomial check s.t. LT(p) is of the form check(LT(f1),...,LT(fr))
[68e678]196       def s1 = L[2];
197       map psi = s1,maxideal(1),dom;
198       poly re = p - psi(check);
[5b9dd1]199       // divide by the maximal power of #[1]
[5e0891c]200          if ( defined(q) == voice )
[68e678]201          {  while ((re!=0) && (re!=#[1]) &&(subst(re,#[1],0)==0))
202             {  re=re/#[1];
203             }
204          }
205          return(re);
206     }
207  return(p);
[b9b906]208  }
[68e678]209  // ------------------------- second algorithm ---------------------------
210  else
211  {
212  //----------------- arranges the monomial v for elimination -------------
213     poly v=product(maxideal(1));
[82716e]214
[68e678]215  //------------- changes the basering bsr to bsr[@(0),...,@(z)] ----------
[82e5a3]216  list l2 = ring_list(basering)[2];
[f2aefad]217  for (int ii = 0; ii <= z; ii++)
218  {
219    l2[size(l2)+1] = "@("+string(ii)+")";
220  }
[62de185]221  ring s = create_ring(ring_list(basering)[1], l2, "dp", "no_minpoly");
[68e678]222  //constructs the leading ideal of dom=(p-@(0),dom[1]-@(1),...,dom[z]-@(z))
223     ideal dom=imap(bsr,dom);
224     for (i=1;i<=z;i++)
[4b35a90]225     {
[68e678]226        dom[i]=lead(dom[i])-var(nvars(bsr)+i+1);
227     }
228     dom=lead(imap(bsr,p))-@(0),dom;
[5e0891c]229
[68e678]230  //---------- eliminates the variables of the basering bsr --------------
231  //i.e. computes dom intersected with K[@(0),...,@(z)] (this is hard)
232  //### hier Variante analog zu algebra_containment einbauen!
233     ideal kern=eliminate(dom,imap(bsr,v));
234
[417a505]235  //---------  test whether @(0)-h(@(1),...,@(z)) is in ker ---------------
[3754ca]236  // for some polynomial h and divide by maximal power of q=#[1]
[68e678]237     poly h;
238     z=size(kern);
239     for (i=1;i<=z;i++)
240     {
241        h=kern[i]/@(0);
242        if (deg(h)==0)
243        {  h=(1/h)*kern[i];
244        // define the map psi : s ---> bsr defined by @(i) ---> p,dom[i]
245           setring bsr;
246           map psi=s,maxideal(1),p,dom;
247           poly re=psi(h);
[5b9dd1]248           // divide by the maximal power of #[1]
[68e678]249           if (size(#)>0)
250           {  while ((re!=0) && (re!=#[1]) &&(subst(re,#[1],0)==0))
251              {  re=re/#[1];
252              }
[4b35a90]253           }
[68e678]254           return(re);
[4b35a90]255        }
256     }
[68e678]257     setring bsr;
258     return(p);
[4b35a90]259  }
260}
[091424]261
[82716e]262example
[4b35a90]263{ "EXAMPLE:"; echo = 2;
264   ring q=0,(x,y,z,u,v,w),dp;
265   poly p=x2yz-x2v;
[e801fe]266   ideal dom =x-w,u2w+1,yz-v;
267   reduction(p,dom);
268   reduction(p,dom,w);
[4b35a90]269}
270
271///////////////////////////////////////////////////////////////////////////////
272
[e801fe]273proc completeReduction(poly p, ideal dom, list #)
[68e678]274"USAGE:   completeReduction(p,I[,q,n]); p poly, I ideal, [q monomial, n int]
[b4a463]275RETURN:  a polynomial, the SAGBI reduction of the polynomial p with respect to I
[68e678]276         via the procedure 'reduction' as long as possible
[5b9dd1]277         if n=1, a different algorithm is chosen which is sometimes faster
[68e678]278         (default: n=0; q and n can be given (or not) in any order)
279NOTE:    help reduction; shows an explanation of SAGBI reduction
[4b35a90]280EXAMPLE: example completeReduction; shows an example
[d2b2a7]281"
[4b35a90]282{
283  poly p1=p;
[e801fe]284  poly p2=reduction(p,dom,#);
[4b35a90]285  while (p1!=p2)
286  {
287    p1=p2;
[e801fe]288    p2=reduction(p1,dom,#);
[4b35a90]289  }
290  return(p2);
291}
[82716e]292example
[4b35a90]293{ "EXAMPLE:"; echo = 2;
294   ring q=0,(x,y,z,u,v,w),dp;
295   poly p=x2yz-x2v;
[e801fe]296   ideal dom =x-w,u2w+1,yz-v;
297   completeReduction(p,dom);
298   completeReduction(p,dom,w);
[4b35a90]299}
300
301///////////////////////////////////////////////////////////////////////////////
302
[6a0d85]303proc completeReductionnew(poly p, ideal dom, list #)
304"USAGE:   completeReduction(p,I[,q,n]); p poly, I ideal, [q monomial, n int]
305RETURN:  a polynomial, the SAGBI reduction of the polynomial p with I
306         via the procedure 'reduction' as long as possible
[5b9dd1]307         if n=1, a different algorithm is chosen which is sometimes faster
[6a0d85]308         (default: n=0; q and n can be given (or not) in any order)
309NOTE:    help reduction; shows an explanation of SAGBI reduction
310EXAMPLE: example completeReduction; shows an example
311"
312{
313  if(p==0)
314  {
315     return(p);
316  }
317  poly p1=p;
318  poly p2=reduction(p,dom,#);
319  while (p1!=p2)
320  {
321    p1=p2;
322    p2=reduction(p1,dom,#);
323  }
324  poly re=lead(p2)+completeReduction(p2-lead(p2),dom,#);
325  return(re);
326}
327
328///////////////////////////////////////////////////////////////////////////////
329
[4b35a90]330proc localInvar(matrix m, poly p, poly q, poly h)
[68e678]331"USAGE:   localInvar(m,p,q,h); m matrix, p,q,h polynomials
[5b9dd1]332ASSUME:  m(q) and h are invariant under the vector field m, i.e. m(m(q))=m(h)=0
[68e678]333         h must be a ring variable
[5b9dd1]334RETURN:  a polynomial, the invariant polynomial of the vector field
[51d95b]335@format
336         m = m[1,1]*d/dx(1) +...+ m[n,1]*d/dx(n)
337@end format
[b9b906]338         with respect to p,q,h. It is defined as follows: set inv = p if p is
[b4a463]339         invariant, and else set
[68e678]340         inv = m(q)^N * sum_i=1..N-1{ (-1)^i*(1/i!)*m^i(p)*(q/m(q))^i }
[b4a463]341         where m^N(p) = 0,  m^(N-1)(p) != 0; the result is inv divided by h
342         as often as possible
[4b35a90]343EXAMPLE: example localInvar; shows an example
[d2b2a7]344"
[4b35a90]345{
[091424]346  if ((derivate(m,h) !=0) || (derivate(m,derivate(m,q)) !=0))
[4b35a90]347  {
[68e678]348    "//the last two polynomials of the input must be invariant functions";
[4b35a90]349    return(q);
350  }
[68e678]351  int ii,k;
352  for ( k=1; k <= nvars(basering); k++  )
353  {  if (h == var(k))
354     { ii=1;
355     }
356  }
357  if( ii==0 )
358  {  "// the last argument must be a ring variable";
359     return(q);
360  }
[b9b906]361
[4b35a90]362  poly inv=p;
[091424]363  poly dif= derivate(m,inv);
364  poly a=derivate(m,q);
[4b35a90]365  poly sgn=-1;
366  poly coeff=sgn*q;
[68e678]367  k=1;
[4b35a90]368  if (dif==0)
369  {
370    return(inv);
371  }
[82716e]372  while (dif!=0)
[4b35a90]373  {
374    inv=(a*inv)+(coeff*dif);
[091424]375    dif=derivate(m,dif);
[4b35a90]376    k=k+1;
377    coeff=q*coeff*sgn/k;
378  }
379  while ((inv!=0) && (inv!=h) &&(subst(inv,h,0)==0))
380 {
381   inv=inv/h;
382  }
383  return(inv);
384}
[82716e]385example
[4b35a90]386{ "EXAMPLE:"; echo = 2;
387   ring q=0,(x,y,z),dp;
388   matrix m[3][1];
389   m[2,1]=x;
390   m[3,1]=y;
391   poly in=localInvar(m,z,y,x);
392   in;
393}
394///////////////////////////////////////////////////////////////////////////////
395
[68e678]396proc furtherInvar(matrix m, ideal id, ideal karl, poly q, list #)
397"USAGE:   furtherInvar(m,id,karl,q); m matrix, id,karl ideals, q poly, n int
[5b9dd1]398ASSUME:  karl,id,q are invariant under the vector field m,
[68e678]399         moreover, q must be a variable
[b9b906]400RETURN:  list of two ideals, the first ideal contains further invariants of
[5b9dd1]401         the vector field
[51d95b]402@format
403         m = sum m[i,1]*d/dx(i) with respect to id,p,q,
404@end format
[b9b906]405         i.e. we compute elements in the (invariant) subring generated by id
[b4a463]406         which are divisible by q and divide them by q as often as possible.
407         The second ideal contains all invariants given before.
408         If n=1, a different algorithm is chosen which is sometimes faster
[68e678]409         (default: n=0)
[4b35a90]410EXAMPLE: example furtherInvar; shows an example
[d2b2a7]411"
[4b35a90]412{
[68e678]413  list ll = q;
414  if ( size(#)>0 )
415  {  ll = ll+list(#[1]);
[b9b906]416  }
[4b35a90]417  int i;
[694a1e]418  ideal null,eins;
[68e678]419  int z=ncols(id);
[4b35a90]420  intvec v;
[68e678]421  def br=basering;
[4b35a90]422  ideal su;
[f054d7f]423  list @l;
[68e678]424  for (i=1; i<=z; i++)
[4b35a90]425  {
[b9b906]426    su[i]=subst(id[i],q,0);
[f054d7f]427    @l[i]="y("+string(i)+")";
[4b35a90]428  }
[68e678]429  // -- define the map phi : r1 ---> br defined by y(i) ---> id[i](q=0) --
[f054d7f]430  def r1=ring(list(ring_list(br)[1],@l,list(list("dp",1:z)),ideal(0)));
[68e678]431  setring br;
[4b35a90]432  map phi=r1,su;
[82716e]433  setring r1;
[68e678]434  // --------------- compute the kernel of phi ---------------------------
435  ideal ker=preimage(br,phi,null);
[6a0d85]436  ker=mstd(ker)[2];
[68e678]437  // ---- define the map psi : r1 ---> br defined by y(i) ---> id[i] -----
438  setring br;
[4b35a90]439  map psi=r1,id;
[68e678]440  // -------------------  compute psi(ker(phi)) --------------------------
[4b35a90]441  ideal rel=psi(ker);
[417a505]442  // divide by maximal power of q, test whether we really obtain invariants
[4b35a90]443  for (i=1;i<=size(rel);i++)
444  {
445    while ((rel[i]!=0) && (rel[i]!=q) &&(subst(rel[i],q,0)==0))
446    {
447      rel[i]=rel[i]/q;
[091424]448      if (derivate(m,rel[i])!=0)
[4b35a90]449      {
[68e678]450         "// error in furtherInvar, function not invariant:";
[4b35a90]451         rel[i];
452      }
453    }
454    rel[i]=simplify(rel[i],1);
455  }
[68e678]456  // ---------------------------------------------------------------------
[b9b906]457  // test whether some variables occur linearly and then delete the
[68e678]458  // corresponding invariant function
[4b35a90]459  setring r1;
460  int j;
461  for (i=1;i<=size(ker);i=i+1)
462  {
463     for (j=1;j<=z;j++)
464     {
465        if (deg(ker[i]/y(j))==0)
466        {
[68e678]467           setring br;
468           rel[i]= completeReduction(rel[i],karl,ll);
[4b35a90]469           if(rel[i]!=0)
470           {
471              karl[j+1]=rel[i];
472              rel[i]=0;
[694a1e]473              eins=1;
[4b35a90]474           }
475           setring r1;
476        }
477     }
[82716e]478
[4b35a90]479  }
[68e678]480  setring br;
[694a1e]481  rel=rel+null;
482  if(size(rel)==0){rel=eins;}
483  list l=rel,karl;
[4b35a90]484  return(l);
485}
[82716e]486example
[4b35a90]487{ "EXAMPLE:"; echo = 2;
488   ring r=0,(x,y,z,u),dp;
489   matrix m[4][1];
490   m[2,1]=x;
491   m[3,1]=y;
492   m[4,1]=z;
493   ideal id=localInvar(m,z,y,x),localInvar(m,u,y,x);
494   ideal karl=id,x;
495   list in=furtherInvar(m,id,karl,x);
496   in;
497}
498///////////////////////////////////////////////////////////////////////////////
499
[091424]500proc invariantRing(matrix m, poly p, poly q, int b, list #)
501"USAGE:   invariantRing(m,p,q,b[,r,pa]); m matrix, p,q poly, b,r int, pa string
[68e678]502ASSUME:  p,q variables with m(p)=q and q invariant under m
[b9b906]503         i.e. if p=x(i) and q=x(j) then m[j,1]=0 and m[i,1]=x(j)
504RETURN:  ideal, containing generators of the ring of invariants of the
[5b9dd1]505         additive group (K,+) given by the vector field
[51d95b]506@format
507         m = m[1,1]*d/dx(1) +...+ m[n,1]*d/dx(n).
508@end format
[b9b906]509         If b>0 the computation stops after all invariants of degree <= b
510         (and at least one of higher degree) are found or when all invariants
[68e678]511         are computed.
[b9b906]512         If b<=0, the computation continues until all generators
[68e678]513         of the ring of invariants are computed (should be used only if the
[b4a463]514         ring of invariants is known to be finitely generated, otherwise the
[091424]515         algorithm might not stop).
[68e678]516         If r=1 a different reduction is used which is sometimes faster
[b9b906]517         (default r=0).
518DISPLAY: if pa is given (any string as 5th or 6th argument), the computation
[68e678]519         pauses whenever new invariants are found and displays them
[b4a463]520THEORY:  The algorithm for computing the ring of invariants works in char 0
521         or suffiently large characteristic.
522         (K,+) acts as the exponential of the vector field defined by the
523         matrix m.
524         For background see G.-M. Greuel, G. Pfister,
525         Geometric quotients of unipotent group actions, Proc.
[5b9dd1]526         London Math. Soc. (3) 67, 75-105 (1993).
[b9b906]527EXAMPLE: example invariantRing; shows an example
[d2b2a7]528"
[4b35a90]529{
530  ideal j;
531  int i,it;
[68e678]532  list ll=q;
[091424]533  int bou=b;
[68e678]534  if( size(#) >0 )
535  { if( typeof(#[1]) == "int")
536    { ll=ll+list(#[1]);
537    }
538    if( typeof(#[1]) == "string")
539    { string pau=#[1];
540    }
541    if( size(#)>1 )
[3ed41c]542    {
543      if( typeof(#[2]) == "string")
544      { string pau=#[2];
545      }
546      if( typeof(#[2]) == "int")
[68e678]547      { ll=ll+list(#[2]);
548      }
549    }
[4b35a90]550  }
[82716e]551  int z;
[4b35a90]552  ideal karl;
553  ideal k1=1;
554  list k2;
[68e678]555  //------------------ computation of local invariants ------------------
[4b35a90]556  for (i=1;i<=nvars(basering);i++)
557  {
558    karl=karl+localInvar(m,var(i),p,q);
559  }
[091424]560  if( defined(pau) )
[68e678]561  {  "";
562     "// local invariants computed:";
563     "";
[4b35a90]564     karl;
[68e678]565     "";
[5e0891c]566     pause("// hit return key to continue!");
567     "";
[4b35a90]568  }
[68e678]569  //------------------ computation of further invariants ----------------
[4b35a90]570  it=0;
571  while (size(k1)!=0)
[68e678]572  {
[82716e]573    // test if the new invariants are already in the ring generated
[68e678]574    // by the invariants we constructed so far
[4b35a90]575    it++;
576    karl=sortier(karl);
577    j=q;
578    for (i=1;i<=size(karl);i++)
579    {
[68e678]580       j=j + simplify(completeReduction(karl[i],j,ll),1);
[4b35a90]581    }
582    karl=j;
583    j[1]=0;
584    j=simplify(j,2);
585    k2=furtherInvar(m,j,karl,q);
586    k1=k2[1];
587    karl=k2[2];
[694a1e]588    if(k1[1]!=1)
[5e0891c]589    {
[694a1e]590       k1=sortier(k1);
591       z=size(k1);
592       for (i=1;i<=z;i++)
593       {
594          k1[i]= completeReduction(k1[i],karl,ll);
595          if (k1[i]!=0)
596          {
597            karl=karl+simplify(k1[i],1);
598          }
599       }
600       if( defined(pau) == voice)
601       {
[68e678]602       "// the invariants after",it,"iteration(s):"; "";
603       karl;"";
[5e0891c]604       pause("// hit return key to continue!");
[68e678]605       "";
[694a1e]606       }
607       if( (bou>0) && (size(k1)>0) )
608       {
609         if( deg(k1[size(k1)])>bou )
610        {
611            return(karl);
612        }
[4b35a90]613      }
614    }
615  }
616  return(karl);
617}
[82716e]618example
[4b35a90]619{ "EXAMPLE:"; echo = 2;
620
[091424]621  //Winkelmann: free action but Spec(k[x(1),...,x(5)]) --> Spec(invariant ring)
[68e678]622  //is not surjective
[82716e]623
[4b35a90]624  ring rw=0,(x(1..5)),dp;
625  matrix m[5][1];
626  m[3,1]=x(1);
627  m[4,1]=x(2);
628  m[5,1]=1+x(1)*x(4)+x(2)*x(3);
[091424]629  ideal in=invariantRing(m,x(3),x(1),0);      //compute full invarint ring
[4b35a90]630  in;
[82716e]631
[4b35a90]632  //Deveney/Finston: The ring of invariants is not finitely generated
[82716e]633
[4b35a90]634  ring rf=0,(x(1..7)),dp;
635  matrix m[7][1];
636  m[4,1]=x(1)^3;
637  m[5,1]=x(2)^3;
638  m[6,1]=x(3)^3;
639  m[7,1]=(x(1)*x(2)*x(3))^2;
[68e678]640  ideal in=invariantRing(m,x(4),x(1),6);      //all invariants up to degree 6
[4b35a90]641  in;
[68e678]642}
643///////////////////////////////////////////////////////////////////////////////
644/*             Further examplex
[b9b906]645
[68e678]646  //Deveney/Finston: Proper Ga-action which is not locally trivial
[4b35a90]647  //r[x(1),...,x(5)] is not flat over the ring of invariants
[68e678]648  LIB "invar.lib";
[4b35a90]649  ring rd=0,(x(1..5)),dp;
650  matrix m[5][1];
651  m[3,1]=x(1);
652  m[4,1]=x(2);
653  m[5,1]=1+x(1)*x(4)^2;
[68e678]654  ideal in=invariantRing(m,x(3),x(1),0,1);
[4b35a90]655  in;
[82716e]656
[4b35a90]657  actionIsProper(m);
[82716e]658
[68e678]659  //compute the algebraic relations between the invariants
[4b35a90]660  int z=size(in);
661  ideal null;
662  ring r1=0,(y(1..z)),dp;
663  setring rd;
664  map phi=r1,in;
[82716e]665  setring r1;
666  ideal ker=preimage(rd,phi,null);
[4b35a90]667  ker;
[82716e]668
[4b35a90]669  //the discriminant
[82716e]670
[4b35a90]671  ring r=0,(x(1..2),y(1..2),z,t),dp;
672  poly p=z+(1+x(1)*y(2)^2)*t+x(1)*y(1)*y(2)*t^2+(1/3)*x(1)*y(1)^2*t^3;
[82716e]673
[4b35a90]674  matrix m[5][5];
675  m[1,1]=z;
676  m[1,2]=x(1)*y(2)^2+1;
677  m[1,3]=x(1)*y(1)*y(2);
678  m[1,4]=1/3*x(1)*y(1)^2;
679  m[1,5]=0;
680  m[2,1]=0;
681  m[2,2]=z;
682  m[2,3]=x(1)*y(2)^2+1;
683  m[2,4]=x(1)*y(1)*y(2);
684  m[2,5]=1/3*x(1)*y(1)^2;
685  m[3,1]=x(1)*y(2)^2+1;
686  m[3,2]=2*x(1)*y(1)*y(2);
687  m[3,3]=x(1)*y(1)^2;
688  m[3,4]=0;
689  m[3,5]=0;
690  m[4,1]=0;
691  m[4,2]=x(1)*y(2)^2+1;
692  m[4,3]=2*x(1)*y(1)*y(2);
693  m[4,4]=x(1)*y(1)^2;
694  m[4,5]=0;
695  m[5,1]=0;
696  m[5,2]=0;
697  m[5,3]=x(1)*y(2)^2+1;
698  m[5,4]=2*x(1)*y(1)*y(2);
699  m[5,5]=x(1)*y(1)^2;
[82716e]700
[4b35a90]701  poly disc=9*det(m)/(x(1)^2*y(1)^4);
[82716e]702
[68e678]703  LIB "invar.lib";
[4b35a90]704  matrix n[6][1];
705  n[2,1]=x(1);
706  n[4,1]=y(1);
707  n[5,1]=1+x(1)*y(2)^2;
[82716e]708
[091424]709  derivate(n,disc);
[82716e]710
[68e678]711//x(1)^3*y(2)^6-6*x(1)^2*y(1)*y(2)^3*z+6*x(1)^2*y(2)^4+9*x(1)*y(1)^2*z^2-18*x(1)*y(1)*y(2)*z+9*x(1)*y(2)^2+4
[82716e]712
[68e678]713//////////////////////////////////////////////////////////////////////////////
714//constructive approach to Weizenboecks theorem
[82716e]715
[68e678]716  int n=5;
717  // int n=6;  //limit
718  ring w=32003,(x(1..n)),wp(1..n);
[82716e]719
[5b9dd1]720  // definition of the vector field m=sum m[i]*d/dx(i)
[4b35a90]721  matrix m[n][1];
722  int i;
723  for (i=1;i<=n-1;i=i+1)
724  {
725    m[i+1,1]=x(i);
726  }
[68e678]727  ideal in=invariantRing(m,x(2),x(1),0,"");
[6a0d85]728
[4b35a90]729  in;
[68e678]730*/
Note: See TracBrowser for help on using the repository browser.