source: git/Singular/LIB/JMSConst.lib @ f999689

fieker-DuValspielwiese
Last change on this file since f999689 was f999689, checked in by Hans Schoenemann <hannes@…>, 9 years ago
chnaged: Presolve::findvars: see variables
  • Property mode set to 100644
File size: 29.0 KB
Line 
1//////////////////////////////////////////////////////////////////////
2version="version JMSConst.lib 4.0.0.0 Jun_2013 "; // $Id$
3category="Algebraic Geometry";
4// summary description of the library
5info="
6LIBRARY:   JMSConst.lib  A library for Singular which constructs J-Marked Schemes.
7AUTHOR:    Michela Ceria, email: michela.ceria@unito.it
8
9SEE ALSO:  JMBTest_lib
10
11KEYWORDS:  J-marked schemes, Borel ideals
12
13OVERVIEW:
14The library performs the J-marked computation, as described in [BCLR].
15As in JMBTest.lib we construct the V polynomials and we reduce the EK
16polynomials w.r.t. them, putting the coefficients as results.
17
18
19The algorithm terminates only if the ordering is rp.
20Anyway, the number of reduction steps is bounded.
21
22REFERENCES:
23[CR] Francesca Cioffi, Margherita Roggero,Flat Families by Strongly
24Stable Ideals and a Generalization of Groebner Bases,
25J. Symbolic Comput. 46,  1070-1084, (2011).@*
26[BCLR] Cristina Bertone, Francesca Cioffi, Paolo Lella,
27Margherita Roggero, Upgraded methods for the effective
28computation of marked schemes on a strongly stable ideal,
29Journal of Symbolic Computation
30(2012), http://dx.doi.org/10.1016/j.jsc.2012.07.006 @*
31
32
33
34SEE ALSO: JMSConst_lib
35PROCEDURES:
36BorelCheck(ideal,r)       checks whether the given ideal is Borel
37JMarkedScheme(list, list, list, int)  computes authomatically all the J-marked scheme
38";
39LIB "presolve.lib";
40LIB "qhmoduli.lib";
41LIB "monomialideal.lib";
42////////////////////////////////////////////////////////////////////
43proc BorelCheck(ideal Borid,def r)
44"USAGE:    BorelCheck(Borid,r); Borid ideal, r ring
45RETURN:   int: d
46NOTE:     Input must be a monomial ideal.
47The procedure checks whether the Borel moves produce elements belonging to Borid.
48EXAMPLE:  example QuanteC; shows an example"
49{
50int n= nvars(r);
51int b=1;
52int i=1;
53int k;
54intvec v;
55int j;
56int u;
57//b =bool. b=1 true; b=0 false
58//we suppose true!
59//i=counter on the elements of Borid
60int s= size(Borid);
61while(b && i<=s)
62      {
63        v=leadexp(Borid[i]);
64        j=1;
65        u=size(v);
66        while(b && j<=u)
67             {
68               if(v[j]!=0)
69                 {
70                   k=j+1;
71                  while(b && k<=n)
72                       {
73                         b=(reduce(Borid[i]*var(k)/var(j),std(Borid))==0);
74                         k++;
75                        }
76                 }
77              j++;
78             }
79      i++;
80      }
81return(b);
82}
83example
84{ "EXAMPLE:"; echo = 2;
85 ring r=0, (x,y,z),rp;
86 ideal Borid=y^2*z,y*z^2,z^3,y^5;
87BorelCheck(Borid,r);
88}
89////////////////////////////////////////////////////////////////////
90proc ArrangeBorel(ideal Borid)
91"USAGE:    ArrangeBorel(Borid); Borid ideal
92RETURN:   list: Input
93NOTE:     Input must be a monomial ideal, increasingly ordered by degree.
94The procedure groups the monomials in a list of lists as needed to compute J-marked scheme.
95// It also returns a list containing the size of every sublist generated.
96EXAMPLE:  example ArrangeBorel; shows an example"
97{
98list Input;
99int j=1;
100//list numero=1;
101Input[1]=list(Borid[1]);
102for(int i=2; i<=size(Borid); i++)
103   {
104     if(deg(Borid[i])!=deg(Borid[i-1]))
105        {
106         j++;
107         Input[j]=list();
108        // numero[j]=0;
109        }
110Input[j]=insert(Input[j],Borid[i],size(Input[j]));
111//numero[j]=numero[j]+1;
112   }
113return(Input);
114}
115example
116{ "EXAMPLE:"; echo = 2;
117 ring r=0, (x,y,z),rp;
118 ideal Borid=y^2*z,y*z^2,z^3,y^5;
119ArrangeBorel(Borid);
120}
121////////////////////////////////////////////////////////////////////
122proc NumNewVar(list B, list NumN)
123"USAGE:    NumNewVar(B,NumN); B list, NumN list
124RETURN:   int: d
125NOTE: B is the grouped Borel, while NumN is a list containing the cardinalities of the obtained groups.
126EXAMPLE:  example NumNewVar; shows an example"
127{
128int d;
129int j;
130int i;
131for(i=1; i<=size(B); i++)
132   {
133     d=d+size(B[i])*NumN[i];
134    }
135return(d);
136}
137example
138{ "EXAMPLE:"; echo = 2;
139 ring r=0, (x,y,z),rp;
140 ideal Borid=y^2*z,y*z^2,z^3,y^5;
141list B= ArrangeBorel(Borid);
142list NumN=7,8;
143NumNewVar(B,NumN);
144}
145////////////////////////////////////////////////////////////////////
146proc NewTails(ideal NI, int s)
147"USAGE:    NewTails(NI,s); NI ideal, s int
148RETURN:   list: M
149NOTE:     The procedure construct the tails of the required unknown J-marked polynomials.
150EXAMPLE:  example NewTails; shows an example"
151{
152 poly p=0;
153for(int i=1; i<=size(NI); i++)//Loop on the Groebner escalier
154   {
155    p=p+NI[i]*c(i+s); //multiply by c's
156   }
157int u=size(NI);
158list M=p,u;
159return(M);
160}
161example
162{ "EXAMPLE:"; echo = 2;
163 ring r=(0,c(1..7)), (x,y,z),rp;
164 ideal NI=x^2,x*y,y^2,z^2;
165 NewTails(NI,3);
166}
167////////////////////////////////////////////////////////////////////
168proc ArrangeTails(list Q)
169"USAGE:    ArrangeTails(Q); Q list
170RETURN:   list: Q
171NOTE:     Constructs the final list of J-marked polynomials.
172EXAMPLE:  example FormaInput; shows an example"
173{
174jmp m=Q[1][1];
175jmp M=Q[size(Q)][1];
176int minimo=deg(m.h);
177int massimo=deg(M.h);
178//print(minimo);
179//print(massimo);
180int i=2;
181jmp qi;
182while(i<=size(Q))
183     {
184       //print("entro nel ciclo");
185       //print(i);
186       qi=Q[i][1];
187       if(deg(qi.h)!=minimo+1)
188         {
189          //print("qui riempire");
190          //print(i);
191          Q=insert(Q,list(),i-1);//Insert empty list for all intermediate degree between the minimum and the maximum, not having polynomials.
192          //print(Q);
193         }
194       minimo=minimo+1;
195       i=i+1;
196       //print("ora ho");
197       //print(minimo);
198       //print(i);
199     }
200return(Q);
201}
202example
203{ "EXAMPLE:"; echo = 2;
204ring r=0, (x,y,z),rp;
205 ideal Borid=y^2*z,y*z^2,z^3,y^5;
206attrib(Borid,"isSB",1);
207    list B=ArrangeBorel(Borid);
208    list NumN;
209    list N;
210    int i;
211    int d;
212    for(i=1;i<=size(B);i++)
213       {
214        d=deg(B[i][1]);
215        N[i]=kbase(Borid,d);
216        NumN[i]=size(N[i]);
217       }
218int qc=NumNewVar(B, NumN);
219//Now I must define the NEW RING, putting the c parameters inside.
220list L=ringlist(r);
221list L2;
222L2[1]=L[1];
223L2[2]=list();
224for(i=qc;i>=1;i--)
225    {
226     L2[2][i]="c("+string(i)+")";
227    }
228L2[3]=list(list("rp",qc));
229L2[4]=L[4];
230L[1]=L2;
231def K=ring(L);
232setring(K);
233ideal Borid=imap(r,Borid);
234list N=imap(r,N);
235list B=imap(r,B);
236//NumN contains only scalars so I do not imap it
237int j;
238list Q;
239int s;
240list M;
241jmp pp;
242for(i=1;i<=size(B);i++)
243    {
244      Q[i]=list();
245     for(j=1;j<=size(B[i]);j++)
246        {
247          M=NewTails(N[i],s);
248          pp.h=B[i][j];
249          pp.t=M[1];
250          Q[i][j]=pp;
251          s=s+M[2];
252          //print(s);
253        }
254    }
255list P=ArrangeTails(Q);
256int ll;
257int uu;
258jmp Pp;
259for(ll=1; ll<=size(P);ll++)
260   {
261    for(uu=1;uu<=size(P[ll]);uu++)
262       {Pp=P[ll][uu]; Pp.h; Pp.t;}
263   }
264}
265////////////////////////////////////////////////////////////////////
266proc mod_init()
267"USAGE:     mod_init();
268RETURN:   struct: jmp
269EXAMPLE:  example  mod_init; shows an example"
270{
271newstruct("jmp", "poly h, poly t");
272}
273example
274{ "EXAMPLE:"; echo = 2;
275  mod_init();
276}
277////////////////////////////////////////////////////////////////////
278proc Terns(list G, int c)
279"USAGE:    Terns(G,c); G list, c int
280RETURN:   list: T
281NOTE:     Input is a list of J-marked  polynomials
282(arranged by degree) and an integer.
283EXAMPLE:  example Terns; shows an example"
284{
285list T=list();
286int z;
287 for(int k=1; k<=size(G[c]);k=k+1)
288    {
289//Loop on G[c] making positions of polynomials in G[c]
290      z=size(T);
291      T=insert(T,list(1,c,k) ,size(T));
292    }
293return(T);
294}
295example
296{ "EXAMPLE:"; echo = 2;
297ring r=0, (x,y,z), rp;
298jmp r1;
299r1.h=z^3;
300r1.t=poly(0);
301jmp r2;
302r2.h=z^2*y;
303r2.t=poly(0);
304jmp r3;
305r3.h=z*y^2 ;
306r3.t=-x^2*y;
307jmp r4;
308r4.h=y^5;
309r4.t=poly(0);
310list G2F=list(list(r1,r2,r3),list(r4));
311Terns(G2F, 1);
312Terns(G2F, 2);
313}
314////////////////////////////////////////////////////////////////////
315proc VConst(list G, int c)
316"USAGE:    VConst(G, c); G list, c int
317RETURN:   list: V
318NOTES: this procedure computes the Vm polynomials following the
319algorithm in [CR],but it only keeps in memory the monomials by
320which the G's must be multplied and their positions.
321EXAMPLE:  example VConst; shows an example"
322{
323jmp f=G[1][1];
324int aJ=deg(f.h);
325// minimal degree of polynomials in G
326//print(aJ);
327list V=list();
328V[1]=Terns(G,1);
329// V[1]=G[1] (keeping in memory only [head, position])
330//print(c-aJ+1);
331int i;
332int j;
333int m;
334list OO;
335jmp p;
336  for(m=2; m<=c-aJ+1; m=m+1)
337  {
338     //print("entro nel form");
339     if(m>size(G))
340        {V[m]=list();
341//If we have not G[m] we insert a list()
342        //print("vuota prima");
343        }
344     else
345        {V[m]=Terns(G,m);
346        //print("piena prima");
347        }
348     for(i=1; i<nvars(basering)+1; i=i+1)
349        {
350          //print("entrata fori");
351          //print(i);
352          for(j=1; j<=size(V[m-1]); j=j+1)
353             {
354                   p=G[V[m-1][j][2]][V[m-1][j][3]];
355                  //print(p.h);
356                  //print(p.t);
357                  //print(var(i));
358                  //print(Minimus(V[m-1][j][1]*p.h));
359               if(var(i)<=Minimus(variables(V[m-1][j][1]*p.h)))
360                  {
361//Can I multiply by the current variable?
362                    //print("minoremin");
363                    //print("fin qui ci sono");
364                     //print(V[m-1][j][1]);
365                     OO=list(var(i)*V[m-1][j][1],V[m-1][j][2],V[m-1][j][3]);
366                    V[m]=insert(V[m], OO ,size(V[m]));
367                  }
368             }
369        }
370  }
371return (V);}
372example
373{ "EXAMPLE:"; echo = 2;
374 ring r=0, (x,y,z), rp;
375jmp r1;
376r1.h=z^3;
377r1.t=poly(0);
378jmp r2;
379r2.h=z^2*y;
380r2.t=poly(0);
381jmp r3;
382r3.h=z*y^2 ;
383r3.t=-x^2*y;
384jmp r4;
385r4.h=y^5;
386r4.t=poly(0);
387list G2F=list(list(r1,r2,r3),list(r4));
388VConst(G2F,4,basering);}
389////////////////////////////////////////////////////////////////////
390proc Minimus(ideal L)
391"USAGE:    Minimus(L); G list, c int
392RETURN:   list: V
393NOTES: it returns the minimal variable generating the ideal L;
394input must be an ideal generated by variables.
395EXAMPLE:  example Minimus; shows an example"
396{
397poly min=L[1];
398int i;
399for(i=2;i<=size(L); i++)
400  {
401    if(L[i]<min){min=L[i];}
402  }
403return(min);
404}
405example
406{ "EXAMPLE:"; echo = 2;
407 ring r=0, (x,y,z), rp;
408ideal I=y,x,z;
409Minimus(I);
410}
411////////////////////////////////////////////////////////////////////
412proc Maximus(ideal L)
413"USAGE:    Maximus(L); G list, c int
414RETURN:   list: V
415NOTES: it returns the maximal variable generating the ideal L
416input must be an ideal generated by variables.
417EXAMPLE:  example Maximus; shows an example"
418{
419poly max=L[1];
420int i;
421for(i=2;i<=size(L); i++)
422  {
423    if(L[i]>max){max=L[i];}
424  }
425return(max);
426}
427example
428{ "EXAMPLE:"; echo = 2;
429 ring r=0, (x,y,z), rp;
430ideal I=y,x,z;
431Maximus(I);
432}
433////////////////////////////////////////////////////////////////////
434proc GPolyMin(jmp P, jmp Q)
435"USAGE:    GPolyMin(P,Q); P jmp, Q jmp
436RETURN:   int: d
437EXAMPLE:  example GPolyMin; shows an example"
438{
439  int d=1;
440//-1=lower, 0=equal, 1=higher
441//At the beginning suppose Q is higher
442  if(deg(P.h)<deg(Q.h))
443     {
444//Compare degrees;
445      d=-1;
446      //print("Per Grado");
447     }
448  if(deg(P.h)==deg(Q.h))
449     {
450      if(P.h==Q.h)
451         {
452          if(P.t==Q.t)
453              {
454//head=tail
455               d=0;
456               //print("Uguali");
457              }
458         }
459     else
460        {
461//print(Minimus(variables(P.h/gcdMon(P.h,Q.h))));
462//print(Minimus(variables(Q.h/gcdMon(P.h,Q.h))));
463          if(Minimus(variables(P.h/gcdMon(P.h,Q.h)))<Minimus(variables(Q.h/gcdMon(P.h,Q.h))))
464             {
465             d=-1;
466            //print("Per Indice");
467             }
468        }
469     }
470 return(d);
471}
472example
473{ "EXAMPLE:"; echo = 2;
474 ring r=0, (x,y,z), rp;
475 jmp p1;
476p1.h=poly(1);
477p1.t=poly(1);
478jmp p2;
479p2.h=x^2;
480p2.t=poly(0);
481jmp p3;
482p3.h=x;
483p3.t=poly(0);
484 GPolyMin(p1,p2);
485 GPolyMin(p2, p3);
486GPolyMin(p2,p2);
487}
488////////////////////////////////////////////////////////////////////
489proc TernComparer(list A, list B, list G)
490"USAGE:    TernComparer(A,B,C); A list, B list, G list
491RETURN:   int: d
492NOTE:     A and B are terns, while G is the given list of
493J-marked polynomials.
494EXAMPLE:  example TernComparer; shows an example"
495{
496int d=-1;
497//Start: A<B
498if(A[1]==B[1])
499  {
500   if(A[2]==B[2]&& A[3]==B[3])
501     {
502      //print("Uguali");
503      d=0;
504     }
505   else
506     {
507jmp g1=G[A[2]][A[3]];
508jmp g2=G[B[2]][B[3]];
509       if(GPolyMin(g1, g2)==1)
510          {
511            //print("Maggiore per il G");
512            d=1;
513          }
514     }
515  }
516else
517  {
518    if(A[1]>B[1])
519      {
520//the ordering MUST be rp
521        //print("Maggiore per Lex");
522        d=1;
523      }
524  }
525return(d);
526}
527example
528{ "EXAMPLE:"; echo = 2;
529 ring r=0, (x,y,z), rp;
530jmp r1;
531r1.h=z^3;
532r1.t=poly(0);
533jmp r2;
534r2.h=z^2*y;
535r2.t=poly(0);
536jmp r3;
537r3.h=z*y^2 ;
538r3.t=-x^2*y;
539jmp r4;
540r4.h=y^5;
541r4.t=poly(0);
542list G2F=list(list(r1,r2,r3),list(r4));
543TernComparer([1,1,1],[x,1,1],G2F);
544}
545////////////////////////////////////////////////////////////////////
546proc MinimalV(list V, list G)
547"USAGE:    Minimal(V,G); V list, G list
548RETURN:   int: R
549NOTE:     Input=list(terns), G.
550EXAMPLE:  example MinimalV; shows an example"
551{
552//Minimal element for a given degree
553list R=list();
554list MIN=V[1];
555int h=1;
556int i;
557for(i=2; i<=size(V); i++)
558    {
559//I consider the first as minimum
560//If I find something smaller I change minimum
561     if(TernComparer(V[i],MIN,G)<=0)
562       {
563        MIN=V[i];
564        h=i;
565       }
566    }
567//Return: [minimum,position of the minimum]
568R=MIN,h;
569return(R);
570}
571example
572{ "EXAMPLE:"; echo = 2;
573 ring r=0, (x,y,z), rp;
574jmp r1;
575r1.h=z^3;
576r1.t=poly(0);
577jmp r2;
578r2.h=z^2*y;
579r2.t=poly(0);
580jmp r3;
581r3.h=z*y^2 ;
582r3.t=-x^2*y;
583jmp r4;
584r4.h=y^5;
585r4.t=poly(0);
586list G2F=list(list(r1,r2,r3),list(r4));
587MinimalV(VConst(G2F,4,basering)[1],G2F);
588}
589////////////////////////////////////////////////////////////////////
590proc OrderV(list V,list G,list R)
591"USAGE:   Ordinare(V,G,R); V list, G list, R list
592RETURN:   list: R
593NOTE:     Input: Vm,G,emptylist
594EXAMPLE:  example Ordinare; shows an example"
595{
596//Order V[m]
597//R  will contain results but at the beginning it is empty
598list M=list();
599if(size(V)==1)
600  {
601    R=insert(R,V[1],size(R));
602  }
603else
604  {
605   M=MinimalV(V,G);
606   R=insert(R,M[1],size(R));
607   V=delete(V,M[2]);
608//recursive call
609   R=OrderV(V,G,R);
610  }
611return(R);
612}
613example
614{ "EXAMPLE:"; echo = 2;
615 ring r=0, (x,y,z), rp;
616jmp r1;
617r1.h=z^3;
618r1.t=poly(0);
619jmp r2;
620r2.h=z^2*y;
621r2.t=poly(0);
622jmp r3;
623r3.h=z*y^2;
624r3.t=-x^2*y;
625jmp r4;
626r4.h=y^5;
627r4.t=poly(0);
628list G2F=list(list(r1,r2,r3),list(r4));
629OrderV(VConst(G2F,4,r)[1],G2F,list());
630}
631////////////////////////////////////////////////////////////////////
632proc StartOrderingV(list V,list G)
633"USAGE:   StartOrderingV(V,G); V list, G list
634RETURN:   list: R
635NOTE:     Input Vm,G. This procedure uses OrderV to get
636the ordered polynomials as in [BCLR].
637EXAMPLE:  example StartOrderingV; shows an example"
638{
639 return(OrderV(V,G, list()));
640}
641example
642{ "EXAMPLE:"; echo = 2;
643 ring r=0, (x,y,z), rp;
644jmp r1;
645r1.h=z^3;
646r1.t=poly(0);
647jmp r2;
648r2.h=z^2*y;
649r2.t=poly(0);
650jmp r3;
651r3.h=z*y^2;
652r3.t=-x^2*y;
653jmp r4;
654r4.h=y^5;
655r4.t=poly(0);
656list G2F=list(list(r1,r2,r3),list(r4));
657StartOrderingV(VConst(G2F,4,basering)[1],G2F);
658}
659////////////////////////////////////////////////////////////////////
660proc MultiplyJmP(list L, list G)
661"USAGE:    MultiplyJmP(L,G); L list, G list
662RETURN:   jmp: K
663NOTE:     Input: a 3-ple,G. It performs the product associated
664to the 3-uple.
665EXAMPLE:  example MultiplyJmP; shows an example"
666{
667jmp g=G[L[2]][L[3]];
668jmp K;
669K.h=L[1]*g.h;
670K.t=L[1]*g.t;
671 return(K);
672}
673example
674{ "EXAMPLE:"; echo = 2;
675 ring r=0, (x,y,z), rp;
676 list P=x^2,1,1;
677jmp r1;
678r1.h=z^3;
679r1.t=poly(0);
680jmp r2;
681r2.h=z^2*y;
682r2.t=poly(0);
683jmp r3;
684r3.h=z*y^2 ;
685r3.t=-x^2*y;
686jmp r4;
687r4.h=y^5;
688r4.t=poly(0);
689list G2F=list(list(r1,r2,r3),list(r4));
690MultiplyJmP(P,G2F);
691}
692////////////////////////////////////////////////////////////////////
693//proc JmpIdeal(list V,r)
694//"USAGE:    JmpIdeal(V); V list
695//RETURN:   ideal: I
696//NOTES: this procedure takes a list of Vm's of a certain degree
697//and construct their ideal, multiplying the head by the weighted
698//variable t.
699//EXAMPLE:  example JmpIdeal; shows an example"
700//{
701//ideal I=0;
702//int i;
703//if (size(V)!=0)
704 // {
705//   list M=list();
706//jmp g;
707//   for(i=1; i<= size(V); i++)
708//       {
709//         g=V[i];
710//         g.h=(g.h)*t;
711//         M[i]=g.h+g.t;
712//       }
713//   I=M[1..size(M)];
714//attrib(I,"isSB",1);
715//  }
716//return(I);
717//}
718//example
719//{ "EXAMPLE:"; echo = 2;
720// ring r=0, (x,y,z,t), rp;
721//jmp r1;
722//r1.h=z^3;
723//r1.t=poly(0);
724//jmp r2;
725//r2.h=z^2*y;
726//r2.t=poly(0);
727//jmp r3;
728//r3.h=z*y^2 ;
729//r3.t=-x^2*y;
730//jmp r4;
731//r4.h=y^5;
732//r4.t=poly(0);
733//list G2F=list(list(r1,r2,r3),list(r4));
734//JmpIdeal(VConst(G2F,6,r)[1],r);
735//}
736////////////////////////////////////////////////////////////////////
737proc NewWeight(int n)
738"USAGE:    NewWeight(n); n int
739RETURN:   intvec: u
740EXAMPLE:  example NewWeight; shows an example"
741{
742intvec u=0;
743u[n]=1;
744return(u);
745}
746example
747{ "EXAMPLE:"; echo = 2;
748 NewWeight(3);
749}
750////////////////////////////////////////////////////////////////////
751proc FinalVm(list V1 , list G1 , def r)
752"USAGE:     FinalVm(V1, G1, r);  V1 list,  G1 list , r
753RETURN:   intvec: u
754EXAMPLE:  example FinalVm; shows an example"
755{
756//multiply and reduce, degree by degree
757intvec u=NewWeight(nvars(r)+1);
758list L=ringlist(r);
759L[2]=insert(L[2],"t",size(L[2]));
760//print(L[2]);
761list ordlist="a",u;
762L[3]=insert(L[3],ordlist,0);
763def H=ring(L);
764//print(V1);
765//print(G1);
766list M=list();
767jmp p;
768list N;
769poly q;
770poly s;
771int i;
772int j;
773for(i=1; i<=size(G1); i++)
774   {
775           N=list();
776           for(j=1; j<=size(G1[i]); j++)
777              {
778                p=G1[i][j];
779                q=p.h;
780                s=p.t;
781                N[j]=list(q,s);
782               }
783           M[i]=N;
784    }
785//print("M is");
786//print(M);
787p.h=poly(0);
788p.t=poly(0);
789setring H;
790list R=list();
791list S=list();
792//print("anello definito");
793list V=imap(r,V1);
794//def G=imap(r,G1);
795//print(V);
796list MM=imap(r,M);
797list G=list();
798list N=list();
799for(i=1; i<=size(MM); i++)
800   {
801           for(j=1; j<=size(MM[i]); j++)
802              {
803                p.h=MM[i][j][1];
804                p.t=MM[i][j][2];
805                N[j]=p;
806               }
807           G[i]=N;
808    }
809ideal I=0;
810jmp LL;
811jmp UU;
812//print("pronta x ridurre");
813 for(i=1; i<=size(V);i++)
814    {
815//print("sono a V di");
816//print(i);
817       R[i]=list();
818       S[i]=list();
819       I=0;
820              attrib(I,"isSB",1);
821       for(j=1;j<=size(V[i]); j++)
822          {
823//print(j);
824//print("esimo elem");
825            LL=MultiplyJmP(V[i][j],G);
826              LL.t=reduce(t*LL.t,I);
827//I only reduce the tail
828//print(LL.t);
829              LL.t=subst(LL.t,t,1);
830              S[i]=insert(S[i],LL,size(S[i]));
831              LL.h=t*LL.h;
832            R[i]=insert(R[i],LL,size(R[i]));
833             UU=R[i][j];
834              I=I+ideal(UU.h+UU.t);
835              attrib(I,"isSB",1);
836          }
837    }
838//print("ho ridotto");
839list M=list();
840poly q;
841poly s;
842for(i=1; i<=size(S); i++)
843   {
844           N=list();
845           for(j=1; j<=size(S[i]); j++)
846              {
847                p=S[i][j];
848                q=p.h;
849                s=p.t;
850                N[j]=list(q,s);
851               }
852           M[i]=N;
853    }
854p.h=poly(0);
855p.t=poly(0);
856setring r;
857def MM=imap(H,M);
858list MMM=list();
859for(i=1; i<=size(MM); i++)
860   {
861           N=list();
862           for(j=1; j<=size(MM[i]); j++)
863              {
864                p.h=MM[i][j][1];
865                p.t=MM[i][j][2];
866                N[j]=p;
867               }
868           MMM[i]=N;
869    }
870return(MMM);
871}
872example
873{ "EXAMPLE:"; echo = 2;
874 ring r=0, (x,y,z), rp;
875jmp r1;
876r1.h=z^3;
877r1.t=poly(0);
878jmp r2;
879r2.h=z^2*y;
880r2.t=poly(0);
881jmp r3;
882r3.h=z*y^2 ;
883r3.t=-x^2*y;
884jmp r4;
885r4.h=y^5;
886r4.t=poly(0);
887list G2F=list(list(r1,r2,r3),list(r4));
888 FinalVm(VConst(G2F,6,r) , G2F, r);
889}
890////////////////////////////////////////////////////////////////////
891proc VmConstructor(list G, int c,def r)
892"USAGE:     VmConstructor(G,c); G list, c int
893RETURN:   list: R
894NOTE:     At the end separated by degree.
895EXAMPLE:  example VmConstructor; shows an example"
896{
897list V=list();
898V= VConst(G,c);
899//print("VConst");
900//V non ordered
901list L=list();
902list R=list();
903int i;
904// head, position
905//order the different degrees
906for(i=1; i<=size(V); i++)
907   {
908    L[i]=StartOrderingV(V[i], G);
909   }
910//print("finito ordine");
911//multiply and reduce
912//print("Ordinare");
913//R=FinalVm(L, G, r);
914//print("FinalVm");
915return(L);
916}
917example
918{ "EXAMPLE:"; echo = 2;
919 ring r=0, (x,y,z), rp;
920jmp r1;
921r1.h=z^3;
922r1.t=poly(0);
923jmp r2;
924r2.h=z^2*y;
925r2.t=poly(0);
926jmp r3;
927r3.h=z*y^2 ;
928r3.t=-x^2*y;
929jmp r4;
930r4.h=y^5;
931r4.t=poly(0);
932list G2F=list(list(r1,r2,r3),list(r4));
933 VmConstructor(G2F,6,r);
934}
935////////////////////////////////////////////////////////////////////
936proc EKCouples(jmp A, jmp B)
937"USAGE:    CoppiaEK(A,B); A list, B list
938RETURN:   list: L
939NOTE:     At the end the monomials involved by EK.
940EXAMPLE:  example EKCouples; shows an example"
941{
942poly E;
943list L=0,0;
944string s=varstr(basering);
945list VVV=varstr(basering);
946//L will contain results
947poly h=Minimus(variables(A.h));
948//print(h);
949int l=findvars(h)[2][1];
950if(l!=nvars(basering))
951 {
952//print("vero");
953//print(l);
954  for(int j=l+1;j<=nvars(basering); j++)
955   {
956    //print("entrata");
957    //print(var(j));
958    E=var(j)*A.h/B.h;
959//Candidate for * product
960    //print(E);
961    if(E!=0)
962      {
963        //print("primo if passato");
964        if(Minimus(variables(B.h))>=Maximus(variables(E)))
965           {
966//Does it work with * ?
967            //print("secondo if passato");
968            L[1]=j;
969            L[2]=E;
970            break;
971           }
972      }
973   }
974  }
975return (L);
976}
977example
978{ "EXAMPLE:"; echo = 2;
979 ring r=0, (x,y,z), rp;
980jmp A;
981A.h=y*z^2;
982A.t=poly(0);
983jmp B;
984B.h=y^2*z;
985B.t=poly(0);
986EKCouples(A,B);
987EKCouples(B,A);
988}
989////////////////////////////////////////////////////////////////////
990proc EKPolynomials(list G)
991"USAGE:    EKPolynomials(G); G list
992RETURN:   list: EK, list: D
993NOTE:     At the end EK polynomials and their degrees
994
995EXAMPLE:  example EKPolynomials; shows an example"
996{
997list D=list();
998list C=list();
999list N=0,0;
1000list EK=list();
1001int i;
1002int j;
1003int k;
1004int l;
1005jmp p;
1006for(i=1; i<=size(G); i++)
1007   {
1008     for(j=1; j<=size(G[i]); j++)
1009        {
1010         for(k=1; k<=size(G); k++)
1011             {
1012               for(l=1; l<=size(G[k]); l++)
1013                  {
1014                     if(i!=k||j!=l)
1015                       {
1016//Loop on polynomials
1017                        C=EKCouples(G[i][j], G[k][l]);
1018//print("coppia");
1019                        if(C[2]!=0)
1020                          {
1021                           C=insert(C,list(i,j,k,l),size(C));
1022                           EK=insert(EK,C,size(EK));
1023                           p=G[k][l];
1024                           D=insert(D,deg(C[2]*p.h),size(D));
1025                          }
1026                       }
1027                  }
1028             }
1029        }
1030   }
1031//Double Return
1032return(EK, D);
1033}
1034example
1035{ "EXAMPLE:"; echo = 2;
1036  ring r=0, (x,y,z), rp;
1037jmp r1;
1038r1.h=z^3;
1039r1.t=poly(0);
1040jmp r2;
1041r2.h=z^2*y;
1042r2.t=poly(0);
1043jmp r3;
1044r3.h=z*y^2;
1045r3.t=-x^2*y;
1046jmp r4;
1047r4.h=y^5;
1048r4.t=poly(0);
1049list G2F=list(list(r1,r2,r3),list(r4));
1050EKPolynomials(G2F);
1051}
1052////////////////////////////////////////////////////////////////////
1053proc MultEKPolys(list EK, list G)
1054"USAGE:    MultEKPolys(G); G list
1055RETURN:   list: p
1056NOTE:     At the end I obtain the EK polynomials and
1057their degrees.
1058EXAMPLE:  example MultEKPolys; shows an example"
1059{
1060jmp u;
1061u=G[EK[3][1]][EK[3][2]];
1062//print("u");
1063jmp q;
1064q=G[EK[3][3]][EK[3][4]];
1065return(var(EK[1])*(u.h+u.t)-EK[2]*(q.h+q.t));
1066}
1067example
1068{ "EXAMPLE:"; echo = 2;
1069 ring r=0, (x,y,z), rp;
1070jmp r1;
1071r1.h=z^3;
1072r1.t=poly(0);
1073jmp r2;
1074r2.h=z^2*y;
1075r2.t=poly(0);
1076jmp r3;
1077r3.h=z*y^2;
1078r3.t=-x^2*y;
1079jmp r4;
1080r4.h=y^5;
1081r4.t=poly(0);
1082list G2F=list(list(r1,r2,r3),list(r4));
1083list EK,D=EKPolynomials(G2F);
1084MultEKPolys(EK[2],G2F);
1085}
1086////////////////////////////////////////////////////////////////////
1087proc SchemeEq(list W, list EK,list D,list Q,def r)
1088"USAGE:    SchemeEq(W,EK,D,Q,r);  W list, EK list, D list, Q list, r ring
1089RETURN:    int: i
1090NOTE:
1091This procedure performs the reduction of EK-polynomials, obtaining
1092the J-marked scheme.
1093EXAMPLE:  example SchemeEq; shows an example"
1094{
1095list Jms=list();
1096//ideal I;
1097list M=list();
1098jmp mini;
1099mini=W[1][1];
1100int minimo=deg(mini.h);
1101//multiply variables
1102poly pd=poly(1);
1103for(int i=1;i<=nvars(r);i++)
1104{pd=pd*var(i);}
1105//CHANGE RING
1106intvec u=NewWeight(nvars(r)+1);
1107list L=ringlist(r);
1108L[2]=insert(L[2],"t",size(L[2]));
1109//print(L[2]);
1110list ordlist="a",u;
1111L[3]=insert(L[3],ordlist,0);
1112def H=ring(L);
1113//list
1114M=list();
1115jmp pu;
1116list N;
1117poly q;
1118poly s;
1119i=0;
1120int j;
1121for(i=1; i<=size(Q); i++)
1122   {
1123           N=list();
1124           for(j=1; j<=size(Q[i]); j++)
1125              {
1126                pu=Q[i][j];
1127                q=pu.h;
1128                s=pu.t;
1129                N[j]=list(q,s);
1130               }
1131           M[i]=N;
1132    }
1133list O;
1134pu.h=poly(0);
1135pu.t=poly(0);
1136for(i=1; i<=size(W); i++)
1137   {
1138           N=list();
1139           for(j=1; j<=size(W[i]); j++)
1140              {
1141                pu=W[i][j];
1142                q=pu.h;
1143                s=pu.t;
1144                N[j]=list(q,s);
1145               }
1146           O[i]=N;
1147    }
1148pu.h=poly(0);
1149pu.t=poly(0);
1150setring H;
1151list R=list();
1152list S=list();
1153//print("anello definito");
1154def EK=imap(r,EK);
1155def MM=imap(r,M);
1156def OO=imap(r,O);
1157def pd=imap(r,pd);
1158list G=list();
1159list N=list();
1160for(i=1; i<=size(MM); i++)
1161   {
1162           for(j=1; j<=size(MM[i]); j++)
1163              {
1164                pu.h=MM[i][j][1];
1165                pu.t=MM[i][j][2];
1166                N[j]=pu;
1167               }
1168           G[i]=N;
1169    }
1170list V;
1171for(i=1; i<=size(OO); i++)
1172   {
1173           for(j=1; j<=size(OO[i]); j++)
1174              {
1175                pu.h=OO[i][j][1];
1176                pu.t=OO[i][j][2];
1177                N[j]=pu;
1178               }
1179           V[i]=N;
1180    }
1181//print(V);
1182//print(G);
1183matrix C;
1184list COEFF;
1185poly p=0;
1186poly q=0;
1187ideal I;
1188list M;
1189i=0;
1190jmp g;
1191int k;
1192for(j=1; j<=size(EK);j++)
1193      {
1194       //print("arrivo");
1195       //print(j);
1196       p=MultEKPolys(EK[j],G);
1197       //ideal
1198        I=0;
1199       if (size(V[D[j]-minimo+1])!=0)
1200           {
1201            M=list();
1202          //  jmp g;
1203       for(i=1; i<= size(V[D[j]-minimo+1]); i++)
1204           {
1205            g=V[D[j]-minimo+1][i];
1206            g.h=(g.h)*t;
1207            M[i]=g.h+g.t;
1208          }
1209      I=M[1..size(M)];
1210     attrib(I,"isSB",1);
1211//print(I);
1212  }
1213//print(I);
1214q=reduce(t*p,I);
1215q=subst(q,t,1);
1216       C=coef(q,pd);
1217       COEFF=C[2,1..ncols(C)];
1218       for(k=1;k<=size(COEFF);k++)
1219          {
1220            if(COEFF[k]!=0)
1221           { Jms=insert(Jms,COEFF[k],size(Jms));}
1222          }
1223      }
1224setring r;
1225def Jms=imap(H,Jms);
1226return(Jms);
1227}
1228example
1229{ "EXAMPLE:"; echo = 2;
1230 ring r=0, (x,y,z),rp;
1231 ideal Borid=y^2*z,y*z^2,z^3,y^5;
1232attrib(Borid,"isSB",1);
1233    list B=ArrangeBorel(Borid);
1234    list NumN;
1235    list N;
1236    int i;
1237    int d;
1238    for(i=1;i<=size(B);i++)
1239       {
1240        d=deg(B[i][1]);
1241        N[i]=kbase(Borid,d);
1242        NumN[i]=size(N[i]);
1243       }
1244int qc=NumNewVar(B, NumN);
1245//Now I must define the NEW RING,
1246//putting the c parameters inside.
1247list L=ringlist(r);
1248list L2;
1249L2[1]=L[1];
1250L2[2]=list();
1251for(i=qc;i>=1;i--)
1252    {
1253     L2[2][i]="c("+string(i)+")";
1254    }
1255L2[3]=list(list("rp",qc));
1256L2[4]=L[4];
1257L[1]=L2;
1258if(defined(K)){kill K;}
1259def K=ring(L);
1260export K;
1261setring(K);
1262def Borid=imap(r,Borid);
1263def N=imap(r,N);
1264def B=imap(r,B);
1265//NumN contains only scalars so I do not imap it
1266int j;
1267list Q;
1268int s;
1269list M;
1270jmp pp;
1271for(i=1;i<=size(B);i++)
1272    {
1273      Q[i]=list();
1274     for(j=1;j<=size(B[i]);j++)
1275        {
1276          M=NewTails(N[i],s);
1277          pp.h=B[i][j];
1278          pp.t=M[1];
1279          Q[i][j]=pp;
1280          s=s+M[2];
1281          //print(s);
1282        }
1283    }
1284list P=ArrangeTails(Q);
1285list EK,D= EKPolynomials(P);
1286     int massimo=Max(D);
1287//list V=VConst(P, massimo);
1288//pause();
1289list V=VmConstructor(P,massimo,r);
1290list W=FinalVm(V,P,K);
1291//print("I V ridotti in ordine sono");
1292//print(W);
1293list Jms=SchemeEq(W,EK,D,P,K);
1294Jms;}
1295
1296//////////////////////////////////////////////////////////////////////
1297proc JMarkedScheme(ideal Borid,def r)
1298"USAGE:    JMarkedScheme(Borid, r);  Borid ideal, r ring
1299RETURN:    list: Jms
1300NOTE:
1301This procedure performs automatically the whole construction
1302of the J-marked scheme.
1303EXAMPLE:  example JMarkedScheme; shows an example"
1304{
1305list Jms;
1306if(BorelCheck(Borid,r))
1307  {
1308   if(size(Borid)==1)
1309     { Jms=list();}
1310  else{
1311    //print("Input is OK");
1312    attrib(Borid,"isSB",1);
1313    list B=ArrangeBorel(Borid);
1314    list NumN;
1315    list N;
1316    int i;
1317    int d;
1318    for(i=1;i<=size(B);i++)
1319       {
1320        d=deg(B[i][1]);
1321        N[i]=kbase(Borid,d);
1322        NumN[i]=size(N[i]);
1323       }
1324int qc=NumNewVar(B, NumN);
1325if(qc==0)
1326{Jms=list(0);}
1327else
1328 {
1329//Now I must define the NEW RING,
1330//putting the c parameters inside.
1331list L=ringlist(r);
1332list L2;
1333L2[1]=L[1];
1334L2[2]=list();
1335for(i=qc;i>=1;i--)
1336    {
1337     L2[2][i]="c("+string(i)+")";
1338    }
1339L2[3]=list(list("rp",qc));
1340L2[4]=L[4];
1341L[1]=L2;
1342if(defined(K)){kill K;}
1343def K=ring(L);
1344export K;
1345setring(K);
1346def Borid=imap(r,Borid);
1347def N=imap(r,N);
1348def B=imap(r,B);
1349//NumN contains only scalars so I do not imap it
1350int j;
1351list Q;
1352int s;
1353list M;
1354jmp pp;
1355for(i=1;i<=size(B);i++)
1356    {
1357      Q[i]=list();
1358     for(j=1;j<=size(B[i]);j++)
1359        {
1360          M=NewTails(N[i],s);
1361          pp.h=B[i][j];
1362          pp.t=M[1];
1363          Q[i][j]=pp;
1364          s=s+M[2];
1365          //print(s);
1366        }
1367    }
1368list P=ArrangeTails(Q);
1369list EK,D= EKPolynomials(P);
1370     int massimo=Max(D);
1371//list V=VConst(P, massimo);
1372//pause();
1373list V=VmConstructor(P,massimo,r);
1374list W=FinalVm(V,P,K);
1375//print("I V ridotti in ordine sono");
1376//print(W);
1377//list
1378Jms=SchemeEq(W,EK,D,P,K);
1379keepring K;}
1380}
1381  }
1382else
1383   {
1384    print("WRONG IDEAL IN INPUT");
1385    print("It is NOT BOREL");
1386   }
1387return(Jms);
1388}
1389example
1390{ "EXAMPLE:"; echo = 2;
1391 ring r=0, (x,y,z),rp;
1392 ideal Borid=y^2*z,y*z^2,z^3,y^5;
1393JMarkedScheme(Borid,r);
1394}
1395////////////////////////////////////////////////////////////////////
Note: See TracBrowser for help on using the repository browser.