source: git/Singular/LIB/schreyer.lib @ 92992c

spielwiese
Last change on this file since 92992c was 14e93b, checked in by Oleksandr Motsak <motsak@…>, 12 years ago
moved the main driver function ComputeSyzygy to the dyn.module TODO: preprocessing
  • Property mode set to 100644
File size: 80.6 KB
Line 
1///////////////////////////////////////////////////////////////////////////
2version="version schreyer.lib 4.0.0.0 Jun_2013 "; // $Id$
3category="General purpose";
4info="
5LIBRARY: schreyer.lib     Helpers for computing a Schreyer resolution in @code{derham.lib}
6AUTHOR:  Oleksandr Motsak <U@D>, where U={motsak}, D={mathematik.uni-kl.de}
7KEYWORDS: Schreyer ordering; Schreyer resolution; syzygy
8OVERVIEW:
9@* The library contains helper procedures for computing a Schreyer resoltion (cf. [SFO]),
10   originally meant to be used by @code{derham.lib} (which requires resolutions over the homogenized Weyl algebra).
11   The library works both in the commutative and non-commutative setting (cf. [MO]).
12   Here, we call a free resolution a Schreyer resolution if each syzygy module is given by a Groebner basis
13   with respect to the corresponding Schreyer ordering.
14   A Schreyer resolution can be much bigger than a minimal resolution of the same module, but may be easier to construct.
15@* The input for the resolution computations is a set of vectors @code{M} in form of a module over some basering @code{R}.
16   The ring @code{R} may be non-commutative, in which case the ring ordering should be global.
17@* These procedures produce/work with partial Schreyer resolutions of @code{(R^rank(M))/M} in form of
18   a ring (endowed with a special ring ordering that will be extended in the course of a resolution computation)
19   containing a list of modules @code{RES} and a module @code{MRES}:
20@* The list of modules @code{RES} contains the images of maps (also called syzygy modules) substituting the
21   computed beginning of a Schreyer resolution, that is, each syzygy module is given by a Groebner basis
22   with respect to the corresponding Schreyer ordering.
23@* The list @code{RES} starts with a zero map given by @code{rank(M)} zero generators indicating that the image of
24   the first differential map is zero. The second map @code{RES[2]} is given by @code{M}, which indicates that
25   the resolution of @code{(R^rank(M))/M} is being computed.
26@* The module @code{MRES} is a direct sum of modules from @code{RES} and thus comprises all computed differentials.
27@* Syzygies are shifted so that @code{gen(i)} is mapped to @code{MRES[i]} under the differential map.
28@* The Schreyer ordering succesively extends the starting module ordering on @code{M} (defined in Singular by the basering @code{R})
29   and is extended to higher syzygies using the following definition:
30@*        a < b if and only if (d(a) < d(b)) OR ( (d(a) = d(b) AND (comp(a) < comp(b)) ),
31@* where @code{d(a)} is the image of a under the differential (given by @code{MRES}),
32   and @code{comp(a)} is the module component, for any module terms @code{a} and @code{b} from the same higher syzygy module.
33REFERENCES:
34[SFO] Schreyer, F.O.: Die Berechnung von Syzygien mit dem verallgemeinerten Weierstrassschen Divisionssatz,
35      Master's thesis, Univ. Hamburg, 1980.
36[MO]  Motsak, O.: Non-commutative Computer Algebra with applications: Graded commutative algebra and related
37      structures in Singular with applications, Ph.D. thesis, TU Kaiserslautern, 2010
38
39NOTE:  requires the dynamic or built-in module @code{syzextra}
40
41PROCEDURES:
42  Sres(M,len)     compute Schreyer resolution of module M of maximal length len
43  Ssyz(M)         compute Schreyer resolution of module M of length 1
44  Scontinue(len)  extend currently active resolution by (at most) len syszygies
45";
46
47static proc prepareSyz( module I, list # )
48{
49  int i;
50  int k = 0;
51  int r = nrows(I);
52  int c = ncols(I);
53
54
55  if( size(#) > 0 )
56  {
57    if( typeof(#[1]) == "int" || typeof(#[1]) == "bigint" )
58    {
59      k = #[1];
60    }
61  }
62
63  if( k < r )
64  {
65    "// *** Wrong k: ", k, " < nrows: ", r, " => setting k = r = ", r;
66    k = r;
67  }
68
69//   "k: ", k;  "c: ", c;   "I: ", I;
70
71  for( i = c; i > 0; i-- )
72  {
73    I[i] = I[i] + gen(k + i);
74  }
75
76//  DetailedPrint(I);
77
78  return(I);
79}
80
81static proc separateSyzGB( module J, int c )
82{
83  module II, G; vector v; int i;
84
85  J = simplify(J, 2);
86
87  for( i = ncols(J); i > 0; i-- )
88  {
89    v = J[i];
90    if( leadcomp(v) > c )
91    {
92      II[i] = v;
93    } else
94    {
95      G[i] = v; // leave only gen(i): i <= c
96    }
97  }
98
99  II = simplify(II, 2);
100  G = simplify(G, 2);
101
102  return (list(G, II));
103}
104
105static proc splitSyzGB( module J, int c )
106{
107  module JJ; vector v, vv; int i;
108
109  for( i = ncols(J); i > 0; i-- )
110  {
111    v = J[i];
112
113    vv = 0;
114   
115    while( leadcomp(v) <= c )
116    {
117      vv = vv + lead(v);
118      v  = v  - lead(v);
119    }
120
121    J[i] = vv;
122    JJ[i] = v;
123  }
124
125  J = simplify(J, 2);
126  JJ = simplify(JJ, 2);
127
128  return (list(J, JJ));
129}
130
131
132static proc Sinit(module M)
133{
134  def @save = basering;
135 
136  int @DEBUG = !system("with", "ndebug");
137  if( @DEBUG )
138  {
139    "Sinit::Input";
140    type(M);
141//    DetailedPrint(M);
142    attrib(M);
143  }
144
145  int @RANK = nrows(M); int @SIZE = ncols(M);
146
147  int @IS_A_SB = attrib(M, "isSB"); // ??? only if all weights were zero?!
148
149  if( !@IS_A_SB )
150  {
151    M = std(M); // this should be faster than computing std in S (later on)
152  }
153
154  def S = MakeInducedSchreyerOrdering(1); // 1 puts history terms to the back
155  // TODO: NOTE: +1 causes trouble to Singular interpreter!!!???
156  setring S; // a new ring with a Schreyer ordering
157
158  if( @DEBUG )
159  {
160    "Sinit::StartingISRing";
161    basering;
162//    DetailedPrint(basering);
163  }
164
165  // Setup the leading syzygy^{-1} module to zero:
166  module Z = 0; Z[@RANK] = 0; attrib(Z, "isHomog", intvec(0)); 
167
168  module MRES = Z;
169 
170  list RES; RES[1] = Z;
171
172  module F = freemodule(@RANK);
173  intvec @V = deg(F[1..@RANK]);
174 
175  module M = imap(@save, M);
176 
177  attrib(M, "isHomog", @V);
178  attrib(M, "isSB", 1);
179
180 
181  if( @DEBUG )
182  {
183    "Sinit::SB_Input: ";
184    type(M);
185    attrib(M);
186    attrib(M, "isHomog");
187//    DetailedPrint(M);
188  }
189
190  if( @DEBUG )
191  {
192    // 0^th syz. property
193    if( size(module(transpose( transpose(M) * transpose(MRES) ))) > 0 )
194    {
195      transpose( transpose(M) * transpose(MRES) );
196      "transpose( transpose(M) * transpose(MRES) ) != 0!!!";
197      $
198    }
199  }
200
201  RES[size(RES)+1] = M; // list of all syzygy modules
202  MRES = MRES, M;
203
204  attrib(MRES, "isHomog", @V); 
205
206  attrib(S, "InducionLeads", lead(M));
207  attrib(S, "InducionStart", @RANK); 
208 
209  if( @DEBUG )
210  {
211    "Sinit::MRES";
212    DetailedPrint(MRES);
213    attrib(MRES, "isHomog");
214    attrib(S);
215  }
216
217  export RES;
218  export MRES;
219  return (S);
220}
221
222static proc Sstep()
223{
224  int @DEBUG = !system("with", "ndebug");
225
226  if( @DEBUG )
227  {
228    "Sstep::NextInducedRing";
229    DetailedPrint(basering);
230
231    attrib(basering, "InducionLeads");
232    attrib(basering, "InducionStart");
233
234    GetInducedData();
235  }
236
237  // syzygy step:
238
239/*
240  // is initial weights are all zeroes!
241  def L =  lead(M);
242  intvec @V = deg(M[1..ncols(M)]);  @W;  @V;  @W = @V;  attrib(L, "isHomog", @W); 
243  SetInducedReferrence(L, @RANK, 0);
244*/
245
246//  def L =  lead(MRES);
247//  @W = @W, @V;
248//  attrib(L, "isHomog", @W); 
249
250
251  // General setting:
252//  SetInducedReferrence(MRES, 0, 0); // limit: 0!
253  int @l = size(RES);
254
255  module M = RES[@l];
256
257  module L = attrib(basering, "InducionLeads");
258  int limit = attrib(basering, "InducionStart");
259
260//  L;  limit;
261 
262  int @RANK = ncols(MRES) - ncols(M); // nrows(M); // what if M is zero?!
263
264/*
265  if( @RANK !=  nrows(M) )
266  {
267    type(MRES);
268    @RANK;
269    type(M);
270    pause();
271  }
272*/
273 
274  intvec @W = attrib(M, "isHomog");
275  intvec @V = deg(M[1..ncols(M)]);
276  @V = @W, @V;
277   
278  if( @DEBUG )
279  {
280    "Sstep::NextInput: ";
281    M;
282    deg(M[1..ncols(M)]); // no use of @W :(?
283    @RANK;   
284    DetailedPrint(MRES);
285    attrib(MRES, "isHomog"); @W;
286    deg(MRES[1..ncols(MRES)]);
287  }
288
289 
290     
291  SetInducedReferrence(L, limit, 0);
292 
293  def K = prepareSyz(M, @RANK);
294//  K;
295 
296//   attrib(K, "isHomog", @V);   DetailedPrint(K, 1000);
297
298//  pause();
299 
300  K = idPrepare(K, @RANK); // std(K); // ?
301  K = simplify(K, 2);
302
303//  K;
304
305  module N = separateSyzGB(K, @RANK)[2]; // 1^st syz. module: vectors which start in lower part (comp >= @RANK)
306
307// "N_0: "; N; DetailedPrint(N, 10);
308
309//  basering; print(@V); type(N);
310//  attrib(N, "isHomog", @V);  // TODO: fix "wrong weights"!!!? deg is wrong :(((
311  N = std(N);
312  attrib(N, "isHomog", @V);
313
314//  N;
315 
316  if( @DEBUG )
317  {
318    if( size(N) > 0 )
319    {
320      // next syz. property
321      if( size(module(transpose( transpose(N) * transpose(MRES) ))) > 0 )
322      {
323        MRES;
324
325        "N: "; N; DetailedPrint(N, 10);
326
327        "K:"; K; DetailedPrint(K, 10);
328
329        "RANKS: ", @RANK;
330
331        "transpose( transpose(N) * transpose(MRES) ) != 0!!!";
332        transpose( transpose(N) * transpose(MRES) );
333
334        "transpose(N) * transpose(MRES): ";
335        transpose(N) * transpose(MRES);
336        DetailedPrint(module(_), 2);
337        $
338      }
339    }
340  }
341 
342  RES[@l + 1] = N; // list of all syzygy modules
343 
344  MRES = MRES, N;
345  attrib(MRES, "isHomog", @V);
346
347
348  L = L, lead(N);
349  attrib(basering, "InducionLeads", L);
350
351  if( @DEBUG )
352  {
353    "Sstep::NextSyzOutput: ";
354    DetailedPrint(N);
355    attrib(N, "isHomog");
356  }
357
358}
359
360proc Scontinue(int l)
361"USAGE:  Scontinue(int len)
362RETURN:  nothing, instead it changes the currently active resolution
363PURPOSE: extends the currently active resolution by at most len syzygies
364ASSUME:  must be used within a ring returned by Sres or Ssyz
365EXAMPLE: example Scontinue; shows an example
366"
367{
368  def data = GetInducedData();
369           
370  if( (!defined(RES)) || (!defined(MRES)) || (typeof(data) != "list") || (size(data) != 2) )
371  {
372    ERROR("Sorry, but basering does not seem to be returned by Sres or Ssyz");
373  }
374  for (;  (l != 0) && (size(RES[size(RES)]) > 0); l-- )
375  {
376    Sstep();
377  }
378}
379example
380{ "EXAMPLE:"; echo = 2;
381  ring r;
382  module M = maxideal(1); M;
383  def S = Ssyz(M); setring S; S;
384  "Only the first syzygy: ";
385  RES; MRES;
386  "More syzygies: ";
387  Scontinue(10);
388  RES; MRES;
389}
390
391proc Ssyz(module M)
392"USAGE:  Ssyz(module M)
393RETURN:  ring, containing a Schreyer resolution
394PURPOSE: computes a Schreyer resolution of M of length 1 (see the library overview)
395SEE ALSO: Sres
396EXAMPLE: example Ssyz; shows an example
397"
398{
399  def S = Sinit(M); setring S;
400 
401  Sstep(); // NOTE: what if M is zero?
402
403  return (S);
404}
405example
406{ "EXAMPLE:"; echo = 2;
407  ring r;
408  module M = maxideal(1); M;
409  def S = Ssyz(M); setring S; S;
410  "Only the first syzygy: ";
411  RES;
412  MRES; // Note gen(i)
413  kill S;
414  setring r; kill M;
415
416  module M = 0;
417  def S = Ssyz(M); setring S; S;
418  "Only the first syzygy: ";
419  RES;
420  MRES;
421}
422
423proc Sres(module M, int l)
424"USAGE:  Sres(module M, int len)
425RETURN:  ring, containing a Schreyer resolution
426PURPOSE: computes a Schreyer resolution of M of length at most len (see the library overview)
427NOTE:    If given len is zero then nvars(basering) + 1 is used instead.
428SEE ALSO: Ssyz
429EXAMPLE: example Sres; shows an example
430"
431{
432  def S = Sinit(M); setring S;
433
434  if (l == 0)
435  {
436    l = nvars(basering) + 1; // not really an estimate...?!
437  }
438 
439  Sstep(); l = l - 1;
440 
441  Scontinue(l);
442 
443  return (S);
444}
445example
446{ "EXAMPLE:"; echo = 2;
447  ring r;
448  module M = maxideal(1); M;
449  def S = Sres(M, 0); setring S; S;
450  RES;
451  MRES;
452  kill S;
453  setring r; kill M;
454
455  def A = nc_algebra(-1,0); setring A;
456  ideal Q = var(1)^2, var(2)^2, var(3)^2;
457  qring SCA = twostd(Q);
458  basering;
459
460  module M = maxideal(1);
461  def S = Sres(M, 2); setring S; S;
462  RES;
463  MRES;
464}
465
466
467
468// ================================================================== //
469
470
471LIB "general.lib"; // for sort
472
473/* static proc Tail(def M) // DONE: in C++ (dyn. module: syzextra)!
474{
475  int i = ncols(M); def m;
476  while (i > 0)
477  {
478    m = M[i];
479    m = m - lead(m); // m = tail(m)   
480    M[i] = m;   
481    i--;
482  }
483  return (M);
484}*/
485
486/* static */
487proc MySort(def M)
488"
489   Sorts the given ideal or module wrt >_{(c, ds)}  (.<.<.<.<)
490   NOTE: inplace??
491"
492{
493  if( typeof( attrib(basering, "DEBUG") ) == "int" )
494  {
495    int @DEBUG = attrib(basering, "DEBUG");
496  } else
497  {
498    int @DEBUG = 0; // !system("with", "ndebug");
499  }
500
501  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
502  {
503    int @KERCHECK = attrib(basering, "KERCHECK");
504  } else
505  {
506    int @KERCHECK = @DEBUG;
507  }
508
509
510  if( @DEBUG )
511  {
512    "MySort:: Input: "; M;
513  }
514
515  def @N = M;
516 
517  if( size(M) > 0 )
518  {
519    Sort_c_ds(@N);
520
521    if( @KERCHECK )
522    {
523      def iv = sort(lead(M), "c,ds", 1)[2]; // ,1 => reversed! // TODO: not needed?
524      def @M = M;
525      @M = M[iv];
526
527      // 0^th syz. property
528      if( (size(@N) + size(@M)) > 0 )
529      {
530        if( size(module( matrix(module(matrix(@N))) - matrix(module(matrix(@M))) )) > 0 )
531        {
532          "ERROR: MySort: wrong sorting in 'MySort': @N != @M!!!";
533         
534          "@M:"; @M;
535          "@N:"; @N;
536
537          "module( matrix(module(matrix(@N))) - matrix(module(matrix(@M))) ): ";
538          module( matrix(module(matrix(@N))) - matrix(module(matrix(@M))) );
539
540          "ERROR: MySort: wrong sorting in 'MySort': @N != @M!!!";
541          $
542        }
543      }
544    }
545  }
546
547  if( @DEBUG )
548  {
549    "MySort:: Ouput: "; @N;
550  }
551 
552  return (@N);
553}
554
555
556static proc SSinit(def M)
557{
558  if( (typeof(M) != "module") && (typeof(M) != "ideal") )
559  {
560    ERROR("Sorry: need an ideal or a module for input");
561  }
562
563  // TODO! DONE?
564  def @save = basering;
565 
566  int @DEBUG = !system("with", "ndebug");
567
568  if( typeof( attrib(SSinit, "DEBUG") ) == "int" )
569  {
570    @DEBUG = attrib(SSinit, "DEBUG");
571  }
572
573  int @SYZCHECK = @DEBUG;
574
575  if( typeof( attrib(SSinit, "SYZCHECK") ) == "int" )
576  {
577    @SYZCHECK = attrib(SSinit, "SYZCHECK");
578  }
579
580  int @KERCHECK = @DEBUG;
581
582  if( typeof( attrib(SSinit, "KERCHECK") ) == "int" )
583  {
584    @KERCHECK = attrib(SSinit, "KERCHECK");
585  }
586
587  if( @DEBUG )
588  {
589    "SSinit::Input";
590    type(M);
591//    DetailedPrint(M);
592    attrib(M);
593  }
594
595  int @RANK = nrows(M); int @SIZE = ncols(M);
596
597  int @IS_A_SB = attrib(M, "isSB"); // ??? only if all weights were zero?!
598
599  if( !@IS_A_SB )
600  {
601    def opts = option(get);
602    option(redSB); option(redTail);
603    M = std(M);
604    option(set, opts);
605    kill opts;
606  } else
607  {
608    M = simplify(M, 2 + 4 + 32);
609  }
610
611  def @N = MySort(M); // TODO: replace with inplace sorting!!!
612  def LEAD = lead(@N);
613
614  if( @KERCHECK )
615  {
616    def @LEAD = lead(M);
617
618    // sort wrt neg.deg.rev.lex!
619    intvec iv_ds = sort(@LEAD, "c,ds", 1)[2]; // ,1 => reversed!
620
621    M = M[iv_ds]; // sort M wrt ds on current leading terms
622    @LEAD = @LEAD[iv_ds];
623
624    if( size(module( matrix(@N) - matrix(M) )) > 0 )
625    {
626      "M:"; M;
627      "@N:"; @N;
628
629      "module( matrix(@N) - matrix(M) ): ";
630      module( matrix(@N) - matrix(M) );
631
632      "ERROR: wrong sorting (in SSnit): @N != M!!!";
633      $
634    }
635
636    if( size(module( matrix(@LEAD) - matrix(LEAD) )) > 0 )
637    {
638      "LEAD:"; LEAD;
639      "@LEAD:"; @LEAD;
640
641      "module( matrix(@LEAD) - matrix(LEAD) ): ";
642      module( matrix(@LEAD) - matrix(LEAD) );
643
644      "ERROR: wrong sorting (in SSnit): @LEAD != LEAD!!!";
645      $
646    }
647   
648  }
649
650  M = @N;
651 
652  def TAIL = Tail(M);
653 
654  intvec @DEGS = deg(M[1..@SIZE]); // store actuall degrees of input elements
655 
656  // TODO: what about real modules? weighted ones?
657 
658  list @l = ringlist(@save);
659
660  int @z = 0; ideal @m = maxideal(1); intvec @wdeg = deg(@m[1..ncols(@m)]);
661
662  // NOTE: @wdeg will be ignored anyway :(
663  @l[3] = list(list("C", @z), list("lp", @wdeg));
664
665  kill @z, @wdeg; // since these vars are ring independent!
666
667  def S = ring(@l); // --MakeInducedSchreyerOrdering(1);
668
669  module F = freemodule(@RANK);
670  intvec @V = deg(F[1..@RANK]);
671 
672  setring S; // ring with an easy divisibility test ("C, lex")
673
674  if( @DEBUG )
675  {
676    "SSinit::NewRing(C, lex)";
677    basering;
678    DetailedPrint(basering);
679  }
680
681  // Setup the leading syzygy^{-1} module to zero:
682  module Z = 0; Z[@RANK] = 0; attrib(Z, "isHomog", intvec(0)); 
683
684  module MRES = Z;
685 
686  list RES;  RES[1] = Z;
687  list LRES; LRES[1] = Z;
688  list TRES; TRES[1] = Z;
689 
690  def M = imap(@save, M);
691
692  attrib(M, "isHomog", @V);
693  attrib(M, "isSB", 1);
694  attrib(M, "degrees", @DEGS); 
695 
696  def LEAD = imap(@save, LEAD);
697 
698  attrib(LEAD, "isHomog", @V);
699  attrib(LEAD, "isSB", 1); 
700 
701  def TAIL = imap(@save, TAIL);
702
703  if( @DEBUG )
704  {
705    "SSinit::(sorted) SB_Input: ";
706    type(M);
707    attrib(M);
708    attrib(M, "isHomog");
709//    DetailedPrint(M);
710  }
711
712  if( @SYZCHECK )
713  {
714    // 0^th syz. property
715    if( size(module(transpose( transpose(M) * transpose(MRES) ))) > 0 )
716    {
717      transpose( transpose(M) * transpose(MRES) );
718      "ERROR: transpose( transpose(M) * transpose(MRES) ) != 0!!!";
719      $
720    }
721  }
722
723  RES [size(RES)+1] = M; // list of all syzygy modules
724  LRES[size(LRES)+1] = LEAD; // list of all syzygy modules
725  TRES[size(TRES)+1] = TAIL; // list of all syzygy modules
726 
727  MRES = MRES, M; //?
728
729  attrib(MRES, "isHomog", @V);
730 
731//  attrib(S, "InducionStart", @RANK);
732
733
734  if( typeof( attrib(SSinit, "LEAD2SYZ") ) == "int" )
735  {
736    attrib(S, "LEAD2SYZ", attrib(SSinit, "LEAD2SYZ") );
737  } else
738  {
739    attrib(S, "LEAD2SYZ", 1);
740  }
741
742  if( typeof( attrib(SSinit, "TAILREDSYZ") ) == "int" )
743  {
744    attrib(S, "TAILREDSYZ", attrib(SSinit, "TAILREDSYZ") );
745  } else
746  {
747    attrib(S, "TAILREDSYZ", 1);
748  }
749
750
751  if( typeof( attrib(SSinit, "HYBRIDNF") ) == "int" )
752  {
753    attrib(S, "HYBRIDNF", attrib(SSinit, "HYBRIDNF") );
754  } else
755  {
756    attrib(S, "HYBRIDNF", 0);
757  }
758 
759  attrib(S, "DEBUG", @DEBUG);
760  attrib(S, "SYZCHECK", @SYZCHECK);
761  attrib(S, "KERCHECK", @KERCHECK);
762 
763  if( @DEBUG )
764  {
765    "SSinit::MRES";
766    MRES;
767//    DetailedPrint(MRES);
768    attrib(MRES, "isHomog");
769    attrib(S);
770  }
771
772  export RES;
773  export MRES;
774  export LRES;
775  export TRES;
776  return (S);
777}
778example
779{ "EXAMPLE:"; echo = 2;
780  ring R = 0, (w, x, y, z), dp;
781
782  def M = maxideal(1);
783  def S = SSinit(M); setring S; S;
784 
785  "Only the first initialization: ";
786  RES; LRES; TRES;
787  MRES;
788
789  kill S; setring R; kill M;
790 
791  ideal M = w^2 - x*z,  w*x - y*z,  x^2 - w*y, x*y - z^2, y^2 - w*z;
792  def S = SSinit(M); setring S; S;
793
794  "Only the first initialization: ";
795  RES; LRES; TRES;
796  MRES;
797
798  kill S; setring R; kill M;
799}
800
801
802LIB "poly.lib"; // for lcm
803
804
805
806/// Compute L(Syz(L))
807proc SSComputeLeadingSyzygyTerms(def L)
808{
809  if( typeof( attrib(basering, "DEBUG") ) == "int" )
810  {
811    int @DEBUG = attrib(basering, "DEBUG");
812  } else
813  {
814    int @DEBUG = !system("with", "ndebug");
815  }
816
817  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
818  {
819    int @SYZCHECK = attrib(basering, "SYZCHECK");
820  } else
821  {
822    int @SYZCHECK = @DEBUG;
823  }
824
825  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
826  {
827    int @KERCHECK = attrib(basering, "KERCHECK");
828  } else
829  {
830    int @KERCHECK = @DEBUG;
831  }
832
833  if( @DEBUG )
834  {
835    "SSComputeLeadingSyzygyTerms::Input: ";
836    L;
837  }
838
839  module SS = ComputeLeadingSyzygyTerms(L);
840
841  if( @KERCHECK )
842  { 
843    int i, j, r;
844    int N = ncols(L);
845    def a, b;
846    poly aa, bb;
847
848    bigint c;
849
850    ideal M;
851
852    module S = 0;
853
854    for(i = 1; i <= N; i++)
855    {
856      a = L[i];
857      c = leadcomp(a);
858      r = int(c);
859
860      aa = leadmonomial(a);
861
862      M = 0;
863
864      for(j = i-1; j > 0; j--)
865      {
866        b = L[j];
867
868        if( leadcomp(b) == c )
869        {
870          bb = leadmonomial(b);
871
872          M[j] = (lcm(aa, bb) / aa);
873        }
874      }
875
876      // TODO: add quotient relations here...
877
878      M = simplify(M, 1 + 2 + 32);
879
880      M = MySort(M);
881
882      S = S, M * gen(i);
883    }
884
885    S = MySort(simplify(S, 2));
886
887    if( (size(S) + size(SS)) > 0 )
888    {
889    if( size(module(matrix(S) - matrix(SS))) > 0 )
890    {
891        "ERROR: SSComputeLeadingSyzygyTerms: S != SS ";
892
893        "basering: "; basering;
894//        DetailedPrint(basering);
895
896        "S: ";  S;
897//        DetailedPrint(_, 1);
898        "SS: "; SS;
899//        DetailedPrint(_, 1);
900
901        "DIFF: ";
902        module(matrix(S) - matrix(SS));
903//        DetailedPrint(_, 2);     
904        print(matrix(S) - matrix(SS));
905        $
906    }
907    }
908  }
909
910 
911  if( @DEBUG )
912  {
913    "SSComputeLeadingSyzygyTerms::Output: ";
914    "SS: "; SS;
915  }
916 
917  if( size(SS) > 0 )
918  {
919    attrib(SS, "isSB", 1);
920  }
921 
922  return (SS);
923}
924
925/// Compute Syz(L), where L is a monomial (leading) module
926proc SSCompute2LeadingSyzygyTerms(def L)
927{
928  if( typeof( attrib(basering, "DEBUG") ) == "int" )
929  {
930    int @DEBUG = attrib(basering, "DEBUG");
931  } else
932  {
933    int @DEBUG = !system("with", "ndebug");
934  }
935
936  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
937  {
938    int @SYZCHECK = attrib(basering, "SYZCHECK");
939  } else
940  {
941    int @SYZCHECK = @DEBUG;
942  }
943
944  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
945  {
946    int @KERCHECK = attrib(basering, "KERCHECK");
947  } else
948  {
949    int @KERCHECK = @DEBUG;
950  }
951
952  if( @DEBUG )
953  {
954    "SSCompute2LeadingSyzygyTerms::Input: ";
955    L;
956  }
957
958  module SS = Compute2LeadingSyzygyTerms(L);
959
960  if( @DEBUG )
961  {
962    "SSCompute2LeadingSyzygyTerms::Syz(SS): "; SS;
963  }
964 
965  if( @SYZCHECK )
966  {
967    if( size(SS) > 0 and size(L) > 0 )
968    {
969      if( size(module(transpose( transpose(SS) * transpose(L) ))) > 0 )
970      {
971        transpose( transpose(SS) * transpose(L) );
972        "ERROR: transpose( transpose(SS) * transpose(L) ) != 0!!!";
973        $
974      }
975    }
976  }
977   
978  if( @KERCHECK )
979  {
980    int @TAILREDSYZ = 1;
981    if( typeof( attrib(basering, "TAILREDSYZ") ) == "int" )
982    {
983      @TAILREDSYZ = attrib(basering, "TAILREDSYZ");
984    }
985
986    int i, j, r;
987    int N = ncols(L);
988    def a, b;
989
990    poly aa, bb, @lcm;
991
992    bigint c;
993
994    module M;
995
996    module S = 0;
997
998    for(i = 1; i <= N; i++)
999    {
1000      a = L[i];
1001  //    "a: ", a;
1002      c = leadcomp(a);
1003      r = int(c);
1004
1005      aa = leadmonomial(a);
1006
1007      M = 0;
1008
1009      for(j = i-1; j > 0; j--)
1010      {
1011        b = L[j];
1012  //      "b: ", b;
1013
1014        if( leadcomp(b) == c )
1015        {
1016          bb = leadmonomial(b);
1017          @lcm = lcm(aa, bb);
1018
1019          M[j] = (@lcm / aa)* gen(i) - (@lcm / bb)* gen(j);
1020        }
1021      }
1022
1023      M = simplify(M, 2);
1024
1025      // TODO: add quotient relations here...
1026      S = S, M;
1027    }
1028
1029    if( @TAILREDSYZ )
1030    {
1031      // Make sure that 2nd syzygy terms are not reducible by 1st
1032      def opts = option(get);
1033      option(redSB); option(redTail);
1034      S = std(S); // binomial module
1035      option(set, opts);
1036      //  kill opts;
1037    } else
1038    {
1039      S = simplify(S, 2 + 32);
1040    }
1041
1042    S = MySort(S);
1043
1044    if( @DEBUG )
1045    {
1046      "SSCompute2LeadingSyzygyTerms::Syz(S): "; S;
1047    }
1048
1049    if( @SYZCHECK )
1050    {
1051      if( size(S) > 0 and size(L) > 0 )
1052      {
1053        if( size(module(transpose( transpose(S) * transpose(L) ))) > 0 )
1054        {
1055          transpose( transpose(S) * transpose(L) );
1056          "ERROR: transpose( transpose(S) * transpose(L) ) != 0!!!";
1057          $
1058        }
1059      }
1060    }
1061
1062    if(size(S) != size(SS))
1063    {
1064      "ERROR: SSCompute2LeadingSyzygyTerms: size(S) != size(SS)";
1065
1066      "basering: "; basering; //      DetailedPrint(basering);
1067
1068      "S: ";  S;
1069//      DetailedPrint(S, 2);
1070      "SS: "; SS;
1071//      DetailedPrint(SS, 2);
1072      $
1073    }   
1074
1075    if(size(S) > 0 && size(SS) > 0)
1076    {
1077      if( size(module(matrix(lead(S)) - matrix(lead(SS)))) > 0 )
1078      {
1079        "ERROR: SSCompute2LeadingSyzygyTerms: lead(S) != lead(SS) ";
1080
1081        "basering: ";  basering;
1082//        DetailedPrint(basering);
1083
1084        "lead(S ): "; lead(S );
1085//        DetailedPrint(_, 2);
1086        "lead(SS): "; lead(SS);
1087//        DetailedPrint(_, 2);
1088
1089        "DIFF: ";
1090        print( matrix(lead(S)) - matrix(lead(SS))  );
1091        module(matrix(lead(S)) - matrix(lead(SS)));
1092//        DetailedPrint(_ , 4);
1093        $
1094      }
1095
1096
1097      if( @TAILREDSYZ )
1098      {
1099      if( size(module(matrix(Tail(S)) - matrix(Tail(SS)))) > 0 )
1100      {
1101        "ERROR: SSCompute2LeadingSyzygyTerms: Tail(S) != Tail(SS) ";
1102
1103        "basering: ";  basering;
1104//        DetailedPrint(basering);
1105
1106        "Tail(S ): "; Tail(S );
1107//        DetailedPrint(_, 2);
1108        "Tail(SS): "; Tail(SS);
1109//        DetailedPrint(_, 2);
1110
1111        "DIFF: ";
1112        module( matrix(Tail(S)) - matrix(Tail(SS)) );
1113//        DetailedPrint(_, 4);
1114        print( matrix(Tail(S)) - matrix(Tail(SS)) );
1115        $
1116      }
1117      }
1118    }
1119  }
1120 
1121  module S2 = Tail(SS);
1122  SS = lead(SS); // (C,lp) on base ring!
1123
1124  if( @SYZCHECK )
1125  {
1126    if( ncols(SS) != ncols(S2) ) // || size(SS) != ncols(SS) || size(S2) != ncols(S2)
1127    {
1128      "ERROR: SSCompute2LeadingSyzygyTerms: inappropriate S2 / SS: ";     
1129      type(SS);
1130      type(S2);
1131      L;
1132      $
1133    }
1134  } 
1135             
1136  if( @DEBUG )
1137  {
1138    "SSCompute2LeadingSyzygyTerms::Output: "; SS; S2;
1139  } 
1140 
1141  attrib(SS, "isSB", 1);
1142
1143  return (SS, S2);
1144}
1145
1146// -------------------------------------------------------- //
1147
1148/// TODO: save shortcut (syz: |-.->) LM(LM(m) * "t") -> syz?
1149proc SSFindReducer(def product, def syzterm, def L, list #)
1150{
1151  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1152  {
1153    int @DEBUG = attrib(basering, "DEBUG");
1154  } else
1155  {
1156    int @DEBUG = !system("with", "ndebug");
1157  }
1158
1159  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
1160  {
1161    int @SYZCHECK = attrib(basering, "SYZCHECK");
1162  } else
1163  {
1164    int @SYZCHECK = @DEBUG;
1165  }
1166
1167  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
1168  {
1169    int @KERCHECK = attrib(basering, "KERCHECK");
1170  } else
1171  {
1172    int @KERCHECK = @DEBUG;
1173  }
1174
1175
1176  if( @DEBUG )
1177  {
1178    "SSFindReducer::Input: ";
1179
1180    "syzterm: ", syzterm;
1181    "product: ", product;
1182    "L: ", L;
1183//    "T: ", T;
1184    if( size(#) > 0 )
1185    {
1186      "LSyz: ", #;
1187    }
1188  }
1189
1190
1191  if( @DEBUG && (syzterm != 0) )
1192  {
1193    def @@c = leadcomp(syzterm); int @@r = int(@@c);
1194    def @@product = leadmonomial(syzterm) * L[@@r];
1195
1196    if( @@product != product)
1197    {
1198      "product: ", product, ", @@product: ", @@product;
1199      "ERROR: 'syzterm' results in wrong product !!!???";
1200      $
1201    }
1202  }
1203
1204  if( typeof(#[1]) == "module" )
1205  {
1206    vector my = FindReducer(product, syzterm, L/*, T*/, #[1]);
1207  } else
1208  {
1209    vector my = FindReducer(product, syzterm, L/*, T*/);
1210  }
1211 
1212
1213  if( @KERCHECK )
1214  {
1215    bigint c = leadcomp(product); int r = int(c);
1216
1217    def a, b, bb;
1218
1219    vector nf = [0];
1220
1221    // looking for an appropriate diviser
1222    for( int k = ncols(L); k > 0; k-- )
1223    {
1224      a = L[k];
1225      // with the same mod. component
1226      if( leadcomp(a) == c )
1227      {
1228        b = - (leadmonomial(product) / leadmonomial(L[k]));
1229
1230        // which divides the product: looking for the 1st appropriate one!
1231        if( b != 0 )
1232        {
1233          bb = b * gen(k);
1234
1235          if (size(bb + syzterm) == 0) // cannot allow something like: a*gen(i) - a*gen(i)
1236          {
1237            nf = [0];
1238          } else
1239          {
1240            nf = bb;
1241          }
1242
1243          // new syz. term should not be in <LS = #>
1244          if( size(#) > 0 )
1245          {
1246            if( typeof(#[1]) == "module" )
1247            {
1248              nf = NF(bb, #[1]);
1249            }
1250          }
1251
1252          // while the complement (the fraction) is not reducible by leading syzygies
1253          if( nf != 0 ) // nf must be == bb!!!
1254          {
1255            /// TODO: save shortcut LM(m) * T[i] -> ?
1256
1257            // choose ANY such reduction... (with the biggest index?)
1258            break;
1259          }
1260        }
1261      }
1262    }
1263
1264    if( my != nf )
1265    {
1266      "ERROR in FindReducer => ", my, " != nf: ", nf;
1267      $;
1268    }
1269  }
1270
1271  if( @DEBUG )
1272  {
1273    "SSFindReducer::Output: ", my;
1274  }
1275 
1276  return (my);
1277}
1278
1279/// TODO: save shortcut (syz: |-.->) LM(m) * "t" -> ?
1280proc SSReduceTerm(poly m, def t, def syzterm, def L, def T, list #)
1281{
1282  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1283  {
1284    int @DEBUG = attrib(basering, "DEBUG");
1285  } else
1286  {
1287    int @DEBUG = !system("with", "ndebug");
1288  }
1289
1290
1291  if( @DEBUG )
1292  {
1293    "SSReduce::Input: ";
1294
1295    "syzterm: ", syzterm;
1296    "mult: ", m;
1297    "term: ", t;
1298    "L: ", L;
1299    "T: ", T;
1300    if( size(#) > 0 )
1301    {
1302      "LSyz: ", #;
1303    }
1304//    "attrib(LS, 'isSB')", attrib(LS, "isSB");
1305  }
1306
1307  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
1308  {
1309    int @KERCHECK = attrib(basering, "KERCHECK");
1310  } else
1311  {
1312    int @KERCHECK = @DEBUG;
1313  }
1314 
1315  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
1316  {
1317    int @SYZCHECK = attrib(basering, "SYZCHECK");
1318  } else
1319  {
1320    int @SYZCHECK = @DEBUG;
1321  }
1322
1323  if( @SYZCHECK && (syzterm != 0) )
1324  {
1325    def @@c = leadcomp(syzterm); int @@r = int(@@c);
1326    poly @@m = leadmonomial(syzterm); def @@t = L[@@r];
1327
1328    if( (@@m != m) || (@@t != t))
1329    {
1330      "m: ", m, ", t: ", t;
1331      "@@m: ", @@m, ", @@t: ", @@t;
1332      "ERROR: 'syzterm' results in wrong m * t !!!";
1333      $
1334    }
1335  }
1336
1337  if( typeof(#[1]) == "module" )
1338  {
1339    vector ss = ReduceTerm(m, t, syzterm, L, T, #[1]);
1340  } else
1341  {
1342    vector ss = ReduceTerm(m, t, syzterm, L, T);
1343  }
1344
1345  if( @KERCHECK )
1346  {
1347    vector s = 0;
1348
1349    if( size(t) > 0 )
1350    {
1351      def product = m * t;
1352
1353      s = SSFindReducer(product, syzterm, L, #);
1354
1355      if( size(s) != 0 )
1356      {
1357        poly @b = leadmonomial(s);
1358
1359        def @c = leadcomp(s); int k = int(@c);
1360
1361        s = s + SSTraverseTail(@b, T[k], L, T, #); // !!!   
1362      }
1363    }
1364   
1365    if( s != ss )
1366    {
1367      "ERROR in ReduceTerm => old: ", s, " != ker: ", ss;
1368      "m: ", m;
1369      "t: ", t;
1370      "syzterm: ", syzterm;
1371      L; T; #;
1372      $;
1373    } 
1374  }
1375
1376  if( @DEBUG )
1377  {
1378    "SSReduceTerm::Output: ", ss;
1379  }
1380 
1381  return (ss);
1382}
1383
1384
1385// TODO: store m * @tail -.-^-.-^-.--> ?
1386proc SSTraverseTail(poly m, def @tail, def L, def T, list #)
1387{
1388  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1389  {
1390    int @DEBUG = attrib(basering, "DEBUG");
1391  } else
1392  {
1393    int @DEBUG = !system("with", "ndebug");
1394  }
1395
1396  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
1397  {
1398    int @KERCHECK = attrib(basering, "KERCHECK");
1399  } else
1400  {
1401    int @KERCHECK = @DEBUG;
1402  }
1403 
1404
1405  if( @DEBUG )
1406  {
1407    "SSTraverse::Input: ";
1408
1409    "mult: ", m;
1410    "tail: ", @tail; // T[i];
1411
1412    if( size(#) > 0 )
1413    {
1414      "LSyz: "; #[1];
1415    }
1416  }
1417
1418  if( typeof(#[1]) == "module" )
1419  {
1420    vector ss = TraverseTail(m, @tail, L, T, #[1]);
1421  } else
1422  {
1423    vector ss = TraverseTail(m, @tail, L, T);
1424  }
1425
1426  if( @KERCHECK )
1427  {
1428    vector s = 0;
1429
1430    def @l, @p;
1431    @p = @tail;
1432
1433  // iterate tail-terms in ANY order!
1434    while( size(@p) > 0 )
1435    {
1436      @l = lead(@p);
1437      s = s + SSReduceTerm(m, @l, [0], L, T, #); // :(
1438      @p = @p - @l;
1439    }
1440   
1441    if( s != ss )
1442    {
1443      "ERROR in TraverseTail => old: ", s, " != ker: ", ss;
1444      "m: ", m;
1445      "@tail: ", @tail;
1446      L; T; #;
1447      $;
1448    } 
1449  }
1450
1451  if( @DEBUG )
1452  {
1453    "SSTraverseTail::Output: ", ss;
1454  }
1455 
1456  return (ss);
1457}
1458
1459// -------------------------------------------------------- //
1460
1461proc SSSchreyerSyzygyNF(vector syz_lead, vector syz_2, def L, def T, list #)
1462"
1463   Hybrid Syzygy computation: 'reduce' spoly by eliminating _any_ terms
1464   while discurding terms of lower order!
1465
1466   Return the tail syzygy (without: syz_lead, starting with: syz_2)
1467"
1468{
1469  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1470  {
1471    int @DEBUG = attrib(basering, "DEBUG");
1472  } else
1473  {
1474    int @DEBUG = !system("with", "ndebug");
1475  }
1476
1477  if( @DEBUG )
1478  {
1479    "SSSchreyerSyzygyNF::Input: ";
1480
1481    "syzygy_lead: ", syz_lead;
1482    "syzygy 2nd : ", syz_2;
1483    L; T;
1484    if( size(#) > 0 )
1485    {
1486      "LSyz: "; #[1];
1487    }
1488  }
1489
1490  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
1491  {
1492    int @KERCHECK = attrib(basering, "KERCHECK");
1493  } else
1494  {
1495    int @KERCHECK = @DEBUG;
1496  }
1497
1498  if( typeof(#[1]) == "module" )
1499  {
1500    def my = SchreyerSyzygyNF(syz_lead, syz_2, L, T, #[1]);
1501  } else
1502  {
1503    def my = SchreyerSyzygyNF(syz_lead, syz_2, L, T);
1504  }
1505
1506  if( @KERCHECK )
1507  {
1508    def spoly = leadmonomial(syz_lead) * T[int(leadcomp(syz_lead))]
1509              + leadmonomial(syz_2)    * T[int(leadcomp(syz_2))];
1510
1511    vector @tail = syz_2;
1512
1513    while (size(spoly) > 0)
1514    {
1515      syz_2 = SSFindReducer(lead(spoly), 0, L, #); spoly = Tail(spoly);
1516
1517      if( size(syz_2) != 0)
1518      {         
1519        spoly = spoly + leadmonomial(syz_2) * T[int(leadcomp(syz_2))];
1520        @tail = @tail + syz_2;
1521      }
1522    }
1523   
1524    if( my != @tail )
1525    {
1526      "ERROR in SchreyerSyzygyNF => old: ", @tail, " != ker: ", my;
1527     
1528      "syzygy_lead: ", syz_lead;
1529      "syzygy 2nd : ", syz_2;
1530     
1531      L; T; #;
1532      $;
1533    }
1534  }
1535
1536  if( @DEBUG )
1537  {
1538    "SSSchreyerSyzygyNF::Output: ", my;
1539  }
1540 
1541  return (my);
1542}
1543
1544
1545
1546// -------------------------------------------------------- //
1547
1548// module (N, LL, TT) = SSComputeSyzygy(L, T);
1549// Compute Syz(L ++ T) = N = LL ++ TT
1550proc SSComputeSyzygy(def L, def T)
1551{
1552  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1553  {
1554    int @DEBUG = attrib(basering, "DEBUG");
1555  } else
1556  {
1557    int @DEBUG = !system("with", "ndebug");
1558  }
1559
1560  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
1561  {
1562    int @KERCHECK = attrib(basering, "KERCHECK");
1563  } else
1564  {
1565    int @KERCHECK = @DEBUG;
1566  }
1567 
1568  if( @DEBUG )
1569  {
1570    "SSComputeSyzygy::Input";
1571    "basering: ", basering; attrib(basering);
1572//    DetailedPrint(basering);
1573
1574//    "iCompShift: ", iCompShift;
1575
1576    "L: "; L;
1577    "T: "; T;
1578  }
1579
1580  list @res = ComputeSyzygy(L, T);
1581
1582  module @LL = @res[1]; module @TT = @res[2];
1583
1584  if( @KERCHECK )
1585  {
1586    if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
1587    {
1588      int @SYZCHECK = attrib(basering, "SYZCHECK");
1589    } else
1590    {
1591      int @SYZCHECK = @DEBUG;
1592    }
1593
1594    int @LEAD2SYZ = 1;
1595    if( typeof( attrib(basering, "LEAD2SYZ") ) == "int" )
1596    {
1597      @LEAD2SYZ = attrib(basering, "LEAD2SYZ");
1598    }
1599
1600    int @TAILREDSYZ = 1;
1601    if( typeof( attrib(basering, "TAILREDSYZ") ) == "int" )
1602    {
1603      @TAILREDSYZ = attrib(basering, "TAILREDSYZ");
1604    }
1605
1606    int @HYBRIDNF = 0;
1607    if( typeof( attrib(basering, "HYBRIDNF") ) == "int" )
1608    {
1609      @HYBRIDNF = attrib(basering, "HYBRIDNF");
1610    }
1611
1612    module LL;
1613
1614    /// Get the critical leading syzygy terms
1615    if( @LEAD2SYZ ) // & 2nd syz. term
1616    {
1617      module LL2;
1618      (LL, LL2) = SSCompute2LeadingSyzygyTerms(L);
1619    } else
1620    {
1621      LL = SSComputeLeadingSyzygyTerms(L);
1622    }
1623
1624    module TT, SYZ;
1625
1626    vector a, a2; bigint c; int r; poly aa;
1627
1628    if( size(LL) > 0 )
1629    {
1630      list LS;
1631
1632      if( @TAILREDSYZ)
1633      {
1634        LS = list(LL);
1635      }
1636
1637      vector @tail;
1638
1639      for(int k = ncols(LL); k > 0; k-- )
1640      {
1641        // leading syz. term:
1642        a = LL[k]; c = leadcomp(a); r = int(c); aa = leadmonomial(a);
1643
1644        // NF reduction:
1645        if( !@HYBRIDNF ) // Traverse approach:
1646        {       
1647          @tail = SSTraverseTail(aa, T[r], L, T, LS);
1648
1649          // get the 2nd syzygy term...
1650          if( @LEAD2SYZ ) // with the 2nd syz. term:
1651          {     
1652            a2 = LL2[k]; c = leadcomp(a2); r = int(c); aa = leadmonomial(a2);
1653
1654            @tail = a2 + @tail + SSTraverseTail(aa, T[r], L, T, LS);
1655          } else
1656          {
1657            @tail = @tail + SSReduceTerm(aa, L[r], a, L, T, LS);
1658          }
1659
1660        } else // Hybrid approach:
1661        {
1662
1663          // get the 2nd syzygy term...
1664          if( @LEAD2SYZ )
1665          {
1666            a2 = LL2[k];
1667          } else
1668          {
1669            a2 = SSFindReducer( aa * L[r], a, L, LS);
1670          }
1671
1672          if ( (@SYZCHECK || @DEBUG) )
1673          {
1674            if( size(a2) == 0 ) // if syzterm == 0!!!!
1675            {
1676              "ERROR in SSComputeSyzygy: could not find the 2nd syzygy term during the hybrid NF!!!";
1677              $
1678            }
1679          }
1680
1681          @tail = SSSchreyerSyzygyNF(a, a2, L, T, LS);
1682        }
1683
1684        TT[k] = @tail;
1685        SYZ[k] = a + @tail;
1686      }
1687    }
1688
1689    if( ncols(LL) != ncols(@LL) )
1690    {
1691      "ERROR in SSComputeSyzygy: wrong leading syzygies!?";
1692      "";
1693      L; T;
1694      "";
1695      type(LL);
1696      type(@LL);
1697      $
1698    }
1699
1700    if( ncols(TT) != ncols(@TT) )
1701    {
1702      "ERROR in SSComputeSyzygy: wrong tail syzygies!?";
1703      "";
1704      L; T;
1705      "";
1706      type(LL);
1707      type(@LL);
1708      "";
1709      type(TT);
1710      type(@TT);
1711      $
1712    }
1713   
1714    if( size( module( matrix(LL) - matrix(@LL) ) ) != 0 )
1715    {
1716      "ERROR in SSComputeSyzygy: wrong leading syzygies!?";
1717      "";
1718      L; T;
1719      "";
1720      type(LL);
1721      type(@LL);
1722      $
1723    }
1724
1725
1726    if( size( module( matrix(TT) - matrix(@TT) ) ) != 0 )
1727    {
1728      "ERROR in SSComputeSyzygy: wrong tail syzygies!?";
1729      TT; @TT;
1730      L; T;
1731      $
1732    }   
1733   
1734  }
1735
1736  module @SYZ;
1737 
1738  for(int @k = ncols(@LL); @k > 0; @k-- )
1739  {
1740    @SYZ[@k] = @LL[@k] + @TT[@k];
1741  }
1742 
1743  if( @DEBUG )
1744  {
1745    "SSComputeSyzygy::Output";
1746
1747//    "SYZ: "; @SYZ;
1748    "LL: "; @LL;
1749    "TT: "; @TT;
1750  }
1751
1752  return (@SYZ, @LL, @TT);
1753}
1754
1755// resolution/syzygy step:
1756static proc SSstep()
1757{
1758  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1759  {
1760    int @DEBUG = attrib(basering, "DEBUG");
1761  } else
1762  {
1763    int @DEBUG = !system("with", "ndebug");
1764  }
1765
1766
1767  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
1768  {
1769    int @SYZCHECK = attrib(basering, "SYZCHECK");
1770  } else
1771  {
1772    int @SYZCHECK = @DEBUG;
1773  }
1774
1775  if( @DEBUG )
1776  {
1777    "SSstep::NextInducedRing";
1778    "basering: ", basering; attrib(basering);
1779  }
1780
1781/*
1782  // is initial weights are all zeroes!
1783  def L =  lead(M);
1784  intvec @V = deg(M[1..ncols(M)]);  @W;  @V;  @W = @V;  attrib(L, "isHomog", @W); 
1785  SetInducedReferrence(L, @RANK, 0);
1786*/
1787
1788//  def L =  lead(MRES);
1789//  @W = @W, @V;
1790//  attrib(L, "isHomog", @W); 
1791
1792
1793  // General setting:
1794//  SetInducedReferrence(MRES, 0, 0); // limit: 0!
1795  int @l = size(RES);
1796
1797  def M =  RES[@l];
1798
1799  def L = LRES[@l];
1800  def T = TRES[@l];
1801
1802
1803  //// TODO: wrong !!!!!
1804  int @RANK = ncols(MRES) - ncols(M); // nrows(M); // what if M is zero?!
1805
1806 
1807
1808/*
1809  if( @RANK !=  nrows(M) )
1810  {
1811    type(MRES);
1812    @RANK;
1813    type(M);
1814    pause();
1815  }
1816*/
1817 
1818  intvec @W = attrib(M, "isHomog"); intvec @V = attrib(M, "degrees"); @V = @W, @V;
1819   
1820  if( @DEBUG )
1821  {
1822    "Sstep::NextInput: ";
1823    M;
1824    L;
1825    @V;
1826    @RANK;
1827//    DetailedPrint(MRES);
1828    attrib(MRES, "isHomog");
1829  }
1830
1831     
1832  // TODO: N  = SYZ( M )!!!
1833  module N, LL, TT;
1834  (N, LL, TT) = SSComputeSyzygy(/*M, */L, T/*, @RANK*/);
1835
1836  // shift syz.comp by @RANK:
1837  module Z;
1838  Z = 0; Z[@RANK] = 0; Z = Z, transpose(LL);   LL = transpose(Z);
1839  Z = 0; Z[@RANK] = 0; Z = Z, transpose(TT);   TT = transpose(Z);
1840  Z = 0; Z[@RANK] = 0; Z = Z, transpose(N);     N = transpose(Z);
1841
1842
1843  if( @SYZCHECK )
1844  {
1845    if( size(N) > 0 )
1846    {
1847      // next syz. property
1848      if( size(module(transpose( transpose(N) * transpose(MRES) ))) > 0 )
1849      {
1850        "MRES", MRES;
1851
1852        "N: "; N; // DetailedPrint(N, 2);
1853
1854        "LL:"; LL; // DetailedPrint(LL, 1);
1855        "TT:"; TT; // DetailedPrint(TT, 10);
1856
1857        "RANKS: ", @RANK;
1858
1859        "transpose( transpose(N) * transpose(MRES) ) != 0!!!";
1860        transpose( transpose(N) * transpose(MRES) );
1861
1862        "transpose(N) * transpose(MRES): ";
1863        transpose(N) * transpose(MRES);
1864        // DetailedPrint(module(_), 2);
1865        $
1866      }
1867    }
1868  }
1869
1870  attrib(N, "isHomog", @V);
1871
1872  // TODO: correct the following:
1873  intvec @DEGS = deg(N[1..ncols(N)]); // no mod. comp. weights :(
1874
1875 
1876  attrib(N, "degrees", @DEGS);
1877 
1878   RES[@l + 1] = N; // list of all syzygy modules
1879  LRES[@l + 1] = LL; // list of all syzygy modules
1880  TRES[@l + 1] = TT; // list of all syzygy modules
1881
1882  MRES = MRES, N;
1883 
1884  attrib(MRES, "isHomog", @V);
1885
1886//  L = L, lead(N);  attrib(basering, "InducionLeads", L);
1887
1888  if( @DEBUG )
1889  {
1890    "SSstep::NextSyzOutput: ";
1891    N;
1892//    DetailedPrint(N);
1893    attrib(N);
1894  }
1895
1896}
1897
1898proc SScontinue(int l)
1899"USAGE:  SScontinue(l)
1900RETURN:  nothing, instead it changes RES and MRES variables in the current ring
1901PURPOSE: computes further (at most l) syzygies
1902NOTE:    must be used within a ring returned by Sres or Ssyz. RES and MRES are
1903         explained in Sres
1904EXAMPLE: example Scontinue; shows an example
1905"
1906{
1907
1908  /// TODO!
1909//  def data = GetInducedData();
1910
1911  if( (!defined(RES)) || (!defined(MRES)) ) /* || (typeof(data) != "list") || (size(data) != 2) */
1912  {
1913    ERROR("Sorry, but basering does not seem to be returned by Sres or Ssyz");
1914  }
1915  for (;  (l != 0) && (size(RES[size(RES)]) > 0); l-- )
1916  {
1917    SSstep();
1918  }
1919}
1920example
1921{ "EXAMPLE:"; echo = 2;
1922  ring r;
1923  module M = maxideal(1); M;
1924  def S = SSsyz(M); setring S; S;
1925  "Only the first syzygy: ";
1926  RES; MRES;
1927  "More syzygies: ";
1928  SScontinue(10);
1929  RES; MRES;
1930}
1931
1932proc SSsyz(def M)
1933"USAGE:  SSsyz(M)
1934RETURN:  ring, containing a list of modules RES and a module MRES
1935PURPOSE: computes the first syzygy module of M (wrt some Schreyer ordering)?
1936NOTE:    The output is explained in Sres
1937EXAMPLE: example Ssyz; shows an example
1938"
1939{
1940  if( (typeof(M) != "module") && (typeof(M) != "ideal") )
1941  {
1942    ERROR("Sorry: need an ideal or a module for input");
1943  }
1944
1945  def SS = SSinit(M); setring SS;
1946 
1947  SSstep(); // NOTE: what if M is zero?
1948
1949  return (SS);
1950}
1951example
1952{ "EXAMPLE:"; echo = 2;
1953  ring r;
1954
1955/*  ideal M = 0;
1956  def S = SSsyz(M); setring S; S;
1957  "Only the first syzygy: ";
1958  RES; LRES; TRES;
1959  MRES;
1960 
1961  kill S; setring r; kill M;
1962*/ 
1963
1964  ideal M = maxideal(1); M;
1965
1966  def S = SSres(M, 0); setring S; S;
1967  MRES;
1968  print(_);
1969  RES;
1970
1971  kill S; setring r; kill M;
1972
1973  kill r;
1974 
1975  ring R = 0, (w, x, y, z), dp;
1976  ideal M = w^2 - x*z,  w*x - y*z,  x^2 - w*y, x*y - z^2, y^2 - w*z;
1977 
1978  def S = SSres(M, 0); setring S; S;
1979  "";
1980  LRES;
1981  "";
1982  TRES;
1983  "";
1984  MRES;
1985  print(_);
1986  RES;
1987}
1988
1989proc SSres(def M, int l)
1990"USAGE:  SSres(I, l)
1991RETURN:  ring, containing a list of modules RES and a module MRES
1992PURPOSE: computes (at most l) syzygy modules of M wrt the classical Schreyer
1993         induced ordering with gen(i) > gen(j) if i > j, provided both gens
1994         are from the same syzygy level.???
1995NOTE:    RES contains the images of maps subsituting the beginning of the
1996         Schreyer free resolution of baseRing^r/M, while MRES is a sum of
1997         these images in a big free sum, containing all the syzygy modules.
1998         The syzygy modules are shifted so that gen(i) correspons to MRES[i].
1999         The leading zero module RES[0] indicates the fact that coker of the
2000         first map is zero. The number of zeroes inducates the rank of input.
2001NOTE:    If l == 0 then l is set to be nvars(basering) + 1
2002EXAMPLE: example SSres; shows an example
2003"
2004{
2005  if( (typeof(M) != "module") && (typeof(M) != "ideal") )
2006  {
2007    ERROR("Sorry: need an ideal or a module for input");
2008  }
2009
2010  def SS = SSinit(M); setring SS;
2011
2012  if (l == 0)
2013  {
2014    l = nvars(basering) + 1; // not really an estimate...?!
2015  }
2016
2017  SSstep(); l = l - 1;
2018
2019  SScontinue(l);
2020
2021  return (SS);
2022}
2023example
2024{ "EXAMPLE:"; echo = 2;
2025  ring r;
2026  module M = maxideal(1); M;
2027  def S = SSres(M, 0); setring S; S;
2028  RES;
2029  MRES;
2030  kill S;
2031  setring r; kill M;
2032
2033  def A = nc_algebra(-1,0); setring A;
2034  ideal Q = var(1)^2, var(2)^2, var(3)^2;
2035  qring SCA = twostd(Q);
2036  basering;
2037
2038  module M = maxideal(1);
2039  def S = SSres(M, 2); setring S; S;
2040  RES;
2041  MRES;
2042}
2043
2044
2045
2046static proc loadme()
2047{
2048  int @DEBUG = !system("with", "ndebug");
2049
2050  if( @DEBUG )
2051  {
2052   
2053    "ndebug?: ", system("with", "ndebug");
2054    "om_ndebug?: ", system("with", "om_ndebug");
2055
2056    listvar(Top);
2057    listvar(Schreyer);
2058  }
2059//  listvar(Syzextra); listvar(Syzextra_g);
2060
2061  if( !defined(DetailedPrint) )
2062  {
2063    if( 1 )
2064    {
2065
2066      if( @DEBUG )
2067      {
2068        "Loading the Release version!";
2069      }
2070      load("syzextra.so");
2071
2072      if( @DEBUG )
2073      {
2074        listvar(Syzextra);
2075      }
2076
2077      exportto(Top, Syzextra::ClearContent);
2078      exportto(Top, Syzextra::ClearDenominators);
2079
2080      exportto(Schreyer, Syzextra::m2_end);
2081     
2082//      export Syzextra;
2083
2084//      exportto(Schreyer, Syzextra::noop);
2085      exportto(Schreyer, Syzextra::DetailedPrint);
2086      exportto(Schreyer, Syzextra::leadmonomial);
2087      exportto(Schreyer, Syzextra::leadcomp);
2088//      exportto(Schreyer, Syzextra::leadrawexp);
2089//      exportto(Schreyer, Syzextra::ISUpdateComponents);
2090      exportto(Schreyer, Syzextra::SetInducedReferrence);
2091      exportto(Schreyer, Syzextra::GetInducedData);
2092//      exportto(Schreyer, Syzextra::GetAMData);
2093//      exportto(Schreyer, Syzextra::SetSyzComp);
2094      exportto(Schreyer, Syzextra::MakeInducedSchreyerOrdering);
2095//      exportto(Schreyer, Syzextra::MakeSyzCompOrdering);
2096      exportto(Schreyer, Syzextra::idPrepare);
2097//      exportto(Schreyer, Syzextra::reduce_syz);
2098//      exportto(Schreyer, Syzextra::p_Content);
2099
2100      exportto(Schreyer, Syzextra::ProfilerStart); exportto(Schreyer, Syzextra::ProfilerStop);
2101
2102      exportto(Schreyer, Syzextra::Tail);
2103      exportto(Schreyer, Syzextra::ComputeLeadingSyzygyTerms);     
2104      exportto(Schreyer, Syzextra::Compute2LeadingSyzygyTerms);
2105      exportto(Schreyer, Syzextra::Sort_c_ds);
2106
2107      exportto(Schreyer, Syzextra::FindReducer);
2108
2109      exportto(Schreyer, Syzextra::ReduceTerm);
2110      exportto(Schreyer, Syzextra::TraverseTail);
2111
2112      exportto(Schreyer, Syzextra::SchreyerSyzygyNF);
2113      exportto(Schreyer, Syzextra::ComputeSyzygy);
2114    }
2115/*
2116    else
2117    {
2118      if( @DEBUG )
2119      {
2120        "Loading the Debug version!";
2121      }
2122
2123      load("syzextra.so");
2124
2125      if( @DEBUG )
2126      {     
2127        listvar(Syzextra_g);
2128      }
2129     
2130      exportto(Top, Syzextra_g::ClearContent);
2131      exportto(Top, Syzextra_g::ClearDenominators);
2132
2133      exportto(Schreyer, Syzextra_g::m2_end);
2134
2135//      export Syzextra_g;
2136//      exportto(Schreyer, Syzextra_g::noop);
2137      exportto(Schreyer, Syzextra_g::DetailedPrint);
2138      exportto(Schreyer, Syzextra_g::leadmonomial);
2139      exportto(Schreyer, Syzextra_g::leadcomp);
2140//      exportto(Schreyer, Syzextra_g::leadrawexp);
2141//      exportto(Schreyer, Syzextra_g::ISUpdateComponents);
2142      exportto(Schreyer, Syzextra_g::SetInducedReferrence);
2143      exportto(Schreyer, Syzextra_g::GetInducedData);
2144//      exportto(Schreyer, Syzextra_g::GetAMData);
2145//      exportto(Schreyer, Syzextra_g::SetSyzComp);
2146      exportto(Schreyer, Syzextra_g::MakeInducedSchreyerOrdering);
2147//      exportto(Schreyer, Syzextra_g::MakeSyzCompOrdering);
2148      exportto(Schreyer, Syzextra_g::idPrepare);
2149//      exportto(Schreyer, Syzextra_g::reduce_syz);
2150//      exportto(Schreyer, Syzextra_g::p_Content);
2151
2152      exportto(Schreyer, Syzextra_g::ProfilerStart); exportto(Schreyer, Syzextra_g::ProfilerStop);
2153
2154      exportto(Schreyer, Syzextra_g::Tail);
2155      exportto(Schreyer, Syzextra_g::ComputeLeadingSyzygyTerms);
2156      exportto(Schreyer, Syzextra_g::Compute2LeadingSyzygyTerms);
2157      exportto(Schreyer, Syzextra_g::Sort_c_ds);
2158
2159      exportto(Schreyer, Syzextra_g::FindReducer);
2160     
2161      exportto(Schreyer, Syzextra_g::ReduceTerm);
2162      exportto(Schreyer, Syzextra_g::TraverseTail);
2163
2164      exportto(Schreyer, Syzextra_g::SchreyerSyzygyNF);
2165      exportto(Schreyer, Syzextra_g::ComputeSyzygy);
2166    }
2167*/
2168
2169    exportto(Top, DetailedPrint);
2170    exportto(Top, GetInducedData);
2171
2172    if( @DEBUG )
2173    {
2174      listvar(Top);
2175      listvar(Schreyer);
2176    }
2177  }
2178 
2179  if( !defined(GetInducedData) )
2180  {
2181    ERROR("Sorry but we are missing the dynamic module (syzextra.so)...");
2182  }
2183
2184}
2185
2186static proc mod_init()
2187{
2188  loadme();
2189}
2190
2191
2192proc testallSexamples()
2193{
2194  example Ssyz;
2195  example Scontinue;
2196  example Sres; 
2197}
2198
2199proc testallSSexamples()
2200{
2201  example SSsyz;
2202  example SScontinue;
2203  example SSres; 
2204}
2205
2206example
2207{ "EXAMPLE:"; echo = 2;
2208  testallSexamples();
2209  testallSSexamples();
2210}
2211
2212proc TestSSres(def M)
2213{
2214  "/ ----------------------------------- : ", "options: ", attrib(SSinit, "LEAD2SYZ"), attrib(SSinit, "TAILREDSYZ"), attrib(SSinit, "HYBRIDNF"), "...";
2215  int t = timer;
2216  def S = SSres(M, 0);
2217  int tt = timer;
2218/*
2219  setring S;
2220 
2221  MRES;
2222  RES;
2223  "";
2224  LRES;
2225  "";
2226  TRES;
2227*/ 
2228  kill S;
2229  "\ ----------------------------------- / ", "options: ", attrib(SSinit, "LEAD2SYZ"), attrib(SSinit, "TAILREDSYZ"), attrib(SSinit, "HYBRIDNF"), ": ", "Time: ", tt - t;
2230}
2231
2232
2233proc TestSres(def M)
2234{
2235  def opts = option(get);
2236  option(redSB); option(redTail);
2237  "/ ----------------------------------- : Sres ...";
2238  int t = timer;
2239  def S = Sres(M, 0);
2240  int tt = timer;
2241/*
2242  setring S;
2243
2244  MRES;
2245  RES;
2246  "";
2247  LRES;
2248  "";
2249  TRES;
2250*/ 
2251  kill S;
2252  "\ ----------------------------------- / Sres ", "Time: ", tt - t; 
2253  option(set, opts);
2254  kill opts;
2255}
2256
2257
2258proc Testsres(def M)
2259{
2260  def opts = option(get);
2261  option(redSB); option(redTail);
2262  "/ ----------------------------------- : sres ...";
2263  int t = timer;
2264  def S = list(sres(M, 0));
2265  int tt = timer;
2266/*
2267  setring S;
2268
2269  MRES;
2270  RES;
2271  "";
2272  LRES;
2273  "";
2274  TRES;
2275*/ 
2276  kill S;
2277  "\ ----------------------------------- / sres ", "Time: ", tt - t; 
2278  option(set, opts);
2279  kill opts;
2280}
2281
2282
2283proc Testlres(def M)
2284{
2285  def opts = option(get);
2286  option(redSB); option(redTail);
2287  "/ ----------------------------------- : lres ...";
2288  int t = timer;
2289  def S = list(lres(M, 0));
2290  int tt = timer;
2291  kill S;
2292  "\ ----------------------------------- / lres ", "Time: ", tt - t; 
2293  option(set, opts);
2294  kill opts;
2295}
2296
2297
2298proc Testnres(def M)
2299{
2300  def opts = option(get);
2301  option(redSB); option(redTail);
2302  "/ ----------------------------------- : nres ...";
2303  int t = timer;
2304  def S = list(nres(M, 0));
2305  int tt = timer;
2306  kill S;
2307  "\ ----------------------------------- / nres ", "Time: ", tt - t; 
2308  option(set, opts);
2309  kill opts;
2310}
2311
2312
2313proc TestSSresAttribs(def M)
2314{
2315//  M = groebner(M);  "groebner: "; M;  "";
2316
2317
2318  // the following 2 setups are bad for AGR@101n3d002s004%1:(((
2319
2320  //////////  attrib(SSinit, "LEAD2SYZ", 0); attrib(SSinit, "TAILREDSYZ", 0); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2321  //////////  attrib(SSinit, "LEAD2SYZ", 0); attrib(SSinit, "TAILREDSYZ", 0); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2322
2323  attrib(SSinit, "LEAD2SYZ", 0); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2324  attrib(SSinit, "LEAD2SYZ", 0); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2325
2326  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 0); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2327  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 0); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2328
2329  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2330  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2331}
2332
2333
2334proc TestSSresAttribs2tr(def M)
2335{
2336  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2337  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2338
2339  Testlres(M); 
2340  Testnres(M); 
2341  Testsres(M); 
2342//  TestSres(M); // too long for the last medium test :(
2343}
2344
2345
2346proc testALLA()
2347{
2348  // TODO: only for now!!
2349  attrib(SSinit, "DEBUG", 0);
2350  attrib(SSinit, "SYZCHECK", 1);
2351  attrib(SSinit, "KERCHECK", 1);
2352
2353  ring r; r; ideal M = maxideal(1); M;
2354  TestSSresAttribs(M); 
2355  kill r;
2356
2357  ring r = 0, (a, b, c, d), lp; r; ideal M = maxideal(1); M;
2358  TestSSresAttribs(M); 
2359  kill r;
2360
2361  ring R = 0, (w, x, y, z), dp; R;
2362  ideal M = w^2 - x*z,  w*x - y*z,  x^2 - w*y, x*y - z^2, y^2 - w*z; M;
2363  TestSSresAttribs(M); 
2364  kill R;
2365
2366
2367  ring r = 0, (a, b, c, d, e, f), dp; r; ideal M = maxideal(1); M;
2368  TestSSresAttribs(M); 
2369  kill r; 
2370 
2371  ring AGR = (101), (a, b, c, d), dp; AGR;
2372  // simple: AGR@101n3d002s004%1:
2373  ideal M = c*d, b*d, a*d, c^2-d^2, b*c, a*c, b^2-d^2, a*b, a^2-d^2;
2374  M;
2375  TestSSresAttribs(M);
2376
2377  // medium: AGR@101n3d004s009%1;
2378  M = a*b+7*a*c-16*b*c-27*a*d+37*b*d-2*c*d, d^3, c*d^2, b*d^2, a*d^2, c^2*d, b*c*d, a*c*d, b^2*d, a^2*d, c^3, b*c^2, a*c^2, b^2*c, a^2*c, b^3, a^3;
2379  M;
2380  TestSSresAttribs(M);
2381}
2382
2383proc testAGR()
2384{
2385  attrib(SSinit, "DEBUG", 0);
2386  attrib(SSinit, "SYZCHECK", 1);
2387  attrib(SSinit, "KERCHECK", 0);
2388
2389  ring AGR = (101), (a, b, c, d), dp; AGR;
2390  // lengthy: AGR@101n3d008s058%3, kernel only!
2391  ideal M = c^4*d^2+4*a^3*d^3+29*a^2*b*d^3-2*a*b^2*d^3+2*b^3*d^3-21*a^2*c*d^3+46*a*b*c*d^3+2*b^2*c*d^3-13*a*c^2*d^3+32*b*c^2*d^3+46*c^3*d^3-28*a^2*d^4+4*a*b*d^4+29*b^2*d^4-8*a*c*d^4+33*b*c*d^4-16*c^2*d^4+17*a*d^5-3*b*d^5-42*c*d^5+47*d^6,b*c^3*d^2+35*a^3*d^3+24*a^2*b*d^3+46*a*b^2*d^3-22*b^3*d^3-48*a^2*c*d^3+20*a*b*c*d^3-28*b^2*c*d^3-40*a*c^2*d^3-4*b*c^2*d^3+35*c^3*d^3-21*a^2*d^4+3*a*b*d^4+8*b^2*d^4-2*a*c*d^4-22*b*c*d^4+24*c^2*d^4+44*a*d^5+33*b*d^5+31*c*d^5+26*d^6,a*c^3*d^2-42*a^3*d^3+34*a^2*b*d^3-10*a*b^2*d^3+30*b^3*d^3-6*a^2*c*d^3-30*a*b*c*d^3-34*b^2*c*d^3+29*a*c^2*d^3+35*b*c^2*d^3+13*c^3*d^3+8*a^2*d^4+23*a*b*d^4-29*b^2*d^4+12*a*c*d^4-22*b*c*d^4-50*c^2*d^4-4*b*d^5+9*c*d^5+13*d^6,b^2*c^2*d^2+a^3*d^3-49*a^2*b*d^3+26*a*b^2*d^3+20*b^3*d^3+24*a^2*c*d^3-2*a*b*c*d^3+31*b^2*c*d^3-30*a*c^2*d^3+21*b*c^2*d^3-24*c^3*d^3-38*a^2*d^4-14*a*b*d^4-14*b^2*d^4+6*a*c*d^4+3*b*c*d^4+13*c^2*d^4-11*a*d^5-38*b*d^5+22*c*d^5+48*d^6,a*b*c^2*d^2+18*a^3*d^3-29*a^2*b*d^3-21*a*b^2*d^3-2*b^3*d^3-25*a^2*c*d^3+37*a*b*c*d^3-14*b^2*c*d^3-47*a*c^2*d^3-6*b*c^2*d^3-34*c^3*d^3+43*a^2*d^4+22*a*b*d^4-39*b^2*d^4-41*a*c*d^4-17*b*c*d^4-13*c^2*d^4-43*a*d^5+28*b*d^5-42*c*d^5-49*d^6,a^2*c^2*d^2-33*a^3*d^3+30*a^2*b*d^3-13*a*b^2*d^3+18*b^3*d^3-8*a^2*c*d^3-18*a*b*c*d^3-15*b^2*c*d^3-21*a*c^2*d^3+45*b*c^2*d^3-35*c^3*d^3-4*a^2*d^4-4*a*b*d^4+10*b^2*d^4-19*a*c*d^4-18*b*c*d^4-22*c^2*d^4-27*a*d^5+20*b*d^5-14*c*d^5+24*d^6,b^3*c*d^2-10*a^3*d^3+37*a*b^2*d^3-43*b^3*d^3-10*a^2*c*d^3-9*a*b*c*d^3+47*a*c^2*d^3-24*b*c^2*d^3+12*c^3*d^3+7*a^2*d^4+19*a*b*d^4-27*b^2*d^4-2*a*c*d^4-35*b*c*d^4+45*c^2*d^4-44*a*d^5-43*b*d^5+24*c*d^5+16*d^6,a*b^2*c*d^2+2*a^3*d^3-14*a^2*b*d^3+2*a*b^2*d^3+18*b^3*d^3-48*a^2*c*d^3+43*a*b*c*d^3-25*b^2*c*d^3+15*a*c^2*d^3-7*b*c^2*d^3+42*c^3*d^3-16*a^2*d^4+7*b^2*d^4-23*a*c*d^4+24*b*c*d^4+25*c^2*d^4-17*a*d^5-16*b*d^5-32*c*d^5-50*d^6,a^2*b*c*d^2-16*a^3*d^3+7*a^2*b*d^3-20*a*b^2*d^3+11*b^3*d^3+16*a^2*c*d^3+6*a*b*c*d^3-25*b^2*c*d^3+42*a*c^2*d^3-39*b*c^2*d^3-15*c^3*d^3-25*a^2*d^4+46*a*b*d^4-3*b^2*d^4+5*a*c*d^4+28*b*c*d^4+6*c^2*d^4-20*a*d^5-15*b*d^5-30*c*d^5+17*d^6,a^3*c*d^2+39*a^3*d^3+22*a^2*b*d^3-21*a*b^2*d^3+10*b^3*d^3+40*a^2*c*d^3-37*a*b*c*d^3+11*b^2*c*d^3+43*a*c^2*d^3+28*b*c^2*d^3-10*c^3*d^3+30*a^2*d^4+36*a*b*d^4-45*b^2*d^4-40*a*c*d^4-31*b*c*d^4+28*c^2*d^4+35*a*d^5+6*b*d^5+14*c*d^5+25*d^6,b^4*d^2+50*a^3*d^3+12*a^2*b*d^3+29*a*b^2*d^3-38*b^3*d^3-44*a^2*c*d^3+28*a*b*c*d^3+18*b^2*c*d^3-31*a*c^2*d^3+16*b*c^2*d^3-18*c^3*d^3+5*a^2*d^4-43*a*b*d^4+16*b^2*d^4+9*a*c*d^4-30*b*c*d^4+50*c^2*d^4+3*a*d^5+33*b*d^5+3*c*d^5-48*d^6,a*b^3*d^2+13*a^3*d^3-28*a^2*b*d^3-33*a*b^2*d^3-25*b^3*d^3-41*a^2*c*d^3+a*b*c*d^3+19*b^2*c*d^3+41*a*c^2*d^3-17*b*c^2*d^3+34*c^3*d^3-10*a^2*d^4+30*a*b*d^4+34*b^2*d^4+13*a*c*d^4+b*c*d^4-35*c^2*d^4-34*a*d^5+23*b*d^5-7*c*d^5+6*d^6,a^2*b^2*d^2+22*a^3*d^3-32*a^2*b*d^3+29*a*b^2*d^3+21*b^3*d^3-30*a^2*c*d^3-47*a*b*c*d^3-11*b^2*c*d^3-16*a*c^2*d^3-14*b*c^2*d^3+49*c^3*d^3+47*a^2*d^4-11*a*b*d^4+4*b^2*d^4+13*a*c*d^4+7*b*c*d^4-30*c^2*d^4+31*a*d^5+10*b*d^5-8*c*d^5-27*d^6,a^3*b*d^2-43*a^3*d^3-2*a^2*b*d^3+15*a*b^2*d^3+42*b^3*d^3+25*a^2*c*d^3+22*a*b*c*d^3-4*b^2*c*d^3-29*a*c^2*d^3-31*b*c^2*d^3-3*c^3*d^3+33*a^2*d^4+20*a*b*d^4-34*b^2*d^4+8*a*c*d^4+48*b*c*d^4-29*c^2*d^4-46*a*d^5+27*b*d^5+29*c*d^5+33*d^6,a^4*d^2+30*a^3*d^3-42*a*b^2*d^3-16*b^3*d^3-33*a^2*c*d^3+13*a*b*c*d^3+7*b^2*c*d^3-23*a*c^2*d^3+28*b*c^2*d^3-37*c^3*d^3+3*a^2*d^4-34*a*b*d^4+16*b^2*d^4-21*a*c*d^4-39*b*c*d^4+5*c^2*d^4+35*a*d^5+39*b*d^5-26*c*d^5-47*d^6,c^5*d+48*a^3*d^3-37*a^2*b*d^3+31*a*b^2*d^3-19*b^3*d^3+49*a^2*c*d^3-5*a*b*c*d^3+45*b^2*c*d^3+24*a*c^2*d^3-26*b*c^2*d^3-10*c^3*d^3-a^2*d^4+43*a*b*d^4-26*b^2*d^4+45*a*c*d^4-3*b*c*d^4+38*c^2*d^4+10*a*d^5-5*b*d^5-34*c*d^5+22*d^6,b*c^4*d+30*a^3*d^3-40*a^2*b*d^3-39*a*b^2*d^3+33*b^3*d^3+31*a^2*c*d^3-17*a*b*c*d^3-44*b^2*c*d^3+24*a*c^2*d^3+22*b*c^2*d^3-44*c^3*d^3-29*a^2*d^4+4*a*b*d^4-4*b^2*d^4+8*a*c*d^4-42*b*c*d^4+15*c^2*d^4-42*a*d^5+15*b*d^5-41*c*d^5-46*d^6,a*c^4*d-11*a^3*d^3-5*a^2*b*d^3+33*a*b^2*d^3+7*b^3*d^3-31*a^2*c*d^3-47*a*b*c*d^3-50*b^2*c*d^3-50*a*c^2*d^3-39*b*c^2*d^3+25*c^3*d^3+5*a^2*d^4+35*a*b*d^4-34*b^2*d^4+42*a*c*d^4-44*b*c*d^4-17*c^2*d^4+11*a*d^5+b*d^5+31*c*d^5+45*d^6,b^2*c^3*d+12*a^3*d^3-41*a^2*b*d^3+29*a*b^2*d^3-42*b^3*d^3-32*a^2*c*d^3+47*a*b*c*d^3-13*b^2*c*d^3-20*a*c^2*d^3+45*b*c^2*d^3-49*c^3*d^3-34*a^2*d^4+16*a*b*d^4+11*b^2*d^4-49*a*c*d^4-27*b*c*d^4-31*c^2*d^4+29*a*d^5-23*b*d^5+13*c*d^5+42*d^6,a*b*c^3*d-16*a^3*d^3-35*a^2*b*d^3+12*a*b^2*d^3-39*b^3*d^3-32*a*b*c*d^3-4*b^2*c*d^3+31*a*c^2*d^3+43*b*c^2*d^3-42*c^3*d^3+36*a^2*d^4-5*a*b*d^4-4*b^2*d^4+5*a*c*d^4+20*b*c*d^4+31*c^2*d^4+15*a*d^5+25*b*d^5-16*c*d^5-28*d^6,a^2*c^3*d-16*a^3*d^3+8*a^2*b*d^3+30*a*b^2*d^3-16*b^3*d^3+20*a^2*c*d^3-11*b^2*c*d^3-48*a*c^2*d^3+11*b*c^2*d^3-20*c^3*d^3-24*a^2*d^4-23*a*b*d^4+9*b^2*d^4+13*a*c*d^4-42*b*c*d^4+22*c^2*d^4-29*a*d^5-28*b*d^5-7*c*d^5-2*d^6,b^3*c^2*d+42*a^3*d^3-11*a^2*b*d^3+18*a*b^2*d^3-13*b^3*d^3+22*a^2*c*d^3-10*a*b*c*d^3-25*b^2*c*d^3-17*a*c^2*d^3-23*b*c^2*d^3-37*c^3*d^3-3*a^2*d^4-33*a*b*d^4+44*b^2*d^4-41*a*c*d^4+6*b*c*d^4-36*c^2*d^4-43*a*d^5+b*d^5+25*c*d^5+48*d^6,a*b^2*c^2*d+21*a^3*d^3+5*a^2*b*d^3+38*a*b^2*d^3+25*b^3*d^3-12*a^2*c*d^3+7*a*b*c*d^3+28*b^2*c*d^3+a*c^2*d^3+33*b*c^2*d^3+22*c^3*d^3+10*a^2*d^4-7*a*b*d^4-5*b^2*d^4+50*a*c*d^4-23*b*c*d^4+22*c^2*d^4-4*a*d^5+45*b*d^5-42*c*d^5+d^6,a^2*b*c^2*d-45*a^3*d^3+2*a^2*b*d^3+44*a*b^2*d^3-5*b^3*d^3-19*a^2*c*d^3-3*a*b*c*d^3+18*b^2*c*d^3-22*a*c^2*d^3+46*b*c^2*d^3+41*c^3*d^3-26*a^2*d^4-a*b*d^4-42*b^2*d^4-40*a*c*d^4+39*b*c*d^4+24*c^2*d^4-6*a*d^5-6*b*d^5+13*c*d^5-28*d^6,a^3*c^2*d+4*a^3*d^3+31*a^2*b*d^3+21*a*b^2*d^3+39*b^3*d^3-8*a^2*c*d^3+49*a*b*c*d^3-48*b^2*c*d^3-16*a*c^2*d^3-33*b*c^2*d^3+35*c^3*d^3+41*a^2*d^4+18*a*b*d^4+47*b^2*d^4-3*a*c*d^4+12*b*c*d^4+13*c^2*d^4+32*a*d^5-40*b*d^5+50*c*d^5-2*d^6,b^4*c*d+23*a^3*d^3+47*a^2*b*d^3-10*a*b^2*d^3-43*b^3*d^3+49*a^2*c*d^3+7*a*b*c*d^3+34*b^2*c*d^3-40*a*c^2*d^3-37*b*c^2*d^3-6*c^3*d^3+30*a^2*d^4-34*a*b*d^4-6*b^2*d^4+21*a*c*d^4+41*b*c*d^4-33*c^2*d^4-9*a*d^5+2*b*d^5+8*c*d^5+7*d^6,a*b^3*c*d-5*a^3*d^3-42*a^2*b*d^3+22*a*b^2*d^3-35*b^3*d^3+a^2*c*d^3+20*a*b*c*d^3-10*b^2*c*d^3+23*a*c^2*d^3-17*b*c^2*d^3+30*c^3*d^3+24*a^2*d^4+32*a*b*d^4-7*b^2*d^4-48*a*c*d^4-25*b*c*d^4-6*c^2*d^4-33*a*d^5+29*b*d^5+12*c*d^5+26*d^6,a^2*b^2*c*d+6*a^3*d^3-46*a^2*b*d^3-30*a*b^2*d^3+b^3*d^3-35*a^2*c*d^3+41*a*b*c*d^3-4*b^2*c*d^3-42*a*c^2*d^3+16*b*c^2*d^3+19*c^3*d^3-13*a^2*d^4-16*a*b*d^4+45*b^2*d^4-25*a*c*d^4-48*b*c*d^4+35*c^2*d^4+50*a*d^5+31*b*d^5-25*c*d^5+6*d^6,a^3*b*c*d+3*a^3*d^3-39*a^2*b*d^3+14*a*b^2*d^3-4*b^3*d^3-36*a^2*c*d^3+47*a*b*c*d^3+27*b^2*c*d^3+50*a*c^2*d^3-45*b*c^2*d^3+49*c^3*d^3-18*a^2*d^4+20*a*b*d^4+17*b^2*d^4+a*c*d^4+33*b*c*d^4+42*c^2*d^4+19*a*d^5+18*b*d^5+33*c*d^5+15*d^6,a^4*c*d-14*a^3*d^3-8*a^2*b*d^3-a*b^2*d^3-34*b^3*d^3-27*a^2*c*d^3-15*a*b*c*d^3-14*b^2*c*d^3+33*a*c^2*d^3-34*b*c^2*d^3-4*c^3*d^3+47*a^2*d^4+50*a*b*d^4-6*b^2*d^4+16*a*c*d^4+26*c^2*d^4-27*a*d^5+2*b*d^5-31*c*d^5+47*d^6,b^5*d+3*a^3*d^3-9*a^2*b*d^3+46*a*b^2*d^3+b^3*d^3-2*a^2*c*d^3-39*a*b*c*d^3-31*b^2*c*d^3-30*a*c^2*d^3+23*b*c^2*d^3+25*c^3*d^3+9*a^2*d^4-15*a*b*d^4-2*b^2*d^4-12*a*c*d^4+11*b*c*d^4+9*c^2*d^4+3*a*d^5+9*b*d^5+41*c*d^5-38*d^6,a*b^4*d-48*a^3*d^3+42*a^2*b*d^3+27*a*b^2*d^3+32*b^3*d^3+21*a^2*c*d^3-5*a*b*c*d^3-39*b^2*c*d^3+6*a*c^2*d^3-20*b*c^2*d^3+45*c^3*d^3-48*a^2*d^4+44*a*b*d^4+25*b^2*d^4-29*a*c*d^4+4*b*c*d^4+50*c^2*d^4-6*a*d^5-40*b*d^5-11*c*d^5-28*d^6,a^2*b^3*d-41*a^3*d^3+21*a^2*b*d^3+39*a*b^2*d^3-2*b^3*d^3+24*a*b*c*d^3-10*b^2*c*d^3+31*a*c^2*d^3-34*b*c^2*d^3-31*c^3*d^3+20*a^2*d^4+41*a*b*d^4-10*b^2*d^4-40*a*c*d^4+5*b*c*d^4+31*c^2*d^4+6*a*d^5+26*b*d^5+29*c*d^5-5*d^6,a^3*b^2*d-11*a^3*d^3-39*a^2*b*d^3+2*a*b^2*d^3-44*b^3*d^3-23*a^2*c*d^3+21*a*b*c*d^3-44*b^2*c*d^3-7*a*c^2*d^3+49*b*c^2*d^3+46*c^3*d^3+17*a^2*d^4+49*a*b*d^4-14*b^2*d^4+29*a*c*d^4-20*b*c*d^4-49*c^2*d^4-13*a*d^5-41*b*d^5-18*c*d^5+50*d^6,a^4*b*d+9*a^3*d^3+50*a^2*b*d^3+46*a*b^2*d^3-48*b^3*d^3+43*a^2*c*d^3-45*a*b*c*d^3+24*b^2*c*d^3-4*a*c^2*d^3-b*c^2*d^3-34*c^3*d^3+33*a^2*d^4+14*a*b*d^4-37*b^2*d^4-13*a*c*d^4+48*b*c*d^4-31*c^2*d^4-22*a*d^5+42*b*d^5+49*c*d^5-43*d^6,a^5*d+33*a^3*d^3-23*a^2*b*d^3+30*a*b^2*d^3+5*b^3*d^3-26*a^2*c*d^3-35*a*b*c*d^3-50*b^2*c*d^3-21*a*c^2*d^3+4*b*c^2*d^3+10*c^3*d^3+39*a^2*d^4-2*a*b*d^4+23*b^2*d^4+17*a*c*d^4-50*b*c*d^4-8*c^2*d^4-39*a*d^5+36*b*d^5-43*c*d^5-39*d^6,c^6+20*a^3*d^3-41*a*b^2*d^3+39*b^3*d^3+26*a^2*c*d^3-8*a*b*c*d^3-49*b^2*c*d^3+25*a*c^2*d^3+32*b*c^2*d^3-32*c^3*d^3-2*a^2*d^4-38*a*b*d^4-38*b^2*d^4+17*a*c*d^4+22*b*c*d^4-36*c^2*d^4-41*a*d^5+37*b*d^5-49*c*d^5-19*d^6,b*c^5-36*a^3*d^3+32*a^2*b*d^3-14*a*b^2*d^3-31*b^3*d^3-2*a^2*c*d^3-8*a*b*c*d^3-39*b^2*c*d^3-46*a*c^2*d^3+10*b*c^2*d^3+27*c^3*d^3+25*a^2*d^4-30*a*b*d^4+3*b^2*d^4-36*a*c*d^4+44*b*c*d^4+17*c^2*d^4-46*a*d^5-37*b*d^5-2*c*d^5-47*d^6,a*c^5-49*a^3*d^3+11*a^2*b*d^3-21*a*b^2*d^3-14*b^3*d^3+26*a^2*c*d^3-a*b*c*d^3+24*b^2*c*d^3-46*a*c^2*d^3+23*b*c^2*d^3+33*c^3*d^3-11*a^2*d^4-a*b*d^4+49*b^2*d^4-17*a*c*d^4+49*b*c*d^4+36*c^2*d^4+10*a*d^5-19*b*d^5+26*c*d^5-32*d^6,b^2*c^4-14*a^3*d^3+9*a^2*b*d^3-5*a*b^2*d^3+17*b^3*d^3+2*a^2*c*d^3+12*a*b*c*d^3-37*b^2*c*d^3-43*a*c^2*d^3+5*b*c^2*d^3-9*c^3*d^3-27*a^2*d^4+14*a*b*d^4-19*b^2*d^4+29*a*c*d^4+32*b*c*d^4-15*c^2*d^4-26*a*d^5-31*b*d^5+46*c*d^5-22*d^6,a*b*c^4+33*a^3*d^3-22*a^2*b*d^3-14*a*b^2*d^3-30*b^3*d^3-48*a^2*c*d^3+34*a*b*c*d^3-8*b^2*c*d^3-44*a*c^2*d^3-4*b*c^2*d^3+3*c^3*d^3+26*a^2*d^4+4*a*b*d^4+7*b^2*d^4-28*a*c*d^4-22*b*c*d^4-35*c^2*d^4-50*a*d^5-43*b*d^5+46*c*d^5-49*d^6,a^2*c^4-9*a^3*d^3+3*a^2*b*d^3+34*a*b^2*d^3+4*b^3*d^3+5*a^2*c*d^3-17*a*b*c*d^3-48*b^2*c*d^3+10*a*c^2*d^3+2*b*c^2*d^3-12*c^3*d^3-7*a^2*d^4-6*a*b*d^4+37*b^2*d^4-16*a*c*d^4+47*b*c*d^4+6*c^2*d^4-35*a*d^5-45*b*d^5-12*c*d^5-30*d^6,b^3*c^3-21*a^3*d^3-6*a^2*b*d^3-26*a*b^2*d^3-22*b^3*d^3-29*a*b*c*d^3-26*b^2*c*d^3+50*a*c^2*d^3-41*b*c^2*d^3+22*c^3*d^3-41*a^2*d^4+25*a*b*d^4+16*b^2*d^4+11*a*c*d^4+34*b*c*d^4+19*c^2*d^4-38*a*d^5-8*b*d^5-42*c*d^5-6*d^6,a*b^2*c^3+3*a^3*d^3-45*a^2*b*d^3+39*a*b^2*d^3+22*b^3*d^3+48*a^2*c*d^3-7*a*b*c*d^3-46*b^2*c*d^3-22*a*c^2*d^3-17*b*c^2*d^3-27*c^3*d^3-35*a^2*d^4+47*a*b*d^4+6*b^2*d^4-5*a*c*d^4-30*b*c*d^4+25*c^2*d^4-10*a*d^5+46*b*d^5+5*c*d^5-18*d^6,a^2*b*c^3-36*a^3*d^3+33*a^2*b*d^3+47*a*b^2*d^3-16*b^3*d^3-41*a^2*c*d^3+42*a*b*c*d^3-29*b^2*c*d^3+39*a*c^2*d^3-12*b*c^2*d^3-25*c^3*d^3-11*a^2*d^4-37*a*b*d^4+29*b^2*d^4-18*a*c*d^4+43*b*c*d^4+12*c^2*d^4-37*a*d^5+7*b*d^5+7*c*d^5-5*d^6,a^3*c^3+25*a^3*d^3+34*a^2*b*d^3+29*a*b^2*d^3-34*b^3*d^3-46*a^2*c*d^3-17*a*b*c*d^3+49*b^2*c*d^3-35*a*c^2*d^3-21*b*c^2*d^3-45*c^3*d^3+43*a^2*d^4+29*a*b*d^4+36*b^2*d^4+37*a*c*d^4+12*b*c*d^4-17*c^2*d^4+12*a*d^5+47*c*d^5-23*d^6,b^4*c^2-10*a^3*d^3+38*a^2*b*d^3+33*a*b^2*d^3+9*b^3*d^3-25*a^2*c*d^3+38*a*b*c*d^3-19*b^2*c*d^3-33*a*c^2*d^3-49*b*c^2*d^3-16*c^3*d^3-14*a^2*d^4-3*a*b*d^4-30*b^2*d^4-32*a*c*d^4+28*b*c*d^4-3*c^2*d^4-16*a*d^5+31*b*d^5-49*c*d^5-3*d^6,a*b^3*c^2+25*a^3*d^3-47*a^2*b*d^3+47*b^3*d^3+13*a^2*c*d^3-17*a*b*c*d^3+26*b^2*c*d^3-43*a*c^2*d^3+39*b*c^2*d^3-4*c^3*d^3+20*a^2*d^4+6*a*b*d^4+49*b^2*d^4+14*a*c*d^4-17*b*c*d^4+38*c^2*d^4+21*a*d^5-9*b*d^5-26*c*d^5+47*d^6,a^2*b^2*c^2+12*a^3*d^3+10*a^2*b*d^3-40*a*b^2*d^3+14*b^3*d^3+36*a^2*c*d^3-9*a*b*c*d^3+9*b^2*c*d^3+7*a*c^2*d^3+12*b*c^2*d^3-37*c^3*d^3-44*a^2*d^4-48*a*b*d^4+11*b^2*d^4-13*a*c*d^4+31*b*c*d^4+47*c^2*d^4+28*a*d^5+39*b*d^5+27*c*d^5-d^6,a^3*b*c^2-28*a^3*d^3-22*a^2*b*d^3-8*a*b^2*d^3+40*b^3*d^3-13*a^2*c*d^3+35*a*b*c*d^3-4*b^2*c*d^3+28*a*c^2*d^3+30*b*c^2*d^3-13*c^3*d^3+16*a^2*d^4+48*a*b*d^4-42*b^2*d^4+10*a*c*d^4-b*c*d^4+37*c^2*d^4-17*a*d^5-15*b*d^5+40*c*d^5+27*d^6,a^4*c^2+17*a^3*d^3+45*a^2*b*d^3+42*a*b^2*d^3-20*b^3*d^3-39*a^2*c*d^3-20*a*b*c*d^3-44*b^2*c*d^3+33*a*c^2*d^3+39*b*c^2*d^3-37*c^3*d^3+39*a^2*d^4+39*a*b*d^4-44*b^2*d^4+8*a*c*d^4-34*b*c*d^4+36*c^2*d^4-47*a*d^5+38*b*d^5-46*c*d^5+23*d^6,b^5*c+24*a^3*d^3+17*a^2*b*d^3-22*a*b^2*d^3-27*b^3*d^3+27*a^2*c*d^3+48*a*b*c*d^3+4*b^2*c*d^3+a*c^2*d^3-21*b*c^2*d^3-14*c^3*d^3+3*a^2*d^4+15*a*b*d^4+41*b^2*d^4-27*a*c*d^4+4*b*c*d^4+3*c^2*d^4-46*a*d^5+28*b*d^5+6*c*d^5+36*d^6,a*b^4*c-29*a^3*d^3+30*a^2*b*d^3+31*a*b^2*d^3+44*b^3*d^3-12*a^2*c*d^3-27*a*b*c*d^3+48*b^2*c*d^3+4*a*c^2*d^3+2*b*c^2*d^3-17*c^3*d^3-7*a^2*d^4+25*a*b*d^4-45*b^2*d^4-17*a*c*d^4-14*b*c*d^4-11*c^2*d^4-45*a*d^5-36*b*d^5-12*c*d^5-44*d^6,a^2*b^3*c-10*a^3*d^3-30*a^2*b*d^3-22*a*b^2*d^3-35*b^3*d^3+37*a^2*c*d^3-35*a*b*c*d^3-12*b^2*c*d^3-16*b*c^2*d^3+49*c^3*d^3+38*a^2*d^4-21*a*b*d^4-20*b^2*d^4-6*a*c*d^4+41*b*c*d^4+49*c^2*d^4+13*a*d^5-38*b*d^5-32*c*d^5-12*d^6,a^3*b^2*c+5*a^2*b*d^3-40*a*b^2*d^3+14*b^3*d^3-4*a^2*c*d^3-13*a*b*c*d^3+47*b^2*c*d^3+28*a*c^2*d^3+15*b*c^2*d^3+47*c^3*d^3-8*a^2*d^4-20*a*b*d^4+3*b^2*d^4+42*a*c*d^4+18*b*c*d^4-23*c^2*d^4-48*a*d^5+12*b*d^5-25*c*d^5-39*d^6,a^4*b*c+29*a^3*d^3+21*a^2*b*d^3-32*a*b^2*d^3+48*b^3*d^3-44*a^2*c*d^3-3*a*b*c*d^3-27*b^2*c*d^3+27*a*c^2*d^3+43*b*c^2*d^3-30*c^3*d^3+4*a^2*d^4+16*a*b*d^4+33*b^2*d^4+37*a*c*d^4-32*b*c*d^4+14*c^2*d^4+50*a*d^5-49*c*d^5-33*d^6,a^5*c-26*a^3*d^3-50*a^2*b*d^3+2*a*b^2*d^3+3*b^3*d^3-15*a^2*c*d^3-32*a*b*c*d^3-4*b^2*c*d^3-13*a*c^2*d^3-13*b*c^2*d^3+3*c^3*d^3+32*a^2*d^4-32*a*b*d^4-47*b^2*d^4-39*a*c*d^4-34*b*c*d^4-9*c^2*d^4-7*a*d^5-22*b*d^5+16*c*d^5+44*d^6,b^6+45*a^3*d^3-42*a^2*b*d^3-35*a*b^2*d^3+13*b^3*d^3+28*a^2*c*d^3-2*a*b*c*d^3-37*b^2*c*d^3-9*a*c^2*d^3+44*b*c^2*d^3-24*c^3*d^3+36*a^2*d^4+42*a*b*d^4-38*b^2*d^4-34*a*c*d^4-46*b*c*d^4+23*c^2*d^4-9*a*d^5-28*b*d^5+37*c*d^5+26*d^6,a*b^5-14*a^3*d^3+38*a^2*b*d^3-37*a*b^2*d^3-33*b^3*d^3-24*a^2*c*d^3+15*a*b*c*d^3+44*b^2*c*d^3-45*a*c^2*d^3+3*b*c^2*d^3-41*c^3*d^3-48*a^2*d^4-36*a*b*d^4+39*b^2*d^4+46*a*c*d^4-3*b*c*d^4+21*c^2*d^4-36*a*d^5-20*b*d^5+24*c*d^5-33*d^6,a^2*b^4-27*a^3*d^3-10*a^2*b*d^3-5*a*b^2*d^3+8*b^3*d^3+21*a^2*c*d^3+31*a*b*c*d^3-44*b^2*c*d^3+41*a*c^2*d^3+17*b*c^2*d^3-8*c^3*d^3+19*a^2*d^4+25*a*b*d^4+b^2*d^4+3*a*c*d^4+2*b*c*d^4-40*c^2*d^4+31*a*d^5-19*b*d^5+35*c*d^5-28*d^6,a^3*b^3-12*a^3*d^3-25*a^2*b*d^3+37*a*b^2*d^3-37*b^3*d^3+46*a^2*c*d^3+43*a*b*c*d^3+b^2*c*d^3-41*a*c^2*d^3-38*b*c^2*d^3-36*c^3*d^3-11*a*b*d^4+20*b^2*d^4-a*c*d^4-26*b*c*d^4+14*c^2*d^4-48*a*d^5+17*b*d^5+9*c*d^5+30*d^6,a^4*b^2+36*a^3*d^3+9*a^2*b*d^3-31*b^3*d^3+50*a^2*c*d^3+41*a*b*c*d^3+40*b^2*c*d^3+48*a*c^2*d^3-41*b*c^2*d^3-17*c^3*d^3+33*a^2*d^4+47*a*b*d^4+22*b^2*d^4+2*a*c*d^4+23*b*c*d^4-47*c^2*d^4+34*a*d^5-15*b*d^5-33*c*d^5-38*d^6,a^5*b-12*a^3*d^3-38*a^2*b*d^3+46*a*b^2*d^3-32*b^3*d^3-41*a^2*c*d^3+14*a*b*c*d^3-34*b^2*c*d^3+7*a*c^2*d^3-6*b*c^2*d^3+31*c^3*d^3+30*a^2*d^4+12*a*b*d^4-17*b^2*d^4-7*a*c*d^4-45*b*c*d^4+10*c^2*d^4+29*a*d^5-28*b*d^5+34*c*d^5-15*d^6,a^6-33*a^3*d^3-45*a^2*b*d^3+19*a*b^2*d^3+39*b^3*d^3-5*a^2*c*d^3-46*a*b*c*d^3+9*b^2*c*d^3+15*a*c^2*d^3-21*b*c^2*d^3+46*c^3*d^3-39*a^2*d^4-9*a*b*d^4+50*b^2*d^4-45*a*c*d^4-39*b*c*d^4-18*c^2*d^4-4*a*d^5-19*b*d^5+12*c*d^5+39*d^6,d^7,c*d^6,b*d^6,a*d^6,c^2*d^5,b*c*d^5,a*c*d^5,b^2*d^5,a*b*d^5,a^2*d^5,c^3*d^4,b*c^2*d^4,a*c^2*d^4,b^2*c*d^4,a*b*c*d^4,a^2*c*d^4,b^3*d^4,a*b^2*d^4,a^2*b*d^4,a^3*d^4;
2392  M;
2393  TestSSresAttribs2tr(M);
2394
2395  // AGR@101n3d010s010%3, a bit slower...
2396  M = a^2*b^5-50*a*b^6-26*a^6*c+15*a^5*b*c-42*a^4*b^2*c-2*a^3*b^3*c+40*a^2*b^4*c-20*a*b^5*c+11*b^6*c-17*a^5*c^2-4*a^4*b*c^2+13*a^3*b^2*c^2-7*a^2*b^3*c^2+13*a*b^4*c^2-46*b^5*c^2+38*a^4*c^3+32*a^3*b*c^3-49*a^2*b^2*c^3-41*a*b^3*c^3+9*b^4*c^3+17*a^3*c^4-23*a^2*b*c^4+46*a*b^2*c^4+9*b^3*c^4-20*a^2*c^5-34*a*b*c^5-46*b^2*c^5-3*a*c^6+11*b*c^6-22*a^6*d-5*a^5*b*d-21*a^4*b^2*d-43*a^3*b^3*d-29*a^2*b^4*d+43*a*b^5*d-2*b^6*d+24*a^5*c*d-9*a^4*b*c*d+3*a^3*b^2*c*d+20*a^2*b^3*c*d+47*a*b^4*c*d-41*b^5*c*d+11*a^4*c^2*d-14*a^3*b*c^2*d+13*a^2*b^2*c^2*d-19*a*b^3*c^2*d-12*b^4*c^2*d+41*a^3*c^3*d-49*a^2*b*c^3*d-10*a*b^2*c^3*d+19*b^3*c^3*d-13*a^2*c^4*d+10*a*b*c^4*d-49*b^2*c^4*d-3*a*c^5*d-10*b*c^5*d+31*c^6*d-16*a^5*d^2+24*a^4*b*d^2-43*a^3*b^2*d^2+36*a^2*b^3*d^2-36*a^4*c*d^2-36*a^3*b*c*d^2-16*a^2*b^2*c*d^2+35*a*b^3*c*d^2+29*b^4*c*d^2+40*a^3*c^2*d^2-24*a^2*b*c^2*d^2-24*a*b^2*c^2*d^2+7*b^3*c^2*d^2+28*a^2*c^3*d^2+49*a*b*c^3*d^2+49*b^2*c^3*d^2+7*a*c^4*d^2-9*b*c^4*d^2+21*c^5*d^2-28*a^4*d^3+24*a^3*b*d^3-24*a^2*b^2*d^3+23*a*b^3*d^3+24*b^4*d^3+24*a^3*c*d^3-25*a^2*b*c*d^3-9*a*b^2*c*d^3-43*b^3*c*d^3+15*a^2*c^2*d^3+49*a*b*c^2*d^3+24*b^2*c^2*d^3-20*a*c^3*d^3-30*b*c^3*d^3-20*c^4*d^3+13*a^3*d^4+34*a^2*b*d^4-45*a*b^2*d^4+9*b^3*d^4+9*a^2*c*d^4-31*a*b*c*d^4-6*b^2*c*d^4-16*a*c^2*d^4+9*b*c^2*d^4+24*c^3*d^4+38*a^2*d^5-23*a*b*d^5-35*b^2*d^5+22*a*c*d^5-22*b*c*d^5+46*c^2*d^5+12*a*d^6+21*b*d^6-23*c*d^6-2*d^7,a^3*b^4+34*a^6*c+14*a^5*b*c+34*a^4*b^2*c+43*a^3*b^3*c-26*a^2*b^4*c+13*a*b^5*c+10*b^6*c-43*a^5*c^2+50*a^4*b*c^2-23*a^3*b^2*c^2-a^2*b^3*c^2+39*a*b^4*c^2+50*b^5*c^2+16*a^4*c^3+31*a^3*b*c^3-49*a^2*b^2*c^3+26*a*b^3*c^3-b^4*c^3-5*a^3*c^4+3*a^2*b*c^4-26*a*b^2*c^4-b^3*c^4-24*a^2*c^5-39*a*b*c^5+50*b^2*c^5-13*a*c^6+10*b*c^6-39*a^6*d+35*a^5*b*d+44*a^4*b^2*d-39*a^3*b^3*d-26*a^2*b^4*d-47*a*b^5*d-42*b^6*d+34*a^5*c*d-43*a^4*b*c*d-39*a^3*b^2*c*d+41*a^2*b^3*c*d+32*a*b^4*c*d-10*b^5*c*d+43*a^4*c^2*d+12*a^3*b*c^2*d-43*a^2*b^2*c^2*d+23*a*b^3*c^2*d-46*b^4*c^2*d+12*a^3*c^3*d-10*a^2*b*c^3*d+13*a*b^2*c^3*d-15*b^3*c^3*d-a^2*c^4*d+17*a*b*c^4*d-47*b^2*c^4*d+49*a*c^5*d-31*b*c^5*d-22*c^6*d-28*a^5*d^2-39*a^4*b*d^2+33*a^3*b^2*d^2-40*a^2*b^3*d^2+31*a*b^4*d^2+5*b^5*d^2+42*a^4*c*d^2-a^3*b*c*d^2+37*a^2*b^2*c*d^2-13*a*b^3*c*d^2+b^4*c*d^2+35*a^3*c^2*d^2-9*a^2*b*c^2*d^2+46*a*b^2*c^2*d^2-2*b^3*c^2*d^2+15*a^2*c^3*d^2-48*a*b*c^3*d^2+38*b^2*c^3*d^2-37*a*c^4*d^2-40*b*c^4*d^2+25*c^5*d^2+5*a^4*d^3-4*a^3*b*d^3+30*a^2*b^2*d^3-42*a*b^3*d^3+11*b^4*d^3+10*a^3*c*d^3+34*a^2*b*c*d^3-48*a*b^2*c*d^3+17*b^3*c*d^3-33*a^2*c^2*d^3-12*a*b*c^2*d^3-44*b^2*c^2*d^3-6*a*c^3*d^3+6*b*c^3*d^3-45*c^4*d^3+6*a^3*d^4+8*a^2*b*d^4-22*a*b^2*d^4+23*b^3*d^4-22*a^2*c*d^4-38*a*b*c*d^4+44*b^2*c*d^4-13*a*c^2*d^4-50*b*c^2*d^4+30*c^3*d^4-6*a^2*d^5-46*a*b*d^5+17*b^2*d^5-23*a*c*d^5-10*b*c*d^5+32*c^2*d^5-47*a*d^6+2*b*d^6+20*c*d^6-46*d^7,a^4*b^3+30*a*b^6-49*a^6*c+18*a^5*b*c+37*a^4*b^2*c+44*a^3*b^3*c-27*a^2*b^4*c-a*b^5*c-35*b^6*c-20*a^5*c^2+32*a^4*b*c^2+28*a^3*b^2*c^2-13*a^2*b^3*c^2-32*a*b^4*c^2+27*b^5*c^2-4*a^4*c^3+25*a^3*b*c^3+22*a^2*b^2*c^3-23*a*b^3*c^3-47*b^4*c^3+41*a^3*c^4-25*a^2*b*c^4-34*a*b^2*c^4-47*b^3*c^4-33*a^2*c^5-43*a*b*c^5+27*b^2*c^5-31*a*c^6-35*b*c^6-49*a^6*d+30*a^5*b*d-4*a^4*b^2*d+11*a^3*b^3*d-12*a^2*b^4*d-38*a*b^5*d+45*b^6*d+5*a^5*c*d-45*a^4*b*c*d-42*a^3*b^2*c*d-11*a^2*b^3*c*d+21*a*b^4*c*d+18*b^5*c*d-50*a^4*c^2*d-25*a^3*b*c^2*d+35*a^2*b^2*c^2*d-a*b^3*c^2*d+30*b^4*c^2*d+28*a^3*c^3*d-46*a^2*b*c^3*d-4*a*b^2*c^3*d+32*b^3*c^3*d+21*a^2*c^4*d-34*a*b*c^4*d+27*b^2*c^4*d+11*a*c^5*d-45*b*c^5*d+4*c^6*d+2*a^5*d^2-43*a^4*b*d^2-36*a^3*b^2*d^2+14*a^2*b^3*d^2+35*a*b^4*d^2+8*b^5*d^2+34*a^4*c*d^2-12*a^3*b*c*d^2-a^2*b^2*c*d^2-5*a*b^3*c*d^2+43*b^4*c*d^2+45*a^3*c^2*d^2-34*a^2*b*c^2*d^2+26*a*b^2*c^2*d^2+10*b^3*c^2*d^2-19*a^2*c^3*d^2+5*a*b*c^3*d^2-47*b^2*c^3*d^2+40*a*c^4*d^2+8*b*c^4*d^2+30*c^5*d^2+42*a^4*d^3+27*a^3*b*d^3+31*a^2*b^2*d^3-6*a*b^3*d^3+36*b^4*d^3+37*a^2*b*c*d^3+34*a*b^2*c*d^3-13*b^3*c*d^3+a^2*c^2*d^3+29*a*b*c^2*d^3-b^2*c^2*d^3-11*a*c^3*d^3-21*b*c^3*d^3+32*c^4*d^3+9*a^3*d^4-21*a^2*b*d^4+26*a*b^2*d^4+43*b^3*d^4-42*a^2*c*d^4-2*a*b*c*d^4-34*b^2*c*d^4+10*a*c^2*d^4-26*b*c^2*d^4-50*c^3*d^4+23*a^2*d^5+49*a*b*d^5+28*b^2*d^5-48*a*c*d^5-18*b*c*d^5-2*c^2*d^5-2*a*d^6-30*b*d^6+36*c*d^6-21*d^7,a^5*b^2+9*a*b^6+6*a^6*c+34*a^5*b*c-14*a^4*b^2*c-43*a^3*b^3*c-27*a^2*b^4*c+14*a*b^5*c+9*b^6*c-28*a^5*c^2-10*a^4*b*c^2+39*a^3*b^2*c^2-49*a^2*b^3*c^2-38*a*b^4*c^2+45*b^5*c^2+4*a^4*c^3+5*a^3*b*c^3+15*a^2*b^2*c^3-11*a*b^3*c^3-11*b^4*c^3+24*a^3*c^4-32*a^2*b*c^4-2*a*b^2*c^4-11*b^3*c^4+32*a^2*c^5-38*a*b*c^5+45*b^2*c^5-4*a*c^6+9*b*c^6+23*a^6*d-13*a^5*b*d+8*a^4*b^2*d-46*a^3*b^3*d-9*a^2*b^4*d-8*a*b^5*d+17*b^6*d+a^5*c*d+5*a^4*b*c*d-50*a^3*b^2*c*d+22*a^2*b^3*c*d-34*a*b^4*c*d-49*b^5*c*d+44*a^4*c^2*d+41*a^3*b*c^2*d-44*a^2*b^2*c^2*d-49*a*b^3*c^2*d+37*b^4*c^2*d+45*a^3*c^3*d+12*a^2*b*c^3*d-23*a*b^2*c^3*d-32*b^3*c^3*d-14*a^2*c^4*d+5*a*b*c^4*d+48*b^2*c^4*d+5*a*c^5*d-20*b*c^5*d-c^6*d+5*a^5*d^2-45*a^4*b*d^2+42*a^3*b^2*d^2+50*a^2*b^3*d^2-8*a*b^4*d^2-49*b^5*d^2-35*a^4*c*d^2-25*a^3*b*c*d^2-4*a^2*b^2*c*d^2-26*a*b^3*c*d^2-28*b^4*c*d^2+46*a^3*c^2*d^2+22*a^2*b*c^2*d^2+43*a*b^2*c^2*d^2-4*b^3*c^2*d^2-25*a^2*c^3*d^2+31*a*b*c^3*d^2-31*b^2*c^3*d^2-30*a*c^4*d^2-18*b*c^4*d^2-12*c^5*d^2-33*a^4*d^3-48*a^3*b*d^3-36*a^2*b^2*d^3-6*a*b^3*d^3+8*b^4*d^3+3*a^3*c*d^3-43*a^2*b*c*d^3+34*a*b^2*c*d^3+19*b^3*c*d^3+19*a^2*c^2*d^3-49*a*b*c^2*d^3-2*b^2*c^2*d^3+12*a*c^3*d^3-29*b*c^3*d^3-16*c^4*d^3+27*a^3*d^4+22*a^2*b*d^4+22*a*b^2*d^4-12*b^3*d^4+34*a^2*c*d^4+8*a*b*c*d^4+50*b^2*c*d^4+40*a*c^2*d^4+27*b*c^2*d^4-35*c^3*d^4-30*a^2*d^5+24*a*b*d^5+7*b^2*d^5+16*a*c*d^5+17*b*c*d^5-40*c^2*d^5-47*a*d^6-12*b*d^6+16*c*d^6+6*d^7,a^6*b-45*a*b^6-30*a^6*c-5*a^5*b*c-39*a^4*b^2*c-37*a^3*b^3*c+a^2*b^4*c-14*a*b^5*c-37*b^6*c+49*a^5*c^2+28*a^4*b*c^2+7*a^3*b^2*c^2-10*a^2*b^3*c^2+10*a*b^4*c^2+17*b^5*c^2-34*a^4*c^3+24*a^3*b*c^3-36*a^2*b^2*c^3-13*a*b^3*c^3+34*b^4*c^3-20*a^3*c^4-38*a^2*b*c^4+32*a*b^2*c^4+34*b^3*c^4-13*a^2*c^5+44*a*b*c^5+17*b^2*c^5+20*a*c^6-37*b*c^6+10*a^6*d+26*a^5*b*d+15*a^4*b^2*d+23*a^3*b^3*d+16*a^2*b^4*d+48*a*b^5*d-30*b^6*d-9*a^5*c*d-20*a^4*b*c*d+49*a^3*b^2*c*d-48*a^2*b^3*c*d-36*a*b^4*c*d-21*b^5*c*d+9*a^4*c^2*d-24*a^3*b*c^2*d+42*a^2*b^2*c^2*d+26*a*b^3*c^2*d-46*b^4*c^2*d-50*a^3*c^3*d-11*a^2*b*c^3*d-34*a*b^2*c^3*d+32*b^3*c^3*d-16*a^2*c^4*d-25*a*b*c^4*d+6*b^2*c^4*d+18*a*c^5*d-40*b*c^5*d+41*c^6*d-8*a^5*d^2-27*a^4*b*d^2-48*a^3*b^2*d^2-a^2*b^3*d^2+50*a*b^4*d^2+21*b^5*d^2-48*a^4*c*d^2+4*a^3*b*c*d^2-28*a^2*b^2*c*d^2-4*a*b^3*c*d^2+16*b^4*c*d^2+50*a^3*c^2*d^2+40*a^2*b*c^2*d^2+35*a*b^2*c^2*d^2+29*b^3*c^2*d^2-34*a^2*c^3*d^2-21*a*b*c^3*d^2-b^2*c^3*d^2-9*a*c^4*d^2-29*b*c^4*d^2+6*c^5*d^2+16*a^4*d^3-34*a^3*b*d^3+3*a^2*b^2*d^3+21*a*b^3*d^3+39*b^4*d^3+21*a^3*c*d^3-44*a^2*b*c*d^3-16*a*b^2*c*d^3+b^3*c*d^3-38*a^2*c^2*d^3+18*a*b*c^2*d^3+37*b^2*c^2*d^3-46*a*c^3*d^3+25*b*c^3*d^3-50*c^4*d^3-8*a^3*d^4-24*a^2*b*d^4-2*a*b^2*d^4+6*b^3*d^4+9*a^2*c*d^4+12*a*b*c*d^4+33*b^2*c*d^4-44*a*c^2*d^4+23*b*c^2*d^4-4*c^3*d^4-9*a^2*d^5-2*a*b*d^5-14*b^2*d^5+21*a*c*d^5-16*b*c*d^5-19*c^2*d^5+17*a*d^6-20*b*d^6+11*c*d^6-41*d^7,a^7-10*a*b^6-6*a^6*c-48*a^5*b*c-14*a^4*b^2*c-16*a^3*b^3*c-4*a^2*b^4*c+24*a*b^5*c-10*b^6*c-2*a^5*c^2+23*a^3*b^2*c^2+26*a^2*b^3*c^2+22*a*b^4*c^2-50*b^5*c^2+14*a^4*c^3-7*a^3*b*c^3+a^2*b^2*c^3-49*a*b^3*c^3+b^4*c^3-46*a^3*c^4+9*a^2*b*c^4+10*a*b^2*c^4+b^3*c^4+38*a^2*c^5-26*a*b*c^5-50*b^2*c^5+28*a*c^6-10*b*c^6-7*a^6*d+24*a^5*b*d-8*a^4*b^2*d+23*a^3*b^3*d+9*a^2*b^4*d+28*a*b^5*d-23*b^6*d-42*a^4*b*c*d+24*a^3*b^2*c*d-30*a^2*b^3*c*d-42*a*b^4*c*d-43*b^5*c*d-42*a^4*c^2*d+11*a^3*b*c^2*d+9*a^2*b^2*c^2*d-8*a*b^3*c^2*d+4*b^4*c^2*d+10*a^3*c^3*d+43*a^2*b*c^3*d+3*a*b^2*c^3*d-14*b^3*c^3*d-5*a^2*c^4*d+25*a*b*c^4*d-50*b^2*c^4*d-17*a*c^5*d+35*b*c^5*d+47*c^6*d-4*a^5*d^2-43*a^4*b*d^2+35*a^3*b^2*d^2+19*a^2*b^3*d^2+48*a*b^4*d^2+45*b^5*d^2+3*a^4*c*d^2-46*a^3*b*c*d^2+8*a^2*b^2*c*d^2-35*a*b^3*c*d^2-27*b^4*c*d^2-49*a^3*c^2*d^2+37*a^2*b*c^2*d^2-43*a*b^2*c^2*d^2+32*b^3*c^2*d^2+48*a^2*c^3*d^2+9*a*b*c^3*d^2+b^2*c^3*d^2-31*a*c^4*d^2-23*b*c^4*d^2-21*c^5*d^2+34*a^4*d^3+38*a^3*b*d^3+41*a^2*b^2*d^3-24*a*b^3*d^3+28*b^4*d^3+47*a^3*c*d^3-6*a^2*b*c*d^3+27*a*b^2*c*d^3-43*b^3*c*d^3-24*a^2*c^2*d^3-19*a*b*c^2*d^3-50*b^2*c^2*d^3+31*a*c^3*d^3+40*b*c^3*d^3+19*c^4*d^3+4*a^3*d^4-36*a^2*b*d^4+43*a*b^2*d^4+27*b^3*d^4+49*a^2*c*d^4-27*a*b*c*d^4-39*b^2*c*d^4+46*a*c^2*d^4+40*b*c^2*d^4+5*c^3*d^4-12*a^2*d^5-5*a*b*d^5+16*b^2*d^5-26*a*c*d^5-31*b*c*d^5-38*c^2*d^5+17*a*d^6-11*b*d^6-7*c*d^6-39*d^7,b*c*d^6-21*c^2*d^6+36*a*d^7-34*b*d^7-40*c*d^7-11*d^8,a*c*d^6-24*c^2*d^6+5*a*d^7-7*b*d^7+21*c*d^7-43*d^8,b^2*d^6+20*c^2*d^6+6*a*d^7-30*b*d^7+25*c*d^7+4*d^8,a*b*d^6+23*c^2*d^6-43*a*d^7+47*b*d^7+42*c*d^7+29*d^8,a^2*d^6+49*c^2*d^6+6*a*d^7-35*b*d^7+19*c*d^7-11*d^8,c^3*d^5-38*c^2*d^6+47*a*d^7+35*b*d^7+46*c*d^7+21*d^8,b*c^2*d^5+41*c^2*d^6-8*a*d^7+8*b*d^7+46*c*d^7+42*d^8,a*c^2*d^5+44*c^2*d^6+10*a*d^7-36*b*d^7-21*c*d^7+28*d^8,b^2*c*d^5+9*c^2*d^6+35*a*d^7+20*b*d^7+49*c*d^7-47*d^8,a*b*c*d^5+44*c^2*d^6+24*a*d^7-12*b*d^7+24*c*d^7-5*d^8,a^2*c*d^5-9*c^2*d^6-34*a*d^7+27*b*d^7-49*c*d^7+d^8,b^3*d^5+21*c^2*d^6-37*a*d^7-13*b*d^7-48*c*d^7+25*d^8,a*b^2*d^5+4*c^2*d^6-8*a*d^7-42*b*d^7-31*c*d^7+21*d^8,a^2*b*d^5+26*c^2*d^6-47*a*d^7-37*b*d^7+24*c*d^7+6*d^8,a^3*d^5-32*c^2*d^6-31*a*d^7+26*b*d^7-35*c*d^7-39*d^8,c^4*d^4+25*c^2*d^6+35*a*d^7+24*b*d^7+32*c*d^7-46*d^8,b*c^3*d^4+10*c^2*d^6-9*a*d^7-27*b*d^7-17*c*d^7+11*d^8,a*c^3*d^4-41*c^2*d^6+5*a*d^7-18*b*d^7-43*c*d^7-25*d^8,b^2*c^2*d^4-9*c^2*d^6+15*a*d^7-7*b*d^7-27*c*d^7-40*d^8,a*b*c^2*d^4-4*c^2*d^6+25*a*d^7-9*b*d^7-41*c*d^7-11*d^8,a^2*c^2*d^4+15*c^2*d^6-5*a*d^7-34*b*d^7-11*c*d^7-29*d^8,b^3*c*d^4+49*c^2*d^6-24*a*d^7-8*b*d^7+7*c*d^7-46*d^8,a*b^2*c*d^4-20*c^2*d^6-4*a*d^7+32*b*d^7-42*c*d^7-d^8,a^2*b*c*d^4+15*c^2*d^6+31*a*d^7+16*b*d^7-25*c*d^7+29*d^8,a^3*c*d^4-48*c^2*d^6-36*a*d^7-10*b*d^7+4*c*d^7+27*d^8,b^4*d^4+26*c^2*d^6-25*a*d^7-3*b*d^7-45*c*d^7-26*d^8,a*b^3*d^4+c^2*d^6-21*a*d^7-13*b*d^7-20*c*d^7+16*d^8,a^2*b^2*d^4+22*c^2*d^6-27*a*d^7-23*b*d^7-5*c*d^7-27*d^8,a^3*b*d^4+2*c^2*d^6-29*a*d^7-6*b*d^7+26*c*d^7-46*d^8,a^4*d^4-40*c^2*d^6-9*a*d^7-24*b*d^7+2*c*d^7-37*d^8,c^5*d^3+14*c^2*d^6+40*a*d^7+21*b*d^7+50*c*d^7+31*d^8,b*c^4*d^3-21*c^2*d^6-2*a*d^7-9*b*d^7-28*c*d^7+20*d^8,a*c^4*d^3-39*c^2*d^6+38*a*d^7-24*b*d^7-42*c*d^7-30*d^8,b^2*c^3*d^3+19*c^2*d^6-50*a*d^7-33*b*d^7+16*c*d^7-45*d^8,a*b*c^3*d^3-6*c^2*d^6-38*a*d^7+35*b*d^7+32*c*d^7-12*d^8,a^2*c^3*d^3+44*c^2*d^6+35*a*d^7+42*b*d^7-10*c*d^7-48*d^8,b^3*c^2*d^3+33*c^2*d^6-7*a*d^7-41*b*d^7-3*c*d^7-33*d^8,a*b^2*c^2*d^3-21*c^2*d^6-22*a*d^7-23*b*d^7+24*c*d^7+47*d^8,a^2*b*c^2*d^3+c^2*d^6-32*a*d^7-34*b*d^7-42*c*d^7+7*d^8,a^3*c^2*d^3+6*c^2*d^6-31*a*d^7-26*b*d^7+19*c*d^7-49*d^8,b^4*c*d^3+6*c^2*d^6-24*a*d^7+10*b*d^7-18*c*d^7-4*d^8,a*b^3*c*d^3+46*c^2*d^6+41*a*d^7+7*b*d^7+8*c*d^7-28*d^8,a^2*b^2*c*d^3+33*c^2*d^6-15*a*d^7-11*b*d^7+38*c*d^7+14*d^8,a^3*b*c*d^3-29*c^2*d^6-4*a*d^7-32*b*d^7+13*c*d^7-3*d^8,a^4*c*d^3-34*c^2*d^6+5*a*d^7+29*b*d^7-15*c*d^7-48*d^8,b^5*d^3-42*c^2*d^6+33*a*d^7-49*b*d^7+33*c*d^7-43*d^8,a*b^4*d^3+25*c^2*d^6-11*a*d^7-16*b*d^7+32*c*d^7-2*d^8,a^2*b^3*d^3-36*c^2*d^6-47*a*d^7-16*b*d^7+19*c*d^7+9*d^8,a^3*b^2*d^3-30*c^2*d^6-21*a*d^7-6*b*d^7+16*c*d^7-14*d^8,a^4*b*d^3+47*c^2*d^6-16*a*d^7-13*b*d^7+21*c*d^7+30*d^8,a^5*d^3-2*c^2*d^6+40*a*d^7+34*b*d^7+14*c*d^7-50*d^8,c^6*d^2-4*c^2*d^6-41*a*d^7+46*b*d^7+17*c*d^7+19*d^8,b*c^5*d^2-49*c^2*d^6+5*a*d^7-31*b*d^7+30*c*d^7+28*d^8,a*c^5*d^2-12*c^2*d^6-23*a*d^7-39*b*d^7+6*c*d^7-27*d^8,b^2*c^4*d^2-12*c^2*d^6-30*a*d^7+13*b*d^7-42*c*d^7+38*d^8,a*b*c^4*d^2-31*c^2*d^6+5*a*d^7-41*b*d^7-24*c*d^7,a^2*c^4*d^2-c^2*d^6+4*a*d^7+21*b*d^7+19*c*d^7-34*d^8,b^3*c^3*d^2-50*c^2*d^6-11*a*d^7+24*b*d^7+24*c*d^7-44*d^8,a*b^2*c^3*d^2+2*c^2*d^6-42*a*d^7-17*b*d^7-33*c*d^7-10*d^8,a^2*b*c^3*d^2+20*c^2*d^6+29*a*d^7+35*b*d^7-31*c*d^7-35*d^8,a^3*c^3*d^2+35*c^2*d^6-13*a*d^7+20*b*d^7-15*c*d^7-45*d^8,b^4*c^2*d^2+c^2*d^6+36*a*d^7-42*b*d^7+32*c*d^7+16*d^8,a*b^3*c^2*d^2-9*c^2*d^6-43*a*d^7-5*b*d^7-17*c*d^7+50*d^8,a^2*b^2*c^2*d^2-36*c^2*d^6+31*a*d^7+4*b*d^7-26*c*d^7-11*d^8,a^3*b*c^2*d^2+15*c^2*d^6+40*a*d^7-18*b*d^7-31*c*d^7+43*d^8,a^4*c^2*d^2+41*c^2*d^6-49*a*d^7+37*b*d^7+47*c*d^7-48*d^8,b^5*c*d^2-49*c^2*d^6+15*a*d^7+48*b*d^7+22*c*d^7+38*d^8,a*b^4*c*d^2+12*c^2*d^6+16*a*d^7-22*b*d^7-c*d^7+29*d^8,a^2*b^3*c*d^2+31*c^2*d^6+19*a*d^7+45*b*d^7-6*c*d^7+42*d^8,a^3*b^2*c*d^2+29*c^2*d^6-39*a*d^7+25*b*d^7-48*c*d^7-d^8,a^4*b*c*d^2-31*c^2*d^6+24*a*d^7-2*b*d^7+36*c*d^7+37*d^8,a^5*c*d^2+33*c^2*d^6-46*a*d^7-41*b*d^7-29*c*d^7-12*d^8,b^6*d^2-39*c^2*d^6+35*a*d^7-8*b*d^7+35*c*d^7+47*d^8,a*b^5*d^2-38*c^2*d^6-11*a*d^7-37*b*d^7-7*c*d^7-5*d^8,a^2*b^4*d^2+29*c^2*d^6+36*a*d^7-29*b*d^7+20*c*d^7+39*d^8,a^3*b^3*d^2-44*c^2*d^6+43*a*d^7-50*b*d^7-24*c*d^7-16*d^8,a^4*b^2*d^2+20*c^2*d^6+33*a*d^7+6*b*d^7+47*c*d^7+40*d^8,a^5*b*d^2-10*c^2*d^6+25*a*d^7-8*b*d^7-14*c*d^7+16*d^8,a^6*d^2+48*c^2*d^6+14*a*d^7+32*b*d^7+17*c*d^7+13*d^8,c^7*d+38*c^2*d^6-39*a*d^7+22*b*d^7+15*c*d^7-d^8,b*c^6*d+9*c^2*d^6+37*a*d^7+12*b*d^7+27*c*d^7+3*d^8,a*c^6*d-5*c^2*d^6+34*a*d^7+15*b*d^7+2*c*d^7-21*d^8,b^2*c^5*d+35*c^2*d^6+27*a*d^7+13*b*d^7-39*c*d^7+8*d^8,a*b*c^5*d-34*c^2*d^6-18*a*d^7-21*b*d^7-31*c*d^7+46*d^8,a^2*c^5*d-16*c^2*d^6-6*a*d^7-18*b*d^7+3*c*d^7+47*d^8,b^3*c^4*d-46*c^2*d^6+4*a*d^7-38*b*d^7-29*c*d^7-4*d^8,a*b^2*c^4*d-35*c^2*d^6-14*a*d^7-32*b*d^7-40*c*d^7-35*d^8,a^2*b*c^4*d+23*c^2*d^6-44*a*d^7-3*b*d^7+4*c*d^7-4*d^8,a^3*c^4*d+24*c^2*d^6-7*a*d^7-44*b*d^7-16*c*d^7+10*d^8,b^4*c^3*d+43*c^2*d^6+12*a*d^7+43*b*d^7-49*c*d^7-23*d^8,a*b^3*c^3*d+22*c^2*d^6+6*a*d^7+2*b*d^7-9*c*d^7,a^2*b^2*c^3*d+4*c^2*d^6+21*a*d^7-24*b*d^7-26*c*d^7+33*d^8,a^3*b*c^3*d+13*c^2*d^6-18*a*d^7+31*b*d^7-28*c*d^7+2*d^8,a^4*c^3*d+10*c^2*d^6-14*a*d^7+30*b*d^7-40*c*d^7+33*d^8,b^5*c^2*d-35*c^2*d^6-33*a*d^7+7*b*d^7+13*c*d^7+26*d^8,a*b^4*c^2*d-49*c^2*d^6+9*a*d^7+20*b*d^7+11*c*d^7-32*d^8,a^2*b^3*c^2*d+33*c^2*d^6-43*a*d^7-27*b*d^7-31*c*d^7-41*d^8,a^3*b^2*c^2*d-6*c^2*d^6+23*a*d^7+20*b*d^7-8*c*d^7-6*d^8,a^4*b*c^2*d+10*c^2*d^6-24*a*d^7+30*b*d^7+42*c*d^7-23*d^8,a^5*c^2*d+12*c^2*d^6+20*a*d^7+24*b*d^7-9*c*d^7-9*d^8,b^6*c*d-12*c^2*d^6+36*a*d^7+4*b*d^7-12*c*d^7+26*d^8,a*b^5*c*d-19*c^2*d^6-39*a*d^7-26*b*d^7-4*c*d^7+10*d^8,a^2*b^4*c*d+38*c^2*d^6-6*a*d^7+6*b*d^7+41*c*d^7+49*d^8,a^3*b^3*c*d-34*c^2*d^6-42*a*d^7+22*b*d^7-26*c*d^7-13*d^8,a^4*b^2*c*d+14*c^2*d^6+40*a*d^7+39*b*d^7-34*d^8,a^5*b*c*d-8*c^2*d^6+45*a*d^7-35*b*d^7+48*c*d^7+47*d^8,a^6*c*d-6*c^2*d^6-24*a*d^7-2*b*d^7-9*c*d^7+7*d^8,b^7*d+34*c^2*d^6-14*a*d^7+46*b*d^7-50*c*d^7+26*d^8,a*b^6*d+6*c^2*d^6+23*a*d^7-27*b*d^7-25*c*d^7-2*d^8,c^8+43*c^2*d^6+11*b*d^7-39*c*d^7-30*d^8,b*c^7-44*c^2*d^6-4*a*d^7-10*b*d^7+31*c*d^7+42*d^8,a*c^7-6*a*d^7+31*b*d^7+37*c*d^7-41*d^8,b^2*c^6-11*c^2*d^6-35*a*d^7+32*b*d^7-25*c*d^7-21*d^8,a*b*c^6+2*c^2*d^6+43*a*d^7-48*b*d^7-49*c*d^7-19*d^8,a^2*c^6-20*c^2*d^6-11*a*d^7-35*b*d^7-33*c*d^7+28*d^8,b^3*c^5+4*c^2*d^6-7*a*d^7-21*b*d^7-14*c*d^7+48*d^8,a*b^2*c^5+17*c^2*d^6+45*a*d^7-32*b*d^7+29*c*d^7+38*d^8,a^2*b*c^5-13*c^2*d^6+46*a*d^7+4*b*d^7-18*c*d^7+19*d^8,a^3*c^5-23*c^2*d^6-a*d^7-3*b*d^7-15*c*d^7+19*d^8,b^4*c^4-50*c^2*d^6+39*a*d^7+49*b*d^7+47*c*d^7+7*d^8,a*b^3*c^4-33*c^2*d^6+10*a*d^7+32*b*d^7+21*c*d^7-39*d^8,a^2*b^2*c^4+23*c^2*d^6+27*a*d^7-17*b*d^7+29*c*d^7+9*d^8,a^3*b*c^4-47*c^2*d^6-43*a*d^7-47*b*d^7-34*c*d^7-23*d^8,a^4*c^4-6*c^2*d^6+7*a*d^7+38*b*d^7-27*c*d^7-9*d^8,b^5*c^3-47*c^2*d^6+18*a*d^7-44*b*d^7-4*c*d^7-18*d^8,a*b^4*c^3+30*c^2*d^6+36*a*d^7+25*b*d^7+42*c*d^7+d^8,a^2*b^3*c^3+10*c^2*d^6+31*a*d^7+45*b*d^7-44*c*d^7+37*d^8,a^3*b^2*c^3-41*c^2*d^6-15*a*d^7-34*b*d^7-22*c*d^7+28*d^8,a^4*b*c^3+19*c^2*d^6-23*a*d^7+18*b*d^7-13*c*d^7-48*d^8,a^5*c^3+16*c^2*d^6+22*a*d^7-31*b*d^7+33*c*d^7+15*d^8,b^6*c^2-42*c^2*d^6-10*a*d^7-16*b*d^7-46*c*d^7+42*d^8,a*b^5*c^2-23*c^2*d^6+34*a*d^7-37*b*d^7+2*c*d^7+10*d^8,a^2*b^4*c^2-45*c^2*d^6-5*a*d^7+43*b*d^7-18*c*d^7+7*d^8,a^3*b^3*c^2+36*c^2*d^6+19*a*d^7+21*b*d^7+46*c*d^7-24*d^8,a^4*b^2*c^2-17*c^2*d^6+30*a*d^7-39*b*d^7-39*c*d^7-24*d^8,a^5*b*c^2+10*c^2*d^6-24*a*d^7-36*b*d^7-14*c*d^7+26*d^8,a^6*c^2+47*c^2*d^6-41*a*d^7+32*b*d^7+6*c*d^7+42*d^8,b^7*c+44*c^2*d^6-6*a*d^7+5*b*d^7+20*c*d^7+50*d^8,a*b^6*c+29*c^2*d^6-16*a*d^7+45*b*d^7-3*c*d^7+14*d^8,b^8+48*c^2*d^6-40*a*d^7-44*b*d^7-10*c*d^7-23*d^8,a*b^7-32*c^2*d^6-41*a*d^7-11*b*d^7+50*c*d^7+13*d^8,d^9,c*d^8,b*d^8,a*d^8,c^2*d^7;
2397  M;
2398  TestSSresAttribs2tr(M); 
2399
2400  kill AGR;
2401
2402  ring AGR = (101), (a,b,c,d,e,f,g,h), dp; AGR;
2403  // AGR@101n7d005s010%2) medium: <= 2
2404  ideal M = f*h-g*h,e*h-g*h,d*h-g*h,c*h-g*h,b*h-g*h,a*h-g*h,e*g+48*f*g-49*g*h,d*g+5*f*g-6*g*h,c*g+49*f*g-50*g*h,b*g-7*f*g+6*g*h,a*g-50*f*g+49*g*h,e*f-20*f*g+19*g*h,d*f+40*f*g-41*g*h,c*f-12*f*g+11*g*h,b*f+45*f*g-46*g*h,a*f+4*f*g-5*g*h,d*e-f*g,c*e-30*f*g+29*g*h,b*e-39*f*g+38*g*h,a*e+10*f*g-11*g*h,c*d-41*f*g+40*g*h,b*d-23*f*g+22*g*h,a*d-20*f*g+19*g*h,b*c+17*f*g-18*g*h,a*c+6*f*g-7*g*h,a*b+28*f*g-29*g*h,g^2*h-g*h^2,f^2*g-8*f*g^2+7*g*h^2,g*h^4+50*h^5,g^5+41*h^5,f*g^4-18*h^5,f^5+29*h^5,e^5+6*h^5,d^5-23*h^5,c^5-32*h^5,b^5+17*h^5,a^5+17*h^5,h^6;
2405  M;
2406  TestSSresAttribs2tr(M);
2407}
2408
2409// TODO: betti!!!
Note: See TracBrowser for help on using the repository browser.