source: git/Singular/LIB/ainvar.lib

spielwiese
Last change on this file was f054d7f, checked in by Hans Schoenemann <hannes@…>, 14 months ago
fix: remove some execute from ainvar, brnoeth, chern.lib
  • Property mode set to 100644
File size: 19.7 KB
Line 
1//////////////////////////////////////////////////////////////////////////////
2version="version ainvar.lib 4.3.1.3 Feb_2023 "; // $Id$
3category="Invariant theory";
4info="
5LIBRARY: ainvar.lib    Invariant Rings of the Additive Group
6AUTHORS: Gerhard Pfister (email: pfister@mathematik.uni-kl.de),
7         Gert-Martin Greuel (email: greuel@mathematik.uni-kl.de)
8
9PROCEDURES:
10  invariantRing(m..);  compute ring of invariants of (K,+)-action given by m
11  derivate(m,f);       derivation of f with respect to the vector field m
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
14  completeReduction(); complete SAGBI reduction
15  localInvar(m,p..);   invariant polynomial under m computed from p,...
16  furtherInvar(m..);   compute further invariants of m from the given ones
17  sortier(id);         sorts generators of id by increasing leading terms
18";
19
20LIB "inout.lib";
21LIB "general.lib";
22LIB "algebra.lib";
23LIB "ring.lib";
24///////////////////////////////////////////////////////////////////////////////
25
26proc sortier(def id)
27"USAGE:   sortier(id);  id ideal/module
28RETURN:  the same ideal/module but with generators ordered by their
29         leading terms, starting with the smallest
30EXAMPLE: example sortier; shows an example
31"
32{
33  if(size(id)==0)
34  {return(id); }
35  intvec i=sortvec(id);
36  int j;
37  if( typeof(id)=="ideal")
38  { ideal m; }
39  if( typeof(id)=="module")
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++)
44  {
45    m[j] = id[i[j]];
46  }
47  return(m);
48}
49example
50{ "EXAMPLE:"; echo = 2;
51   ring q=0,(x,y,z,u,v,w),dp;
52   ideal i=w,x,z,y,v;
53   sortier(i);
54}
55///////////////////////////////////////////////////////////////////////////////
56
57proc derivate (matrix m, def id)
58"USAGE:  derivate(m,id);  m matrix, id poly/vector/ideal
59ASSUME:  m is an nx1 matrix, where n = number of variables of the basering
60RETURN:  poly/vector/ideal (same type as input), result of applying the
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)
63EXAMPLE: example derivate; shows an example
64"
65{
66  ideal I = ideal(id);
67  matrix mh=matrix(jacob(I))*m;
68  if(typeof(id)=="poly")
69  { poly j = mh[1,1];
70  }
71  else
72  { if (typeof(id)=="vector") { vector j = mh[1]; /*the first column*/ }
73    else { ideal j = ideal(mh[1]);}
74  }
75  return(j);
76}
77example
78{ "EXAMPLE:"; echo = 2;
79   ring q=0,(x,y,z,u,v,w),dp;
80   poly f=2xz-y2;
81   matrix m[6][1] =x,y,0,u,v;
82   derivate(m,f);
83   vector v = [2xz-y2,u6-3];
84   derivate(m,v);
85   derivate(m,ideal(2xz-y2,u6-3));
86}
87
88///////////////////////////////////////////////////////////////////////////////
89
90proc actionIsProper(matrix m)
91"USAGE:  actionIsProper(m); m matrix
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)
96EXAMPLE: example actionIsProper; shows an example
97"
98{
99  int i;
100  ideal id=maxideal(1);
101  def bsr=basering;
102
103  //changes the basering bsr to bsr[@t]
104  ring s = create_ring(ring_list(basering)[1],"("+varstr(basering)+",@t)","dp","no_minpoly");
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;
109  int auxv;
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);
115     delta=derivate(@m,inv);
116     j=1;
117     auxv=1;
118     tee=@t;
119     while(delta!=0)
120     {
121        inv=inv+1/j*delta*tee;
122        auxv=auxv+1;
123        j=j*auxv;
124        tee=tee*@t;
125        delta=derivate(@m,delta);
126     }
127     id=id+ideal(inv);
128  }
129  i=inSubring(@t,id)[1];
130  setring(bsr);
131  return(i);
132}
133example
134{ "EXAMPLE:"; echo = 2;
135
136  ring rf=0,x(1..7),dp;
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
144  ring rd=0,x(1..5),dp;
145  matrix m[5][1];
146  m[3,1]=x(1);
147  m[4,1]=x(2);
148  m[5,1]=1+x(1)*x(4)^2;
149  actionIsProper(m);
150}
151///////////////////////////////////////////////////////////////////////////////
152
153proc reduction(poly p, ideal dom, list #)
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
156         term LT(p) of p is of the form H(LT(f1),...,LT(fr)) for some
157         polynomial H in r variables over the base field, I=f1,...,fr;
158         if q is given, a maximal power a is computed such that q^a divides
159         p-H(f1,...,fr), and then (p-H(f1,...,fr))/q^a is returned;
160         return p if no H is found
161         if n=1, a different algorithm is chosen which is sometimes faster
162         (default: n=0; q and n can be given (or not) in any order)
163NOTE:    this is a kind of SAGBI reduction in the subalgebra K[f1,...,fr] of
164         the basering
165EXAMPLE: example reduction; shows an example
166"
167{
168  int i,choose;
169  int z=ncols(dom);
170  def bsr=basering;
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    }
186  }
187
188  // -------------------- first algorithm (default) -----------------------
189  if ( choose == 0 )
190  {
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)),
195  // contains polynomial check s.t. LT(p) is of the form check(LT(f1),...,LT(fr))
196       def s1 = L[2];
197       map psi = s1,maxideal(1),dom;
198       poly re = p - psi(check);
199       // divide by the maximal power of #[1]
200          if ( defined(q) == voice )
201          {  while ((re!=0) && (re!=#[1]) &&(subst(re,#[1],0)==0))
202             {  re=re/#[1];
203             }
204          }
205          return(re);
206     }
207  return(p);
208  }
209  // ------------------------- second algorithm ---------------------------
210  else
211  {
212  //----------------- arranges the monomial v for elimination -------------
213     poly v=product(maxideal(1));
214
215  //------------- changes the basering bsr to bsr[@(0),...,@(z)] ----------
216  list l2 = ring_list(basering)[2];
217  for (int ii = 0; ii <= z; ii++)
218  {
219    l2[size(l2)+1] = "@("+string(ii)+")";
220  }
221  ring s = create_ring(ring_list(basering)[1], l2, "dp", "no_minpoly");
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++)
225     {
226        dom[i]=lead(dom[i])-var(nvars(bsr)+i+1);
227     }
228     dom=lead(imap(bsr,p))-@(0),dom;
229
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
235  //---------  test whether @(0)-h(@(1),...,@(z)) is in ker ---------------
236  // for some polynomial h and divide by maximal power of q=#[1]
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);
248           // divide by the maximal power of #[1]
249           if (size(#)>0)
250           {  while ((re!=0) && (re!=#[1]) &&(subst(re,#[1],0)==0))
251              {  re=re/#[1];
252              }
253           }
254           return(re);
255        }
256     }
257     setring bsr;
258     return(p);
259  }
260}
261
262example
263{ "EXAMPLE:"; echo = 2;
264   ring q=0,(x,y,z,u,v,w),dp;
265   poly p=x2yz-x2v;
266   ideal dom =x-w,u2w+1,yz-v;
267   reduction(p,dom);
268   reduction(p,dom,w);
269}
270
271///////////////////////////////////////////////////////////////////////////////
272
273proc completeReduction(poly p, ideal dom, list #)
274"USAGE:   completeReduction(p,I[,q,n]); p poly, I ideal, [q monomial, n int]
275RETURN:  a polynomial, the SAGBI reduction of the polynomial p with respect to I
276         via the procedure 'reduction' as long as possible
277         if n=1, a different algorithm is chosen which is sometimes faster
278         (default: n=0; q and n can be given (or not) in any order)
279NOTE:    help reduction; shows an explanation of SAGBI reduction
280EXAMPLE: example completeReduction; shows an example
281"
282{
283  poly p1=p;
284  poly p2=reduction(p,dom,#);
285  while (p1!=p2)
286  {
287    p1=p2;
288    p2=reduction(p1,dom,#);
289  }
290  return(p2);
291}
292example
293{ "EXAMPLE:"; echo = 2;
294   ring q=0,(x,y,z,u,v,w),dp;
295   poly p=x2yz-x2v;
296   ideal dom =x-w,u2w+1,yz-v;
297   completeReduction(p,dom);
298   completeReduction(p,dom,w);
299}
300
301///////////////////////////////////////////////////////////////////////////////
302
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
307         if n=1, a different algorithm is chosen which is sometimes faster
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
330proc localInvar(matrix m, poly p, poly q, poly h)
331"USAGE:   localInvar(m,p,q,h); m matrix, p,q,h polynomials
332ASSUME:  m(q) and h are invariant under the vector field m, i.e. m(m(q))=m(h)=0
333         h must be a ring variable
334RETURN:  a polynomial, the invariant polynomial of the vector field
335@format
336         m = m[1,1]*d/dx(1) +...+ m[n,1]*d/dx(n)
337@end format
338         with respect to p,q,h. It is defined as follows: set inv = p if p is
339         invariant, and else set
340         inv = m(q)^N * sum_i=1..N-1{ (-1)^i*(1/i!)*m^i(p)*(q/m(q))^i }
341         where m^N(p) = 0,  m^(N-1)(p) != 0; the result is inv divided by h
342         as often as possible
343EXAMPLE: example localInvar; shows an example
344"
345{
346  if ((derivate(m,h) !=0) || (derivate(m,derivate(m,q)) !=0))
347  {
348    "//the last two polynomials of the input must be invariant functions";
349    return(q);
350  }
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  }
361
362  poly inv=p;
363  poly dif= derivate(m,inv);
364  poly a=derivate(m,q);
365  poly sgn=-1;
366  poly coeff=sgn*q;
367  k=1;
368  if (dif==0)
369  {
370    return(inv);
371  }
372  while (dif!=0)
373  {
374    inv=(a*inv)+(coeff*dif);
375    dif=derivate(m,dif);
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}
385example
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
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
398ASSUME:  karl,id,q are invariant under the vector field m,
399         moreover, q must be a variable
400RETURN:  list of two ideals, the first ideal contains further invariants of
401         the vector field
402@format
403         m = sum m[i,1]*d/dx(i) with respect to id,p,q,
404@end format
405         i.e. we compute elements in the (invariant) subring generated by id
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
409         (default: n=0)
410EXAMPLE: example furtherInvar; shows an example
411"
412{
413  list ll = q;
414  if ( size(#)>0 )
415  {  ll = ll+list(#[1]);
416  }
417  int i;
418  ideal null,eins;
419  int z=ncols(id);
420  intvec v;
421  def br=basering;
422  ideal su;
423  list @l;
424  for (i=1; i<=z; i++)
425  {
426    su[i]=subst(id[i],q,0);
427    @l[i]="y("+string(i)+")";
428  }
429  // -- define the map phi : r1 ---> br defined by y(i) ---> id[i](q=0) --
430  def r1=ring(list(ring_list(br)[1],@l,list(list("dp",1:z)),ideal(0)));
431  setring br;
432  map phi=r1,su;
433  setring r1;
434  // --------------- compute the kernel of phi ---------------------------
435  ideal ker=preimage(br,phi,null);
436  ker=mstd(ker)[2];
437  // ---- define the map psi : r1 ---> br defined by y(i) ---> id[i] -----
438  setring br;
439  map psi=r1,id;
440  // -------------------  compute psi(ker(phi)) --------------------------
441  ideal rel=psi(ker);
442  // divide by maximal power of q, test whether we really obtain invariants
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;
448      if (derivate(m,rel[i])!=0)
449      {
450         "// error in furtherInvar, function not invariant:";
451         rel[i];
452      }
453    }
454    rel[i]=simplify(rel[i],1);
455  }
456  // ---------------------------------------------------------------------
457  // test whether some variables occur linearly and then delete the
458  // corresponding invariant function
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        {
467           setring br;
468           rel[i]= completeReduction(rel[i],karl,ll);
469           if(rel[i]!=0)
470           {
471              karl[j+1]=rel[i];
472              rel[i]=0;
473              eins=1;
474           }
475           setring r1;
476        }
477     }
478
479  }
480  setring br;
481  rel=rel+null;
482  if(size(rel)==0){rel=eins;}
483  list l=rel,karl;
484  return(l);
485}
486example
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
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
502ASSUME:  p,q variables with m(p)=q and q invariant under m
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
505         additive group (K,+) given by the vector field
506@format
507         m = m[1,1]*d/dx(1) +...+ m[n,1]*d/dx(n).
508@end format
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
511         are computed.
512         If b<=0, the computation continues until all generators
513         of the ring of invariants are computed (should be used only if the
514         ring of invariants is known to be finitely generated, otherwise the
515         algorithm might not stop).
516         If r=1 a different reduction is used which is sometimes faster
517         (default r=0).
518DISPLAY: if pa is given (any string as 5th or 6th argument), the computation
519         pauses whenever new invariants are found and displays them
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.
526         London Math. Soc. (3) 67, 75-105 (1993).
527EXAMPLE: example invariantRing; shows an example
528"
529{
530  ideal j;
531  int i,it;
532  list ll=q;
533  int bou=b;
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 )
542    {
543      if( typeof(#[2]) == "string")
544      { string pau=#[2];
545      }
546      if( typeof(#[2]) == "int")
547      { ll=ll+list(#[2]);
548      }
549    }
550  }
551  int z;
552  ideal karl;
553  ideal k1=1;
554  list k2;
555  //------------------ computation of local invariants ------------------
556  for (i=1;i<=nvars(basering);i++)
557  {
558    karl=karl+localInvar(m,var(i),p,q);
559  }
560  if( defined(pau) )
561  {  "";
562     "// local invariants computed:";
563     "";
564     karl;
565     "";
566     pause("// hit return key to continue!");
567     "";
568  }
569  //------------------ computation of further invariants ----------------
570  it=0;
571  while (size(k1)!=0)
572  {
573    // test if the new invariants are already in the ring generated
574    // by the invariants we constructed so far
575    it++;
576    karl=sortier(karl);
577    j=q;
578    for (i=1;i<=size(karl);i++)
579    {
580       j=j + simplify(completeReduction(karl[i],j,ll),1);
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];
588    if(k1[1]!=1)
589    {
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       {
602       "// the invariants after",it,"iteration(s):"; "";
603       karl;"";
604       pause("// hit return key to continue!");
605       "";
606       }
607       if( (bou>0) && (size(k1)>0) )
608       {
609         if( deg(k1[size(k1)])>bou )
610        {
611            return(karl);
612        }
613      }
614    }
615  }
616  return(karl);
617}
618example
619{ "EXAMPLE:"; echo = 2;
620
621  //Winkelmann: free action but Spec(k[x(1),...,x(5)]) --> Spec(invariant ring)
622  //is not surjective
623
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);
629  ideal in=invariantRing(m,x(3),x(1),0);      //compute full invarint ring
630  in;
631
632  //Deveney/Finston: The ring of invariants is not finitely generated
633
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;
640  ideal in=invariantRing(m,x(4),x(1),6);      //all invariants up to degree 6
641  in;
642}
643///////////////////////////////////////////////////////////////////////////////
644/*             Further examplex
645
646  //Deveney/Finston: Proper Ga-action which is not locally trivial
647  //r[x(1),...,x(5)] is not flat over the ring of invariants
648  LIB "invar.lib";
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;
654  ideal in=invariantRing(m,x(3),x(1),0,1);
655  in;
656
657  actionIsProper(m);
658
659  //compute the algebraic relations between the invariants
660  int z=size(in);
661  ideal null;
662  ring r1=0,(y(1..z)),dp;
663  setring rd;
664  map phi=r1,in;
665  setring r1;
666  ideal ker=preimage(rd,phi,null);
667  ker;
668
669  //the discriminant
670
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;
673
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;
700
701  poly disc=9*det(m)/(x(1)^2*y(1)^4);
702
703  LIB "invar.lib";
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;
708
709  derivate(n,disc);
710
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
712
713//////////////////////////////////////////////////////////////////////////////
714//constructive approach to Weizenboecks theorem
715
716  int n=5;
717  // int n=6;  //limit
718  ring w=32003,(x(1..n)),wp(1..n);
719
720  // definition of the vector field m=sum m[i]*d/dx(i)
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  }
727  ideal in=invariantRing(m,x(2),x(1),0,"");
728
729  in;
730*/
Note: See TracBrowser for help on using the repository browser.