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

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