source: git/Singular/LIB/noether.lib

spielwiese
Last change on this file was 3f7e01a, checked in by Hans Schoenemann <hannes@…>, 10 months ago
remnemae: sat -> sat, sat_with_exp
  • Property mode set to 100644
File size: 31.2 KB
Line 
1/////////////////////////////////////////////////////////////////////////////
2version="version noether.lib 4.1.2.0 Feb_2019 "; // $Id$
3category="Commutative Algebra";
4info="
5LIBRARY: noether.lib   Noether normalization of an ideal (not necessary
6                       homogeneous)
7AUTHORS: A. Hashemi,  Amir.Hashemi@lip6.fr
8
9
10OVERVIEW:
11A library for computing the Noether normalization of an ideal that DOES NOT
12require the computation of the dimension of the ideal.
13It checks whether an ideal is in Noether position.  A modular version of
14these algorithms is also provided.
15The procedures are based on a paper of Amir Hashemi 'Efficient Algorithms for
16Computing Noether Normalization' (presented in ASCM 2007)
17
18This library computes also Castelnuovo-Mumford regularity and satiety of an
19ideal.  A modular version of these algorithms is also provided.
20The procedures are based on a paper of Amir Hashemi 'Computation of
21Castelnuovo-Mumford regularity and satiety' (preprint 2008)
22
23
24PROCEDURES:
25 NPos_test(id);  checks whether monomial ideal id is in Noether position
26 modNpos_test(id); the same as above using modular methods
27 NPos(id);       Noether normalization of ideal id
28 modNPos(id);      Noether normalization of ideal id by modular methods
29 nsatiety(id); Satiety of ideal id
30 modsatiety(id)  Satiety of ideal id by modular methods
31 regCM(id);    Castelnuovo-Mumford regularity of ideal id
32 modregCM(id); Castelnuovo-Mumford regularity of ideal id by modular methods
33";
34LIB "elim.lib";
35LIB "algebra.lib";
36LIB "polylib.lib";
37LIB "ring.lib";
38LIB "presolve.lib";
39
40///////////////////////////////////////////////////////////////////////////////
41
42proc NPos_test (ideal I)
43"
44USAGE:  NPos_test (I); I monomial ideal
45RETURN: A list whose first element is 1, if i is in Noether position,
46        0 otherwise. The second element of this list is a list of variables ordered
47        such that those variables are listed first, of which a power belongs to the
48        initial ideal of i. If i is in Noether position, the method returns furthermore
49        the dimension of i.
50ASSUME: i is a nonzero monomial ideal.
51"
52{
53//--------------------------- initialisation ---------------------------------
54   int  time,ii,j,k,l,d,t,jj;
55   intvec v;
56   def r0 = basering;
57   int n = nvars(r0)-1;
58   list L,Y,P1,P2,P3;
59   if (I[1]==1)
60   {
61     print("The ideal is 1");return(1);
62   }
63   for ( ii = 1; ii <= n+1; ii++ )
64   {
65     L[ii]=0;
66   }
67   for ( ii = 1; ii <= size(I); ii++ )
68   {
69     Y=variables(I[ii]);
70     l=rvar(Y[1][1]);
71     if (size(Y[1])==1)
72     {
73       L[l]=1;
74       P1=insert(P1,Y[1][1]);
75     }
76     if (L[l]==0)
77     {
78       L[l]=-1;
79     }
80   }
81   t=size(P1);
82   if (t==0)
83   {
84     for ( jj = 1; jj <= n+1; jj++ )
85     {
86       P3=insert(P3,varstr(jj));
87     }
88   }
89   else
90   {
91     P2=findvars(ideal(P1[1..t]))[3];
92     for ( jj = 1; jj <= size(P2[1]); jj++ )
93     {
94       P3=insert(P3,P2[1][jj]);
95     }
96   }
97   if (L[n+1]==-1)
98   {
99     return(list(0,P1+P3));
100   }
101   for ( ii = 1; ii <= n; ii++ )
102   {
103     if (L[ii]==-1)
104     {
105       return(list(0,P1+P3));
106     }
107     if (L[ii]==0 and L[ii+1]==1)
108     {
109       return(list(0,P1+P3));
110     }
111   }
112   d=n+1-sum(L);
113   print("The dimension of the ideal is:");print(d);
114   return(list(1,P1+P3));
115}
116example
117{ "EXAMPLE:"; echo = 2;
118ring r=0,(X,Y,a,b),dp;
119poly f=X^8+a*Y^4-Y;
120poly g=Y^8+b*X^4-X;
121poly h=diff(f,X)*diff(g,Y)-diff(f,Y)*diff(g,X);
122ideal i=f,g,h;
123NPos_test(i);
124}
125//////////////////////////////////////////
126proc modNpos_test (ideal i)
127"USAGE: modNpos_test(i); i an ideal
128RETURN: 1 if i is in Noether position 0  otherwise.
129NOTE:   This test is a probabilistic test, and it computes the initial of the ideal modulo the prime number 2147483647 (the biggest prime less than 2^31).
130"
131{
132  "// WARNING:
133// The procedure is probabilistic and  it computes the initial of the ideal modulo the prime number 2147483647";
134  int p;
135  def br=basering;
136  setring br;
137  ideal I;
138  list #;
139  option(redSB);
140  p=2147483647;
141  #=ringlist(br);
142  #[1]=p;
143  def oro=ring(#);
144  setring oro;
145  ideal sbi,lsbi;
146  sbi=fetch(br,i);
147  lsbi=lead(std(sbi));
148  setring br;
149  I=fetch(oro,lsbi);
150  I=simplify(I,1);
151  attrib(I,"isSB",1);
152  return(NPos_test(I));
153}
154example
155{ "EXAMPLE:"; echo = 2;
156ring r=0,(X,Y,a,b),dp;
157poly f=X^8+a*Y^4-Y;
158poly g=Y^8+b*X^4-X;
159poly h=diff(f,X)*diff(g,Y)-diff(f,Y)*diff(g,X);
160ideal i=f,g,h;
161modNpos_test(i);
162}
163
164
165///////////////////////////////////////////////////////////////////////////////
166proc NPos (ideal i)
167"USAGE:  NPos(i); i ideal
168RETURN:  A linear map phi such that  phi(i) is in Noether position
169KEYWORDS: Noether position
170"
171{
172//--------------------------- initialisation ---------------------------------
173  int ii,jj,d,time,n,nl,zz;
174  intmat ran;
175  def r0 = basering;
176  ideal K,chcoord;
177  n = nvars(r0)-1;
178  list l1;
179  for (zz = 0; zz<= n; zz++)
180  {
181   l1[zz+1] = "x("+string(zz)+")";
182  }
183  ring r1 = create_ring(ring_list(r0)[1], l1, "dp", "no_minpoly");
184  ideal i,sbi,I,K,chcoord,m,L;
185  list #;
186  poly P;
187  map phi;
188  i = fetch(r0,i);
189  time=rtimer;
190  system("--ticks-per-sec",10);
191  i=std(i);
192  sbi=sort(lead(i))[1];
193  #=NPos_test(sbi);
194  if ( #[1]== 1 )
195  {
196    return ("The ideal is in Noether position and the time of this computation is:",rtimer-time,"/10 sec.");
197  }
198  else
199  {
200    L=maxideal(1);
201    chcoord=maxideal(1);
202    for ( ii = 1; ii<=n+1; ii++ )
203    {
204      chcoord[rvar(#[2][ii])]=L[ii];
205    }
206    phi=r1,chcoord;
207    sbi=phi(sbi);
208    if ( NPos_test(sbi)[1] == 1 )
209    {
210      setring r0;
211      chcoord=fetch(r1,chcoord);
212      return (chcoord,"and the time of this computation is:",rtimer-time,"/10 sec.");
213    }
214  }
215  while ( nl < 30 )
216  {
217    nl=nl+1;
218    I=i;
219    L=maxideal(1);
220    for ( ii = n; ii>=0; ii-- )
221    {
222      chcoord=select1(maxideal(1),1..ii);
223      ran=random(100,1,ii);
224      ran=intmat(ran,1,ii+1);
225      ran[1,ii+1]=1;
226      m=select1(maxideal(1),1..(ii+1));
227      for ( jj = 1; jj<=ii+1; jj++ )
228      {
229        P=P+ran[1,jj]*m[jj];
230      }
231      chcoord[ii+1]=P;
232      L[ii+1]=P;
233      P=0;
234      phi=r1,chcoord;
235      I=phi(I);
236      if ( NPos_test(sort(lead(std(I)))[1])[1] == 1 )
237      {
238        K=x(ii..n);
239        setring r0;
240        K=fetch(r1,K);
241        ideal L=fetch(r1,L);
242        return (L,"and the time of this computation is:",rtimer-time,"/10 sec.");
243      }
244    }
245  }
246  "// WARNING:
247// The procedure has entered in more than 30 loops: in your example
248// the method may enter an infinite loop over a finite field!";
249  return (-1);
250}
251example
252{ "EXAMPLE:"; echo = 2;
253ring r=0,(X,Y,a,b),dp;
254poly f=X^8+a*Y^4-Y;
255poly g=Y^8+b*X^4-X;
256poly h=diff(f,X)*diff(g,Y)-diff(f,Y)*diff(g,X);
257ideal i=f,g,h;
258NPos(i);
259}
260///////////////////////////////////////////////////////////////////////////////
261proc modNPos (ideal i)
262"USAGE:  modNPos(i); i ideal
263RETURN:  A linear map phi such that  phi(i) is in Noether position
264NOTE:    It uses the procedure  modNpos_test to test Noether position.
265"
266{
267//--------------------------- initialisation ---------------------------------
268   int ii,jj,d,time,n,nl,zz;
269   intmat ran;
270   def r0 = basering;
271   ideal K,chcoord;
272   n = nvars(r0)-1;
273   list l2;
274   for (zz = 0; zz<= n; zz++)
275   {
276     l2[zz+1] = "x("+string(zz)+")";
277   }
278   ring r1 = create_ring(ring_list(r0)[1], l2, "dp", "no_minpoly");
279   ideal i,sbi,I,K,chcoord,m,L;
280   poly P;
281   list #;
282   map phi;
283   i = fetch(r0,i);
284   time=rtimer;
285   system("--ticks-per-sec",10);
286   #=modNpos_test(i);
287   if ( #[1]== 1 )
288   {
289     return ("The ideal is in Noether position and the time of this computation is:",rtimer-time,"/10 sec.");
290   }
291   else
292   {
293     L=maxideal(1);
294     chcoord=maxideal(1);
295     for ( ii = 1; ii<=n+1; ii++ )
296     {
297       chcoord[rvar(#[2][ii])]=L[ii];
298     }
299     phi=r1,chcoord;
300     I=phi(i);
301     if ( modNpos_test(I)[1] == 1 )
302     {
303       setring r0;
304       chcoord=fetch(r1,chcoord);
305       return (chcoord,"and the time of this computation is:",rtimer-time,"/10 sec.");
306     }
307   }
308   while ( nl < 30 )
309   {
310     nl=nl+1;
311     I=i;
312     L=maxideal(1);
313     for ( ii = n; ii>=0; ii-- )
314     {
315       chcoord=select1(maxideal(1),1..ii);
316       ran=random(100,1,ii);
317       ran=intmat(ran,1,ii+1);
318       ran[1,ii+1]=1;
319       m=select1(maxideal(1),1..(ii+1));
320       for ( jj = 1; jj<=ii+1; jj++ )
321       {
322         P=P+ran[1,jj]*m[jj];
323       }
324       chcoord[ii+1]=P;
325       L[ii+1]=P;
326       P=0;
327       phi=r1,chcoord;
328       I=phi(I);
329       if ( modNpos_test(I)[1] == 1 )
330       {
331         K=x(ii..n);
332         setring r0;
333         K=fetch(r1,K);
334         ideal L=fetch(r1,L);
335         return (L,"and the time of this computation is:",rtimer-time,"/10 sec.");
336       }
337     }
338   }
339   "// WARNING:
340// The procedure has entered in more than 30 loops: in your example
341// the method may enter an infinite loop over a finite field!";
342   return (-1);
343}
344example
345{ "EXAMPLE:"; echo = 2;
346ring r=0,(X,Y,a,b),dp;
347poly f=X^8+a*Y^4-Y;
348poly g=Y^8+b*X^4-X;
349poly h=diff(f,X)*diff(g,Y)-diff(f,Y)*diff(g,X);
350ideal i=f,g,h;
351modNPos(i);
352}
353
354////////////////////////////////////////////////////////////////////////////////////
355static proc TestLastVarIsInGenericPos (ideal i)
356"USAGE:   TestLastVarIsInGenericPos (i); i a monomial ideal,
357RETURN:  1 if the last variable is in generic position for i and 0 otherwise.
358THEORY:  The last variable is in generic position if the quotient of the ideal
359         with respect to this variable is equal to the quotient of the ideal with respect to the maximal ideal.
360"
361{
362//--------------------------- initialisation ---------------------------------
363  int n,ret,zz;
364  def r0 = basering;
365  n = nvars(r0)-1;
366  list l3;
367  for (zz = 0; zz<= n; zz++)
368  {
369    l3[zz+1] = "x("+string(zz)+")";
370  }
371  ring r1 = create_ring(ring_list(r0)[1], l3, "dp", "no_minpoly");
372  ideal I,i;
373  i = fetch(r0,i);
374  attrib(i,"isSB",1);
375  I=quotient(select(i,n+1),x(n));
376  I=I*maxideal(1);
377  ret=1;
378  if (size(reduce(I,i,5)) <> 0)
379  {
380    ret=0;
381  }
382  return(ret);
383}
384
385////////////////////////////////////////////////////////////////////////////////////
386proc nsatiety (ideal i)
387"USAGE:   nsatiety (i); i ideal,
388RETURN:  an integer, the satiety of i.
389         (returns -1 if i is not homogeneous)
390ASSUME:  i is a homogeneous ideal of the basering R=K[x(0)..x(n)].
391THEORY:  The satiety, or saturation index, of a homogeneous ideal i is the
392         least integer s such that, for all d>=s, the degree d part of the
393         ideals i and isat=sat(i,maxideal(1)) coincide.
394KEYWORDS: saturation
395"
396{
397//--------------------------- initialisation ---------------------------------
398  int e,ii,jj,h,d,time,lastv,nl,ret,zz;
399  intmat ran;
400  def r0 = basering;
401  int n = nvars(r0)-1;
402  list l4;
403  for (zz = 0; zz<= n; zz++)
404  {
405    l4[zz+1] = "x("+string(zz)+")";
406  }
407  ring r1 = create_ring(ring_list(r0)[1], l4, "dp", "no_minpoly");
408  ideal i,sbi,I,K,chcoord,m,L;
409  poly P;
410  map phi;
411  i = fetch(r0,i);
412  time=rtimer;
413  system("--ticks-per-sec",100);
414  sbi=std(i);
415//----- Check ideal homogeneous
416  if ( homog(sbi) == 0 )
417  {
418    dbprint(2,"The ideal is not homogeneous, and time for this test is: " + string(rtimer-time) + "/100sec.");
419    return ();
420  }
421  I=simplify(lead(sbi),1);
422  attrib(I,"isSB",1);
423  K=select(I,n+1);
424  if (size(K) == 0)
425  {
426    dbprint(2,"sat(i)=0 and the time of this computation: " + string(rtimer-time) + "/100sec.");
427    return();
428  }
429  if (TestLastVarIsInGenericPos(I) == 1 )
430  {
431    dbprint(2,"sat(i)=" + string(maxdeg1(K)) + " and the time of this computation: " + string(rtimer-time) + "/100sec.");
432    return();
433  }
434  while ( nl < 5 )
435  {
436    nl=nl+1;
437    chcoord=select1(maxideal(1),1..n);
438    ran=random(100,1,n);
439    ran=intmat(ran,1,n+1);
440    ran[1,n+1]=1;
441    m=select1(maxideal(1),1..(n+1));
442    for ( jj = 1; jj<=n+1; jj++ )
443    {
444      P=P+ran[1,jj]*m[jj];
445    }
446    chcoord[n+1]=P;
447    P=0;
448    phi=r1,chcoord;
449    L=std(phi(i));
450    I=simplify(lead(L),1);
451    attrib(I,"isSB",1);
452    K=select(I,n+1);
453    if (size(K) == 0)
454    {
455      dbprint(2,"sat(i)=0 and the time of this computation: " + string(rtimer-time) + "/100sec.");
456      return();
457    }
458    if (TestLastVarIsInGenericPos(I) == 1 )
459    {
460      dbprint(2,"sat(i)=" + string(maxdeg1(K)) + " and the time of this computation: " + string(rtimer-time) + "/100sec.");
461      return();
462    }
463  }
464}
465example
466{ "EXAMPLE:"; echo = 2;
467ring r=0,(t,a,b,c,d),dp;
468ideal i=b4-a3d, ab3-a3c, bc4-ac3d-bcd3+ad4, c6-bc3d2-c3d3+bd5, ac5-b2c3d-ac2d3+b2d4, a2c4-a3d3+b3d3-a2cd3, b3c3-a3d3, ab2c3-a3cd2+b3cd2-ab2d3, a2bc3-a3c2d+b3c2d-a2bd3, a3c3-a3bd2, a4c2-a3b2d;
469nsatiety(i);
470}
471
472
473//////////////////////////////////////////////////////////////////////////////
474proc modsatiety (ideal i)
475"USAGE:   modsatiety(i); i ideal,
476RETURN:  an integer, the satiety of i.
477         (returns -1 if i is not homogeneous)
478ASSUME:  i is a homogeneous ideal of the basering R=K[x(0)..x(n)].
479THEORY:  The satiety, or saturation index, of a homogeneous ideal i is the
480         least integer s such that, for all d>=s, the degree d part of the
481         ideals i and isat=sat(i,maxideal(1)) coincide.
482NOTE:    This is a probabilistic procedure, and it computes the initial of the ideal modulo the prime number 2147483647 (the biggest prime less than 2^31).
483KEYWORDS: saturation
484"
485{
486//--------------------------- initialisation ---------------------------------
487  "// WARNING: The characteristic of base field must be zero.
488// The procedure is probabilistic and  it computes the
489//initial ideals modulo the prime number 2147483647.";
490  int e,ii,jj,h,d,time,lastv,nl,ret,s1,d1,siz,j,si,u,k,p,zz;
491  intvec v1;
492  intmat ran;
493  def r0 = basering;
494  int n = nvars(r0)-1;
495  list l5;
496  for (zz = 0; zz<= n; zz++)
497  {
498    l5[zz+1] = "x("+string(zz)+")";
499  }
500  ring r1 = create_ring(ring_list(r0)[1], l5, "dp", "no_minpoly");
501  ideal i,sbi,I,K,chcoord,m,L,sbi1,lsbi1,id1;
502  vector V1;
503  list #,LL,PL,Gb1,VGb1,Gb2,VGb2,Res1,Res2;
504  poly P;
505  map phi;
506  time=rtimer;
507  system("--ticks-per-sec",100);
508  i = fetch(r0,i);
509//----- Check ideal homogeneous
510  if ( homog(i) == 0 )
511  {
512    "// WARNING: The ideal is not homogeneous.";
513    dbprint(2,"Time for this test is: " + string(rtimer-time) + "/100sec.");
514    return ();
515  }
516  option(redSB);
517  p=2147483647;
518  list r2=ringlist(r1);
519  r2[1]=p;
520  def oro=ring(r2);
521  setring oro;
522  ideal sbi=fetch(r1,i);
523  sbi=std(sbi);
524  setring r1;
525  sbi=fetch(oro,sbi);
526  kill oro;
527  I=simplify(lead(sbi),1);
528  attrib(I,"isSB",1);
529  K=select(I,n+1);
530  if (size(K) == 0)
531  {
532    dbprint(2,"msat(i)=0 and the time of this computation: " + string(rtimer-time) + "/100sec.");
533    return();
534  }
535  if (TestLastVarIsInGenericPos(I) == 1 )
536  {
537    dbprint(2,"msat(i)=" + string(maxdeg1(K)) + " and the time of this computation: " + string(rtimer-time) + "/100sec.");
538    return();
539  }
540  while ( nl < 30 )
541  {
542    nl=nl+1;
543    chcoord=select1(maxideal(1),1..n);
544    ran=random(100,1,n);
545    ran=intmat(ran,1,n+1);
546    ran[1,n+1]=1;
547    m=select1(maxideal(1),1..(n+1));
548    for ( jj = 1; jj<=n+1; jj++ )
549    {
550      P=P+ran[1,jj]*m[jj];
551    }
552    chcoord[n+1]=P;
553    P=0;
554    phi=r1,chcoord;
555    sbi=phi(i);
556    list r2=ringlist(r1);
557    r2[1]=p;
558    def oro=ring(r2);
559    setring oro;
560    ideal sbi=fetch(r1,sbi);
561    sbi=std(sbi);
562    setring r1;
563    sbi=fetch(oro,sbi);
564    kill oro;
565    lsbi1=lead(sbi);
566    attrib(lsbi1,"isSB",1);
567    K=select(lsbi1,n+1);
568    if (size(K) == 0)
569    {
570      dbprint(2,"msat(i)=0 and the time of this computation: " + string(rtimer-time) + "/100sec.");
571      return();
572    }
573    if (TestLastVarIsInGenericPos(lsbi1) == 1 )
574    {
575      dbprint(2,"msat(i)=" + string(maxdeg1(K)) + " and the time of this computation: " + string(rtimer-time) + "/100sec.");
576      return();
577    }
578  }
579}
580example
581{ "EXAMPLE:"; echo = 2;
582ring r=0,(t,a,b,c,d),dp;
583ideal i=b4-a3d, ab3-a3c, bc4-ac3d-bcd3+ad4, c6-bc3d2-c3d3+bd5, ac5-b2c3d-ac2d3+b2d4, a2c4-a3d3+b3d3-a2cd3, b3c3-a3d3, ab2c3-a3cd2+b3cd2-ab2d3, a2bc3-a3c2d+b3c2d-a2bd3, a3c3-a3bd2, a4c2-a3b2d;
584modsatiety(i);
585}
586
587//////////////////////////////////////////////////////////////////////////////
588//
589proc regCM (ideal i)
590"USAGE:  regCM (i); i ideal
591RETURN:  the Castelnuovo-Mumford regularity of i.
592         (returns -1 if i is not homogeneous)
593ASSUME:  i is a homogeneous ideal.
594KEYWORDS: regularity
595"
596{
597//--------------------------- initialisation ---------------------------------
598  int e,ii,jj,H,h,d,time,nl,zz;
599  def r0 = basering;
600  int n = nvars(r0)-1;
601  list l6;
602  for (zz = 0; zz<= n; zz++)
603  {
604    l6[zz+1] = "x("+string(zz)+")";
605  }
606  ring r1 = create_ring(ring_list(r0)[1], l6, "dp", "no_minpoly");
607  ideal i,sbi,I,J,K,L;
608  list #;
609  poly P;
610  map phi;
611  i = fetch(r0,i);
612  time=rtimer;
613  system("--ticks-per-sec",100);
614  sbi=std(i);
615//----- Check ideal homogeneous
616  if ( homog(sbi) == 0 )
617  {
618    "// The ideal is not homogeneous!";
619    return (-1);
620  }
621  I=simplify(lead(sbi),1);
622  attrib(I,"isSB",1);
623  d=dim(I);
624  if (char(r1) > 0 and d == 0)
625  {
626    def r2=changechar(0,r1);
627    setring r2;
628    ideal sbi,I,i,K,T;
629    map phi;
630    I = fetch(r1,I);
631    i=I;
632    attrib(I,"isSB",1);
633  }
634  else
635  {
636    def r2=changechar(ring_list(r1)[1],r1);
637    setring r2;
638    ideal sbi,I,i,K,T,ic,Ic;
639    map phi;
640    I = imap(r1,I);
641    Ic=I;
642    attrib(I,"isSB",1);
643    i = imap(r1,i);
644    ic=i;
645  }
646  K=select(I,n+1);
647  if (size(K) == 0)
648  {
649    h=0;
650  }
651  else
652  {
653    if (TestLastVarIsInGenericPos(I) == 1)
654    {
655      h=maxdeg1(K);
656    }
657    else
658    {
659      while ( nl < 30 )
660      {
661        nl=nl+1;
662        phi=r2,randomLast(100);
663        T=phi(i);
664        I=simplify(lead(std(T)),1);
665        attrib(I,"isSB",1);
666        K=select(I,n+1);
667        if (size(K) == 0)
668        {
669          h=0;break;
670        }
671        if (TestLastVarIsInGenericPos(I) == 1 )
672        {
673          h=maxdeg1(K);break;
674        }
675      }
676      i=T;
677    }
678  }
679  list l7;
680  for ( ii = n; ii>=n-d+1; ii-- )
681  {
682    l7=list();
683    i=subst(i,x(ii),0);
684    for (zz = 0; zz<= ii-1; zz++)
685    {
686      l7[zz+1] = "x("+string(zz)+")";
687    }
688    ring mr = create_ring(ring_list(r1)[1], l7, "dp", "no_minpoly");
689    ideal i,sbi,I,J,K,L,T;
690    poly P;
691    map phi;
692    i=imap(r2,i);
693    I=simplify(lead(std(i)),1);
694    attrib(I,"isSB",1);
695    K=select(I,ii);
696    if (size(K) == 0)
697    {
698      H=0;
699    }
700    else
701    {
702      if (TestLastVarIsInGenericPos(I) == 1)
703      {
704        H=maxdeg1(K);
705      }
706      else
707      {
708        while ( nl < 30 )
709        {
710          nl=nl+1;
711          phi=mr,randomLast(100);
712          T=phi(i);
713          I=simplify(lead(std(T)),1);
714          attrib(I,"isSB",1);
715          K=select(I,ii);
716          if (size(K) == 0)
717          {
718            H=0;break;
719          }
720          if (TestLastVarIsInGenericPos(I) == 1 )
721          {
722            H=maxdeg1(K);break;
723          }
724        }
725        setring r2;
726        i=imap(mr,T);
727        kill mr;
728      }
729    }
730    if (H > h)
731    {
732      h=H;
733    }
734  }
735  if (nl < 30)
736  {
737    dbprint(2,"reg(i)=" + string(h) + " and the time of this computation: " + string(rtimer-time) + " sec./100");
738    return();
739  }
740  else
741  {
742    I=Ic;
743    attrib(I,"isSB",1);
744    i=ic;
745    K=subst(select(I,n+1),x(n),1);
746    K=K*maxideal(maxdeg1(I));
747    if (size(reduce(K,I,5)) <> 0)
748    {
749      nl=0;
750      while ( nl < 30 )
751      {
752        nl=nl+1;
753        phi=r1,randomLast(100);
754        sbi=phi(i);
755        I=simplify(lead(std(sbi)),1);
756        attrib(I,"isSB",1);
757        K=subst(select(I,n+1),x(n),1);
758        K=K*maxideal(maxdeg1(I));
759        if (size(reduce(K,I,5)) == 0)
760        {
761          break;
762        }
763      }
764    }
765    h=maxdeg1(simplify(reduce(quotient(I,maxideal(1)),I),2))+1;
766    list l8;
767    for ( ii = n; ii> n-d+1; ii-- )
768    {
769      l8=list();
770      sbi=subst(sbi,x(ii),0);
771      for (zz = 0; zz<= ii-1; zz++)
772      {
773        l8[zz+1] = "x("+string(zz)+")";
774      }
775      ring mr = create_ring(ring_list(r0)[1], l8, "dp", "no_minpoly");
776      ideal sbi,I,L,K,T;
777      map phi;
778      sbi=imap(r1,sbi);
779      I=simplify(lead(std(sbi)),1);
780      attrib(I,"isSB",1);
781      K=subst(select(I,ii),x(ii-1),1);
782      K=K*maxideal(maxdeg1(I));
783      if (size(reduce(K,I,5)) <> 0)
784      {
785        nl=0;
786        while ( nl < 30 )
787        {
788          nl=nl+1;
789          L=randomLast(100);
790          phi=mr,L;
791          T=phi(sbi);
792          I=simplify(lead(std(T)),1);
793          attrib(I,"isSB",1);
794          K=subst(select(I,ii),x(ii-1),1);
795          K=K*maxideal(maxdeg1(I));
796          if (size(reduce(K,I,5)) == 0)
797          {
798            sbi=T;
799            break;
800          }
801        }
802      }
803      H=maxdeg1(simplify(reduce(quotient(I,maxideal(1)),I),2))+1;
804      if (H > h)
805      {
806        h=H;
807      }
808      setring r1;
809      sbi=fetch(mr,sbi);
810      kill mr;
811    }
812    sbi=subst(sbi,x(n-d+1),0);
813    list l9;
814    for (zz = 0; zz<= n-d; zz++)
815    {
816      l9[zz+1] = "x("+string(zz)+")";
817    }
818    ring mr = create_ring(ring_list(r0)[1], l9, "dp", "no_minpoly");
819    ideal sbi,I,L,K,T;
820    map phi;
821    sbi=imap(r1,sbi);
822    I=simplify(lead(std(sbi)),1);
823    attrib(I,"isSB",1);
824    H=maxdeg1(simplify(reduce(quotient(I,maxideal(1)),I),2))+1;
825    if (H > h)
826    {
827      h=H;
828    }
829    dbprint(2,"reg(i)=" + string(h) + " and the time of this computation: " + string(rtimer-time) + " sec./100");
830    return();
831  }
832}
833example
834{ "EXAMPLE:"; echo = 2;
835ring r=0,(t,a,b,c,d),dp;
836ideal i=b4-a3d, ab3-a3c, bc4-ac3d-bcd3+ad4, c6-bc3d2-c3d3+bd5, ac5-b2c3d-ac2d3+b2d4, a2c4-a3d3+b3d3-a2cd3, b3c3-a3d3, ab2c3-a3cd2+b3cd2-ab2d3, a2bc3-a3c2d+b3c2d-a2bd3, a3c3-a3bd2, a4c2-a3b2d;
837regCM(i);
838}
839
840//////////////////////////////////////////////////////////////////////////////
841//
842proc modregCM(ideal i)
843"USAGE:  modregCM(i); i ideal
844RETURN:  an integer, the Castelnuovo-Mumford regularity of i.
845         (returns -1 if i is not homogeneous)
846ASSUME:  i is a homogeneous ideal and the characteristic of base field is zero..
847NOTE:    This is a probabilistic procedure, and it computes the initial of the ideal modulo the prime number 2147483647 (the biggest prime less than 2^31).
848KEYWORDS: regularity
849"
850{
851//--------------------------- initialisation ---------------------------------
852  "// WARNING: The characteristic of base field must be zero.
853// This procedure is probabilistic and  it computes the initial
854//ideals modulo the prime number 2147483647";
855  int e,ii,jj,H,h,d,time,p,nl;
856  def r0 = basering;
857  int n = nvars(r0)-1;
858  list l12;
859  for (int zz = 0; zz <= n; zz++)
860  {
861   l12[zz+1] = "x("+string(zz)+")";
862  }
863  ring r1 = create_ring(ring_list(r0)[1], l12, "dp", "no_minpoly");
864  ideal i,sbi,I,J,K,L,lsbi1,lsbi2;
865  list #;
866  poly P;
867  map phi;
868  i = fetch(r0,i);
869  time=rtimer;
870  system("--ticks-per-sec",100);
871//----- Check ideal homogeneous
872  if ( homog(i) == 0 )
873  {
874    "// The ideal is not homogeneous!";
875    return (-1);
876  }
877  option(redSB);
878  p=2147483647;
879  #=ringlist(r1);
880  #[1]=p;
881  def oro=ring(#);
882  setring oro;
883  ideal sbi,lsbi;
884  sbi=fetch(r1,i);
885  lsbi=lead(std(sbi));
886  setring r1;
887  lsbi1=fetch(oro,lsbi);
888  lsbi1=simplify(lsbi1,1);
889  attrib(lsbi1,"isSB",1);
890  kill oro;
891  I=lsbi1;
892  d=dim(I);
893  K=select(I,n+1);
894  if (size(K) == 0)
895  {
896    h=0;
897  }
898  else
899  {
900    if (TestLastVarIsInGenericPos(I) == 1)
901    {
902      h=maxdeg1(K);
903    }
904    else
905    {
906      while ( nl < 30 )
907      {
908        nl=nl+1;
909        phi=r1,randomLast(100);
910        sbi=phi(i);
911        #=ringlist(r1);
912        #[1]=p;
913        def oro=ring(#);
914        setring oro;
915        ideal sbi,lsbi;
916        sbi=fetch(r1,sbi);
917        lsbi=lead(std(sbi));
918        setring r1;
919        lsbi1=fetch(oro,lsbi);
920        lsbi1=simplify(lsbi1,1);
921        attrib(lsbi1,"isSB",1);
922        kill oro;
923        I=lsbi1;
924        K=select(I,n+1);
925        if (size(K) == 0)
926        {
927          h=0;break;
928        }
929        if (TestLastVarIsInGenericPos(I) == 1 )
930        {
931          h=maxdeg1(K);break;
932        }
933      }
934      i=sbi;
935    }
936  }
937  list l11;int zz;
938  for ( ii = n; ii>=n-d+1; ii-- )
939  {
940    l11=list();
941    i=subst(i,x(ii),0);
942    for (zz = 0; zz <= ii-1; zz++)
943    {
944     l11[zz+1] = "x("+string(zz)+")";
945    }
946    ring mr = create_ring(0, l11, "dp");
947    ideal i,sbi,I,J,K,L,lsbi1;
948    poly P;
949    list #;
950    map phi;
951    i=imap(r1,i);
952    #=ringlist(mr);
953    #[1]=p;
954    def oro=ring(#);
955    setring oro;
956    ideal sbi,lsbi;
957    sbi=fetch(mr,i);
958    lsbi=lead(std(sbi));
959    setring mr;
960    lsbi1=fetch(oro,lsbi);
961    lsbi1=simplify(lsbi1,1);
962    attrib(lsbi1,"isSB",1);
963    kill oro;
964    I=lsbi1;
965    K=select(I,ii);
966    if (size(K) == 0)
967    {
968      H=0;
969    }
970    else
971    {
972      if (TestLastVarIsInGenericPos(I) == 1)
973      {
974        H=maxdeg1(K);
975      }
976      else
977      {
978        nl=0;
979        while ( nl < 30 )
980        {
981          nl=nl+1;
982          phi=mr,randomLast(100);
983          sbi=phi(i);
984          #=ringlist(mr);
985          #[1]=p;
986          def oro=ring(#);
987          setring oro;
988          ideal sbi,lsbi;
989          sbi=fetch(mr,sbi);
990          lsbi=lead(std(sbi));
991          setring mr;
992          lsbi1=fetch(oro,lsbi);
993          lsbi1=simplify(lsbi1,1);
994          kill oro;
995          I=lsbi1;
996          attrib(I,"isSB",1);
997          K=select(I,ii);
998          if (size(K) == 0)
999          {
1000            H=0;break;
1001          }
1002          if (TestLastVarIsInGenericPos(I) == 1 )
1003          {
1004            H=maxdeg1(K);break;
1005          }
1006        }
1007        setring r1;
1008        i=imap(mr,sbi);
1009        kill mr;
1010      }
1011    }
1012    if (H > h)
1013    {
1014      h=H;
1015    }
1016  }
1017  dbprint(2,"mreg(i)=" + string(h) + " and the time of this computation: " + string(rtimer-time) + "sec./100");
1018  return();
1019}
1020example
1021{ "EXAMPLE:"; echo = 2;
1022ring r=0,(t,a,b,c,d),dp;
1023ideal i=b4-a3d, ab3-a3c, bc4-ac3d-bcd3+ad4, c6-bc3d2-c3d3+bd5, ac5-b2c3d-ac2d3+b2d4, a2c4-a3d3+b3d3-a2cd3, b3c3-a3d3, ab2c3-a3cd2+b3cd2-ab2d3, a2bc3-a3c2d+b3c2d-a2bd3, a3c3-a3bd2, a4c2-a3b2d;
1024modregCM(i);
1025}
1026/*
1027//////////////////////////////////////////////////////////////
1028example
1029{ "EXAMPLE:"; echo = 2;
1030ring r=0,(X,Y,a,b),dp;
1031poly f=X^8+a*Y^4-Y;
1032poly g=Y^8+b*X^4-X;
1033poly h=diff(f,X)*diff(g,Y)-diff(f,Y)*diff(g,X);
1034ideal i=f,g,h;
1035}
1036example
1037{ "EXAMPLE:"; echo = 2;
1038ring r=0,(x,y,z,a,b),dp;
1039ideal i=2*y^2*(y^2+x^2)+(b^2-3*a^2)*y^2-2*b*y^2*(x+y)+2*a^2*b*(y+x)-a^2*x^2+a^2*(a^2-b^2),4*y^3+4*y*(y^2+x^2)-2*b*y^2-4*b*y*(y+x)+2*(b^2-3*a^2)*y+2*a^2*b,4*x*y^2-2*b*y^2-2*a^2*x+2*a^2*b;
1040}
1041example
1042{ "EXAMPLE:"; echo = 2;
1043ring r=0,(t,a,b,c,d),dp;
1044ideal i=b4-a3d, ab3-a3c, bc4-ac3d-bcd3+ad4, c6-bc3d2-c3d3+bd5, ac5-b2c3d-ac2d3+b2d4, a2c4-a3d3+b3d3-a2cd3, b3c3-a3d3, ab2c3-a3cd2+b3cd2-ab2d3, a2bc3-a3c2d+b3c2d-a2bd3, a3c3-a3bd2, a4c2-a3b2d;
1045}
1046example
1047{ "EXAMPLE:"; echo = 2;
1048ring r=0,(a,b,c,d,e),dp;
1049ideal i=6*b4*c3+21*b4*c2*d+15b4cd2+9b4d3-8b2c2e-28b2cde+36b2d2e-144b2c-648b2d-120, 9b4c4+30b4c3d+39b4c2d2+18b4cd3-24b2c3e-16b2c2de+16b2cd2e+24b2d3e-432b2c2-720b2cd-432b2d2+16c2e2-32cde2+16d2e2+576ce-576de-240c+5184,-15b2c3e+15b2c2de-81b2c2+216b2cd-162b2d2+40c2e2-80cde2+40d2e2+1008ce-1008de+5184, -4b2c2+4b2cd-3b2d2+22ce-22de+261;
1050}
1051example
1052{ "EXAMPLE:"; echo = 2;
1053ring r=0,(c,b,d,p,q),dp;
1054ideal i=2*(b-1)^2+2*(q-p*q+p^2)+c^2*(q-1)^2-2*b*q+2*c*d*(1-q)*(q-p)+2*b*p*q*d*(d-c)+b^2*d^2*(1-2*p)+2*b*d^2*(p-q)+2*b*d*c*(p-1)+2*b*p*q*(c+1)+(b^2-2*b)*p^2*d^2+2*b^2*p^2+4*b*(1-b)*p+d^2*(p-q)^2,d*(2*p+1)*(q-p)+c*(p+2)*(1-q)+b*(b-2)*d+b*(1-2*b)*p*d+b*c*(q+p-p*q-1)+b*(b+1)*p^2*d, -b^2*(p-1)^2+2*p*(p-q)-2*(q-1),b^2+4*(p-q*q)+3*c^2*(q-1)*(q-1)-3*d^2*(p-q)^2+3*b^2*d^2*(p-1)^2+b^2*p*(p-2)+6*b*d*c*(p+q+q*p-1);
1055}
1056example
1057{ "EXAMPLE:"; echo = 2;
1058ring r=0,(a,b,c,d,e,f),dp;
1059ideal i=2adef+3be2f-cef2,4ad2f+5bdef+cdf2,2abdf+3b2ef-bcf2,4a2df+5abef+acf2,4ad2e+3bde2+7cdef, 2acde+3bce2-c2ef, 4abde+3b2e2-4acdf+2bcef-c2f2, 4a2de+3abe2+7acef, 4acd2+5bcde+c2df, 4abd2+3b2de+7bcdf, 16a2d2-9b2e2+32acdf-18bcef+7c2f2, 2abcd+3b2ce-bc2f, 4a2cd+5abce+ac2f, 4a2bd+3ab2e+7abcf, abc2f-cdef2, ab2cf-bdef2, 2a2bcf+3be2f2-cef3, ab3f-3bdf3, 2a2b2f-4adf3+3bef3-cf4, a3bf+4aef3, 3ac3e-cde3, 3b2c2e-bc3f+2cd2ef, abc2e-cde2f, 6a2c2e-4ade3-3be4+ce3f, 3b3ce-b2c2f+2bd2ef, 2a2bce+3be3f-ce2f2, 3a3ce+4ae3f, 4bc3d+cd3e, 4ac3d-3bc3e-2cd2e2+c4f, 8b2c2d-4ad4-3bd3e-cd3f, 4b3cd+3bd3f, 4ab3d+3b4e-b3cf-6bd2f2, 4a4d+3a3be+a3cf-8ae2f2;
1060}
1061example
1062{ "EXAMPLE:"; echo = 2;
1063ring r=0,(x,y,z,t,u,v,w),dp;
1064ideal i=2tw+2wy-wz,2uw2-10vw2+20w3-7tu+35tv-70tw, 6tw2+2w2y-2w2z-21t2-7ty+7tz, 2v3-4uvw-5v2w+6uw2+7vw2-15w3-42vy, 6tw+9wy+2vz-3wz-21x, 9uw3-45vw3+135w4+14tv2-70tuw+196tvw-602tw2-14v2z+28uwz+14vwz-28w2z+147ux-735vx+2205wx-294ty+98tz+294yz-98z2, 36tw3+6w3y-9w3z-168t2w-14v2x+28uwx+14vwx-28w2x-28twy+42twz+588tx+392xy-245xz, 2uvw-6v2w-uw2+13vw2-5w3-28tw+14wy, u2w-3uvw+5uw2-28tw+14wy, tuw+tvw-11tw2-2vwy+8w2y+uwz-3vwz+5w2z-21wx, 5tuw-17tvw+33tw2-7uwy+22vwy-39w2y-2uwz+6vwz-10w2z+63wx, 20t2w-12uwx+30vwx-15w2x-10twy-8twz+4wyz, 4t2w-6uwx+12vwx-6w2x+2twy-2wy2-2twz+wyz, 8twx+8wxy-4wxz;
1065}
1066example
1067{ "EXAMPLE:"; echo = 2;
1068ring r=0,(a,b,c,d,x,w,u,v),dp;
1069ideal i=a+b+c+d,u+v+w+x, 3ab+3ac+3bc+3ad+3bd+3cd+2,bu+cu+du+av+cv+dv+aw+bw+dw+ax+bx+cx,bcu+bdu+cdu+acv+adv+cdv+abw+adw+bdw+abx+acx+bcx,abc+abd+acd+bcd,bcdu+acdv+abdw+abcx;
1070}
1071example
1072{ "EXAMPLE:"; echo = 2;
1073ring r=0,(b,x,y,z,s,t,u,v,w),dp;
1074ideal i=su+bv, tu+bw,tv+sw,sx+by,tx+bz,ty+sz,vx+uy,wx+uz,wy+vz;
1075}
1076example
1077{ "EXAMPLE:"; echo = 2;
1078ring r=0,(t,a,b,c,d,e,f,g,h),dp;
1079ideal i=a+c+d-e-h,2df+2cg+2eh-2h2-h-1,3df2+3cg2-3eh2+3h3+3h2-e+4h, 6bdg-6eh2+6h3-3eh+6h2-e+4h, 4df3+4cg3+4eh3-4h4-6h3+4eh-10h2-h-1, 8bdfg+8eh3-8h4+4eh2-12h3+4eh-14h2-3h-1, 12bdg2+12eh3-12h4+12eh2-18h3+8eh-14h2-h-1, -24eh3+24h4-24eh2+36h3-8eh+26h2+7h+1;
1080}
1081example
1082{ "EXAMPLE:"; echo = 2;
1083ring r=0,(a,b,c,d,e,f,g,h,k,l),dp;
1084ideal i=f2h-1,ek2-1,g2l-1, 2ef2g2hk2+f2g2h2k2+2ef2g2k2l+2f2g2hk2l+f2g2k2l2+ck2, 2e2fg2hk2+2efg2h2k2+2e2fg2k2l+4efg2hk2l+2fg2h2k2l+2efg2k2l2+2fg2hk2l2+2bfh, 2e2f2ghk2+2ef2gh2k2+2e2f2gk2l+4ef2ghk2l+2f2gh2k2l+2ef2gk2l2+2f2ghk2l2+2dgl, e2f2g2k2+2ef2g2hk2+2ef2g2k2l+2f2g2hk2l+f2g2k2l2+bf2, 2e2f2g2hk+2ef2g2h2k+2e2f2g2kl+4ef2g2hkl+2f2g2h2kl+2ef2g2kl2+2f2g2hkl2+2cek, e2f2g2k2+2ef2g2hk2+f2g2h2k2+2ef2g2k2l+2f2g2hk2l+dg2, -e2f2g2hk2-ef2g2h2k2-e2f2g2k2l-2ef2g2hk2l-f2g2h2k2l-ef2g2k2l2-f2g2hk2l2+a2;
1085}
1086example
1087{ "EXAMPLE:"; echo = 2;
1088ring r=0,(b,c,d,e,f,g,h,j,k,l),dp;
1089ideal i=-k9+9k8l-36k7l2+84k6l3-126k5l4+126k4l5-84k3l6+36k2l7-9kl8+l9, -bk8+8bk7l+k8l-28bk6l2-8k7l2+56bk5l3+28k6l3-70bk4l4-56k5l4+56bk3l5+70k4l5-28bk2l6-56k3l6+8bkl7+28k2l7-bl8-8kl8+l9, ck7-7ck6l-k7l+21ck5l2+7k6l2-35ck4l3-21k5l3+35ck3l4+35k4l4-21ck2l5-35k3l5+7ckl6+21k2l6-cl7-7kl7+l8, -dk6+6dk5l+k6l-15dk4l2-6k5l2+20dk3l3+15k4l3-15dk2l4-20k3l4+6dkl5+15k2l5-dl6-6kl6+l7, ek5-5ek4l-k5l+10ek3l2+5k4l2-10ek2l3-10k3l3+5ekl4+10k2l4-el5-5kl5+l6, -fk4+4fk3l+k4l-6fk2l2-4k3l2+4fkl3+6k2l3-fl4-4kl4+l5, gk3-3gk2l-k3l+3gkl2+3k2l2-gl3-3kl3+l4, -hk2+2hkl+k2l-hl2-2kl2+l3, jk-jl-kl+l2;
1090}
1091example
1092{ "EXAMPLE:"; echo = 2;
1093ring r=0,x(0..10),dp;
1094ideal i=x(1)*x(0),x(1)*x(2),x(2)*x(3),x(3)*x(4),x(4)*x(5),x(5)*x(6),x(6)*x(7),x(7)*x(8),x(8)*x(9),x(9)*x(10),x(10)*x(0);
1095}
1096example
1097{ "EXAMPLE:"; echo = 2;
1098ring r=0,(a,b,c,d,e,f,g,h,j,k,l,m,n,o,p,q,s),dp;
1099ideal i=ag,gj+am+np+q,bl,nq,bg+bk+al+lo+lp+b+c,ag+ak+jl+bm+bn+go+ko+gp+kp+lq+a+d+f+h+o+p,gj+jk+am+an+mo+no+mp+np+gq+kq+e+j+q+s-1,jm+jn+mq+nq,jn+mq+2nq,gj+am+2an+no+np+2gq+kq+q+s,2ag+ak+bn+go+gp+lq+a+d,bg+al, an+gq, 2jm+jn+mq, gj+jk+am+mo+2mp+np+e+2j+q, jl+bm+gp+kp+a+f+o+2p,lp+b,jn+mq,gp+a;
1100}
1101example
1102{ "EXAMPLE:"; echo = 2;
1103ring r=0,(a,b,c,d,e,f,g,h,v,w,k,l,m,n,o,p,q,s,t,u),dp;
1104ideal i=af+bg+ch+dv+ew-1/2, a2f+b2g+c2h+d2v+e2w-1/3,tdw+agk+ahl+bhm+avn+bvo+cvp+awq+bwu+cws-1/6, a3f+b3g+c3h+d3v+e3w-1/4, tdew+abgk+achl+bchm+advn+bdvo+cdvp+aewq+bewu+cews-1/8, td2w+a2gk+a2hl+b2hm+a2vn+b2vo+c2vp+a2wq+b2wu+c2ws-1/12, ahkm+tawn+tbwo+avko+tcwp+avlp+bvmp+awku+awls+bwms-1/24, a4f+b4g+c4h+d4v+e4w-1/5, tde2w+ab2gk+ac2hl+bc2hm+ad2vn+bd2vo+cd2vp+ae2wq+be2wu+ce2ws-1/10, td2ew+a2bgk+a2chl+b2chm+a2dvn+b2dvo+c2dvp+a2ewq+b2ewu+c2ews-1/15,achkm+taewn+tbewo+advko+tcewp+advlp+bdvmp+aewku+aewls+bewms-1/30,t2d2w+a2gk2+a2hl2+2abhlm+b2hm2+a2vn2+2abvno+b2vo2+2acvnp+2bcvop+c2vp2+2tadwq+a2wq2+2tbdwu+2abwqu+b2wu2+2tcdws+2acwqs+2bcwus+c2ws2-1/20,td3w+a3gk+a3hl+b3hm+a3vn+b3vo+c3vp+a3wq+b3wu+c3ws-1/20,abhkm+tadwn+tbdwo+abvko+tcdwp+acvlp+bcvmp+abwku+acwls+bcwms-1/40,a2hkm+ta2wn+tb2wo+a2vko+tc2wp+a2vlp+b2vmp+a2wku+a2wls+b2wms-1/60,tawko+tawlp+tbwmp+avkmp+awkms-1/20;
1105}
1106*/
Note: See TracBrowser for help on using the repository browser.