source: git/Singular/LIB/schreyer.lib @ 9cf220

spielwiese
Last change on this file since 9cf220 was 9cf220, checked in by Oleksandr Motsak <motsak@…>, 12 years ago
more extensive testing of AGR examples
  • Property mode set to 100644
File size: 77.9 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 = !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: ";
915    SS;
916  }
917 
918  if( size(SS) > 0 )
919  {
920    attrib(SS, "isSB", 1);
921  }
922 
923  return (SS);
924}
925
926/// Compute Syz(L), where L is a monomial (leading) module
927proc SSCompute2LeadingSyzygyTerms(def L)
928{
929  if( typeof( attrib(basering, "DEBUG") ) == "int" )
930  {
931    int @DEBUG = attrib(basering, "DEBUG");
932  } else
933  {
934    int @DEBUG = !system("with", "ndebug");
935  }
936
937  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
938  {
939    int @SYZCHECK = attrib(basering, "SYZCHECK");
940  } else
941  {
942    int @SYZCHECK = @DEBUG;
943  }
944
945  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
946  {
947    int @KERCHECK = attrib(basering, "KERCHECK");
948  } else
949  {
950    int @KERCHECK = @DEBUG;
951  }
952
953  if( @DEBUG )
954  {
955    "SSCompute2LeadingSyzygyTerms::Input: ";
956    L;
957  }
958
959  module SS = Compute2LeadingSyzygyTerms(L);
960
961  if( @DEBUG )
962  {
963    "SSCompute2LeadingSyzygyTerms::Syz(SS): "; SS;
964  }
965 
966  if( @SYZCHECK )
967  {
968    if( size(SS) > 0 and size(L) > 0 )
969    {
970      if( size(module(transpose( transpose(SS) * transpose(L) ))) > 0 )
971      {
972        transpose( transpose(SS) * transpose(L) );
973        "ERROR: transpose( transpose(SS) * transpose(L) ) != 0!!!";
974        $
975      }
976    }
977  }
978   
979  if( @KERCHECK )
980  {
981    int @TAILREDSYZ = 1;
982    if( typeof( attrib(basering, "TAILREDSYZ") ) == "int" )
983    {
984      @TAILREDSYZ = attrib(basering, "TAILREDSYZ");
985    }
986
987    int i, j, r;
988    int N = ncols(L);
989    def a, b;
990
991    poly aa, bb, @lcm;
992
993    bigint c;
994
995    module M;
996
997    module S = 0;
998
999    for(i = 1; i <= N; i++)
1000    {
1001      a = L[i];
1002  //    "a: ", a;
1003      c = leadcomp(a);
1004      r = int(c);
1005
1006      aa = leadmonomial(a);
1007
1008      M = 0;
1009
1010      for(j = i-1; j > 0; j--)
1011      {
1012        b = L[j];
1013  //      "b: ", b;
1014
1015        if( leadcomp(b) == c )
1016        {
1017          bb = leadmonomial(b);
1018          @lcm = lcm(aa, bb);
1019
1020          M[j] = (@lcm / aa)* gen(i) - (@lcm / bb)* gen(j);
1021        }
1022      }
1023
1024      M = simplify(M, 2);
1025
1026      // TODO: add quotient relations here...
1027      S = S, M;
1028    }
1029
1030    if( @TAILREDSYZ )
1031    {
1032      // Make sure that 2nd syzygy terms are not reducible by 1st
1033      def opts = option(get);
1034      option(redSB); option(redTail);
1035      S = std(S); // binomial module
1036      option(set, opts);
1037      //  kill opts;
1038    } else
1039    {
1040      S = simplify(S, 2 + 32);
1041    }
1042
1043    S = MySort(S);
1044
1045    if( @DEBUG )
1046    {
1047      "SSCompute2LeadingSyzygyTerms::Syz(S): "; S;
1048    }
1049
1050    if( size(module(matrix(S) - matrix(SS))) > 0 )
1051    {
1052      "ERROR: SSCompute2LeadingSyzygyTerms: S != SS ";
1053
1054      "basering: ";
1055      DetailedPrint(basering);
1056
1057      "S: ";  S;
1058      DetailedPrint(S, 2);
1059      "SS: "; SS;
1060      DetailedPrint(SS, 2);
1061
1062      "DIFF: ";
1063      print(matrix(S) - matrix(SS));
1064      DetailedPrint(module(matrix(S) - matrix(SS)), 4);
1065      $
1066    }
1067  }
1068 
1069  module S2 = Tail(SS);
1070  SS = lead(SS); // (C,lp) on base ring!
1071             
1072  if( @DEBUG )
1073  {
1074    "SSCompute2LeadingSyzygyTerms::Output: "; SS; S2;
1075  } 
1076 
1077  attrib(SS, "isSB", 1);
1078
1079  return (SS, S2);
1080}
1081
1082// -------------------------------------------------------- //
1083
1084/// TODO: save shortcut (syz: |-.->) LM(LM(m) * "t") -> syz?
1085proc SSFindReducer(def product, def syzterm, def L, list #)
1086{
1087  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1088  {
1089    int @DEBUG = attrib(basering, "DEBUG");
1090  } else
1091  {
1092    int @DEBUG = !system("with", "ndebug");
1093  }
1094
1095  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
1096  {
1097    int @SYZCHECK = attrib(basering, "SYZCHECK");
1098  } else
1099  {
1100    int @SYZCHECK = @DEBUG;
1101  }
1102
1103  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
1104  {
1105    int @KERCHECK = attrib(basering, "KERCHECK");
1106  } else
1107  {
1108    int @KERCHECK = @DEBUG;
1109  }
1110
1111
1112  if( @DEBUG )
1113  {
1114    "SSFindReducer::Input: ";
1115
1116    "syzterm: ", syzterm;
1117    "product: ", product;
1118    "L: ", L;
1119//    "T: ", T;
1120    if( size(#) > 0 )
1121    {
1122      "LSyz: ", #;
1123    }
1124  }
1125
1126
1127  if( @DEBUG && (syzterm != 0) )
1128  {
1129    def @@c = leadcomp(syzterm); int @@r = int(@@c);
1130    def @@product = leadmonomial(syzterm) * L[@@r];
1131
1132    if( @@product != product)
1133    {
1134      "product: ", product, ", @@product: ", @@product;
1135      "ERROR: 'syzterm' results in wrong product !!!???";
1136      $
1137    }
1138  }
1139
1140  if( typeof(#[1]) == "module" )
1141  {
1142    vector my = FindReducer(product, syzterm, L/*, T*/, #[1]);
1143  } else
1144  {
1145    vector my = FindReducer(product, syzterm, L/*, T*/);
1146  }
1147 
1148
1149  if( @KERCHECK )
1150  {
1151    bigint c = leadcomp(product); int r = int(c);
1152
1153    def a, b, bb;
1154
1155    vector nf = [0];
1156
1157    // looking for an appropriate diviser
1158    for( int k = ncols(L); k > 0; k-- )
1159    {
1160      a = L[k];
1161      // with the same mod. component
1162      if( leadcomp(a) == c )
1163      {
1164        b = - (leadmonomial(product) / leadmonomial(L[k]));
1165
1166        // which divides the product: looking for the 1st appropriate one!
1167        if( b != 0 )
1168        {
1169          bb = b * gen(k);
1170
1171          if (size(bb + syzterm) == 0) // cannot allow something like: a*gen(i) - a*gen(i)
1172          {
1173            nf = [0];
1174          } else
1175          {
1176            nf = bb;
1177          }
1178
1179          // new syz. term should not be in <LS = #>
1180          if( size(#) > 0 )
1181          {
1182            if( typeof(#[1]) == "module" )
1183            {
1184              nf = NF(bb, #[1]);
1185            }
1186          }
1187
1188          // while the complement (the fraction) is not reducible by leading syzygies
1189          if( nf != 0 ) // nf must be == bb!!!
1190          {
1191            /// TODO: save shortcut LM(m) * T[i] -> ?
1192
1193            // choose ANY such reduction... (with the biggest index?)
1194            break;
1195          }
1196        }
1197      }
1198    }
1199
1200    if( my != nf )
1201    {
1202      "ERROR in FindReducer => ", my, " != nf: ", nf;
1203      $;
1204    }
1205  }
1206
1207  if( @DEBUG )
1208  {
1209    "SSFindReducer::Output: ", my;
1210  }
1211 
1212  return (my);
1213}
1214
1215/// TODO: save shortcut (syz: |-.->) LM(m) * "t" -> ?
1216proc SSReduceTerm(poly m, def t, def syzterm, def L, def T, list #)
1217{
1218  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1219  {
1220    int @DEBUG = attrib(basering, "DEBUG");
1221  } else
1222  {
1223    int @DEBUG = !system("with", "ndebug");
1224  }
1225
1226
1227  if( @DEBUG )
1228  {
1229    "SSReduce::Input: ";
1230
1231    "syzterm: ", syzterm;
1232    "mult: ", m;
1233    "term: ", t;
1234    "L: ", L;
1235    "T: ", T;
1236    if( size(#) > 0 )
1237    {
1238      "LSyz: ", #;
1239    }
1240//    "attrib(LS, 'isSB')", attrib(LS, "isSB");
1241  }
1242
1243  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
1244  {
1245    int @KERCHECK = attrib(basering, "KERCHECK");
1246  } else
1247  {
1248    int @KERCHECK = @DEBUG;
1249  }
1250 
1251  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
1252  {
1253    int @SYZCHECK = attrib(basering, "SYZCHECK");
1254  } else
1255  {
1256    int @SYZCHECK = @DEBUG;
1257  }
1258
1259  if( @SYZCHECK && (syzterm != 0) )
1260  {
1261    def @@c = leadcomp(syzterm); int @@r = int(@@c);
1262    poly @@m = leadmonomial(syzterm); def @@t = L[@@r];
1263
1264    if( (@@m != m) || (@@t != t))
1265    {
1266      "m: ", m, ", t: ", t;
1267      "@@m: ", @@m, ", @@t: ", @@t;
1268      "ERROR: 'syzterm' results in wrong m * t !!!";
1269      $
1270    }
1271  }
1272
1273  if( typeof(#[1]) == "module" )
1274  {
1275    vector ss = ReduceTerm(m, t, syzterm, L, T, #[1]);
1276  } else
1277  {
1278    vector ss = ReduceTerm(m, t, syzterm, L, T);
1279  }
1280
1281  if( @KERCHECK )
1282  {
1283    vector s = 0;
1284
1285    if( size(t) > 0 )
1286    {
1287      def product = m * t;
1288
1289      s = SSFindReducer(product, syzterm, L, #);
1290
1291      if( size(s) != 0 )
1292      {
1293        poly @b = leadmonomial(s);
1294
1295        def @c = leadcomp(s); int k = int(@c);
1296
1297        s = s + SSTraverseTail(@b, T[k], L, T, #); // !!!   
1298      }
1299    }
1300   
1301    if( s != ss )
1302    {
1303      "ERROR in ReduceTerm => old: ", s, " != ker: ", ss;
1304      "m: ", m;
1305      "t: ", t;
1306      "syzterm: ", syzterm;
1307      L; T; #;
1308      $;
1309    } 
1310  }
1311
1312  if( @DEBUG )
1313  {
1314    "SSReduceTerm::Output: ", ss;
1315  }
1316 
1317  return (ss);
1318}
1319
1320
1321// TODO: store m * @tail -.-^-.-^-.--> ?
1322proc SSTraverseTail(poly m, def @tail, def L, def T, list #)
1323{
1324  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1325  {
1326    int @DEBUG = attrib(basering, "DEBUG");
1327  } else
1328  {
1329    int @DEBUG = !system("with", "ndebug");
1330  }
1331
1332  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
1333  {
1334    int @KERCHECK = attrib(basering, "KERCHECK");
1335  } else
1336  {
1337    int @KERCHECK = @DEBUG;
1338  }
1339 
1340
1341  if( @DEBUG )
1342  {
1343    "SSTraverse::Input: ";
1344
1345    "mult: ", m;
1346    "tail: ", @tail; // T[i];
1347
1348    if( size(#) > 0 )
1349    {
1350      "LSyz: "; #[1];
1351    }
1352  }
1353
1354  if( typeof(#[1]) == "module" )
1355  {
1356    vector ss = TraverseTail(m, @tail, L, T, #[1]);
1357  } else
1358  {
1359    vector ss = TraverseTail(m, @tail, L, T);
1360  }
1361
1362  if( @KERCHECK )
1363  {
1364    vector s = 0;
1365
1366    def @l, @p;
1367    @p = @tail;
1368
1369  // iterate tail-terms in ANY order!
1370    while( size(@p) > 0 )
1371    {
1372      @l = lead(@p);
1373      s = s + SSReduceTerm(m, @l, [0], L, T, #); // :(
1374      @p = @p - @l;
1375    }
1376   
1377    if( s != ss )
1378    {
1379      "ERROR in TraverseTail => old: ", s, " != ker: ", ss;
1380      "m: ", m;
1381      "@tail: ", @tail;
1382      L; T; #;
1383      $;
1384    } 
1385  }
1386
1387  if( @DEBUG )
1388  {
1389    "SSTraverseTail::Output: ", ss;
1390  }
1391 
1392  return (ss);
1393}
1394
1395// -------------------------------------------------------- //
1396
1397proc SSSchreyerSyzygyNF(vector syz_lead, vector syz_2, def L, def T, list #)
1398"
1399   Hybrid Syzygy computation: 'reduce' spoly by eliminating _any_ terms
1400   while discurding terms of lower order!
1401
1402   Return the tail syzygy (without: syz_lead, starting with: syz_2)
1403"
1404{
1405  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1406  {
1407    int @DEBUG = attrib(basering, "DEBUG");
1408  } else
1409  {
1410    int @DEBUG = !system("with", "ndebug");
1411  }
1412
1413  if( @DEBUG )
1414  {
1415    "SSSchreyerSyzygyNF::Input: ";
1416
1417    "syzygy_lead: ", syz_lead;
1418    "syzygy 2nd : ", syz_2;
1419    L; T;
1420    if( size(#) > 0 )
1421    {
1422      "LSyz: "; #[1];
1423    }
1424  }
1425
1426  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
1427  {
1428    int @KERCHECK = attrib(basering, "KERCHECK");
1429  } else
1430  {
1431    int @KERCHECK = @DEBUG;
1432  }
1433
1434  if( typeof(#[1]) == "module" )
1435  {
1436    def my = SchreyerSyzygyNF(syz_lead, syz_2, L, T, #[1]);
1437  } else
1438  {
1439    def my = SchreyerSyzygyNF(syz_lead, syz_2, L, T);
1440  }
1441
1442  if( @KERCHECK )
1443  {
1444    def spoly = leadmonomial(syz_lead) * T[int(leadcomp(syz_lead))]
1445              + leadmonomial(syz_2)    * T[int(leadcomp(syz_2))];
1446
1447    vector @tail = syz_2;
1448
1449    while (size(spoly) > 0)
1450    {
1451      syz_2 = SSFindReducer(lead(spoly), 0, L, #); spoly = Tail(spoly);
1452
1453      if( size(syz_2) != 0)
1454      {         
1455        spoly = spoly + leadmonomial(syz_2) * T[int(leadcomp(syz_2))];
1456        @tail = @tail + syz_2;
1457      }
1458    }
1459   
1460    if( my != @tail )
1461    {
1462      "ERROR in SchreyerSyzygyNF => old: ", @tail, " != ker: ", my;
1463     
1464      "syzygy_lead: ", syz_lead;
1465      "syzygy 2nd : ", syz_2;
1466     
1467      L; T; #;
1468      $;
1469    }
1470  }
1471
1472  if( @DEBUG )
1473  {
1474    "SSSchreyerSyzygyNF::Output: ", my;
1475  }
1476 
1477  return (my);
1478}
1479
1480
1481
1482// -------------------------------------------------------- //
1483
1484// module (N, LL, TT) = SSComputeSyzygy(L, T);
1485// Compute Syz(L ++ T) = N = LL ++ TT
1486proc SSComputeSyzygy(def L, def T)
1487{
1488  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1489  {
1490    int @DEBUG = attrib(basering, "DEBUG");
1491  } else
1492  {
1493    int @DEBUG = !system("with", "ndebug");
1494  }
1495
1496  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
1497  {
1498    int @SYZCHECK = attrib(basering, "SYZCHECK");
1499  } else
1500  {
1501    int @SYZCHECK = @DEBUG;
1502  }
1503 
1504 
1505  if( @DEBUG )
1506  {
1507    "SSComputeSyzygy::Input";
1508    "basering: ", basering; attrib(basering);
1509//    DetailedPrint(basering);
1510
1511//    "iCompShift: ", iCompShift;
1512
1513    "L: "; L;
1514    "T: "; T;
1515  }
1516
1517  def a; bigint c; int r, k; poly aa;
1518
1519  int @LEAD2SYZ = 0;
1520  if( typeof( attrib(basering, "LEAD2SYZ") ) == "int" )
1521  {
1522    @LEAD2SYZ = attrib(basering, "LEAD2SYZ");
1523  }
1524
1525  int @TAILREDSYZ = 1;
1526  if( typeof( attrib(basering, "TAILREDSYZ") ) == "int" )
1527  {
1528    @TAILREDSYZ = attrib(basering, "TAILREDSYZ");
1529  }
1530
1531  int @HYBRIDNF = 0;
1532  if( typeof( attrib(basering, "HYBRIDNF") ) == "int" )
1533  {
1534    @HYBRIDNF = attrib(basering, "HYBRIDNF");
1535  }
1536
1537  module LL;
1538  def a2; int r2; poly aa2; 
1539
1540  /// Get the critical leading syzygy terms
1541  if( @LEAD2SYZ ) // & 2nd syz. term
1542  {
1543    module LL2;
1544    (LL, LL2) = SSCompute2LeadingSyzygyTerms(L); // ++
1545  } else
1546  {
1547    LL = SSComputeLeadingSyzygyTerms(L);
1548  }
1549
1550  module TT, SYZ; def spoly;
1551
1552  if( size(LL) > 0 )
1553  {
1554    list LS;
1555
1556    if( @TAILREDSYZ)
1557    {
1558      LS = list(LL);
1559    }
1560
1561    vector @tail;
1562
1563    for(k = ncols(LL); k > 0; k-- )
1564    {
1565      // leading syz. term:
1566      a = LL[k]; c = leadcomp(a); r = int(c); aa = leadmonomial(a);
1567      //    "A: ", a, " --->>>> ", aa, " **** [", r, "]: ";
1568
1569      // NF reduction:
1570      if( !@HYBRIDNF )
1571      {
1572        /// TODO: save shortcut (aa) * T[r] -> ?
1573        @tail = SSTraverseTail(aa, T[r], L, T, LS);
1574  // //      @tail = SSTraverseTail(a, L, T, LS);
1575
1576        // get the 2nd syzygy term...
1577
1578        if( @LEAD2SYZ ) // with the 2nd syz. term:
1579        {     
1580          a2 = LL2[k]; c = leadcomp(a2); r2 = int(c); aa2 = leadmonomial(a2);
1581
1582          @tail = @tail + a2 +
1583               /// TODO: save shortcut (aa2) * T[r2] -> ?
1584               SSTraverseTail(aa2, T[r2], L, T, LS);
1585  // //               SSTraverseTail(a2, L, T, LS);
1586        } else
1587        {
1588          @tail = @tail +
1589                  SSReduceTerm(aa, L[r], a, L, T, LS);
1590  // //                  SSReduceTerm(a, L, T, LS);
1591        }
1592      } else
1593      {
1594        if( @LEAD2SYZ )
1595        {
1596          a2 = LL2[k];
1597        } else
1598        {
1599          a2 = SSFindReducer( aa * L[r], a, L, LS);
1600        }
1601
1602        if ( (@SYZCHECK || @DEBUG) )
1603        {
1604          if( size(a2) == 0 ) // if syzterm == 0!!!!
1605          {
1606            "ERROR: could not find the 2nd syzygy term during the hybrid NF!!!";
1607            $
1608          }
1609        }
1610
1611        @tail = SSSchreyerSyzygyNF(a, a2, L, T, LS);
1612      }
1613     
1614      TT[k] = @tail;
1615      SYZ[k] = a + @tail;
1616    }
1617  }
1618
1619  if( @DEBUG )
1620  {
1621    "SSComputeSyzygy::Output";
1622
1623    "SYZ: "; SYZ;
1624    "LL: "; LL;
1625    "TT: "; TT;
1626  }
1627
1628  return (SYZ, LL, TT);
1629}
1630
1631// resolution/syzygy step:
1632static proc SSstep()
1633{
1634  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1635  {
1636    int @DEBUG = attrib(basering, "DEBUG");
1637  } else
1638  {
1639    int @DEBUG = !system("with", "ndebug");
1640  }
1641
1642
1643  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
1644  {
1645    int @SYZCHECK = attrib(basering, "SYZCHECK");
1646  } else
1647  {
1648    int @SYZCHECK = @DEBUG;
1649  }
1650
1651  if( @DEBUG )
1652  {
1653    "SSstep::NextInducedRing";
1654    "basering: ", basering; attrib(basering);
1655  }
1656
1657/*
1658  // is initial weights are all zeroes!
1659  def L =  lead(M);
1660  intvec @V = deg(M[1..ncols(M)]);  @W;  @V;  @W = @V;  attrib(L, "isHomog", @W); 
1661  SetInducedReferrence(L, @RANK, 0);
1662*/
1663
1664//  def L =  lead(MRES);
1665//  @W = @W, @V;
1666//  attrib(L, "isHomog", @W); 
1667
1668
1669  // General setting:
1670//  SetInducedReferrence(MRES, 0, 0); // limit: 0!
1671  int @l = size(RES);
1672
1673  def M =  RES[@l];
1674
1675  def L = LRES[@l];
1676  def T = TRES[@l];
1677
1678
1679  //// TODO: wrong !!!!!
1680  int @RANK = ncols(MRES) - ncols(M); // nrows(M); // what if M is zero?!
1681
1682 
1683
1684/*
1685  if( @RANK !=  nrows(M) )
1686  {
1687    type(MRES);
1688    @RANK;
1689    type(M);
1690    pause();
1691  }
1692*/
1693 
1694  intvec @W = attrib(M, "isHomog"); intvec @V = attrib(M, "degrees"); @V = @W, @V;
1695   
1696  if( @DEBUG )
1697  {
1698    "Sstep::NextInput: ";
1699    M;
1700    L;
1701    @V;
1702    @RANK;
1703//    DetailedPrint(MRES);
1704    attrib(MRES, "isHomog");
1705  }
1706
1707     
1708  // TODO: N  = SYZ( M )!!!
1709  module N, LL, TT;
1710  (N, LL, TT) = SSComputeSyzygy(/*M, */L, T/*, @RANK*/);
1711
1712  // shift syz.comp by @RANK:
1713  module Z;
1714  Z = 0; Z[@RANK] = 0; Z = Z, transpose(LL);   LL = transpose(Z);
1715  Z = 0; Z[@RANK] = 0; Z = Z, transpose(TT);   TT = transpose(Z);
1716  Z = 0; Z[@RANK] = 0; Z = Z, transpose(N);     N = transpose(Z);
1717
1718
1719  if( @SYZCHECK )
1720  {
1721    if( size(N) > 0 )
1722    {
1723      // next syz. property
1724      if( size(module(transpose( transpose(N) * transpose(MRES) ))) > 0 )
1725      {
1726        "MRES", MRES;
1727
1728        "N: "; N; // DetailedPrint(N, 2);
1729
1730        "LL:"; LL; // DetailedPrint(LL, 1);
1731        "TT:"; TT; // DetailedPrint(TT, 10);
1732
1733        "RANKS: ", @RANK;
1734
1735        "transpose( transpose(N) * transpose(MRES) ) != 0!!!";
1736        transpose( transpose(N) * transpose(MRES) );
1737
1738        "transpose(N) * transpose(MRES): ";
1739        transpose(N) * transpose(MRES);
1740        // DetailedPrint(module(_), 2);
1741        $
1742      }
1743    }
1744  }
1745
1746  attrib(N, "isHomog", @V);
1747
1748  // TODO: correct the following:
1749  intvec @DEGS = deg(N[1..ncols(N)]); // no mod. comp. weights :(
1750
1751 
1752  attrib(N, "degrees", @DEGS);
1753 
1754   RES[@l + 1] = N; // list of all syzygy modules
1755  LRES[@l + 1] = LL; // list of all syzygy modules
1756  TRES[@l + 1] = TT; // list of all syzygy modules
1757
1758  MRES = MRES, N;
1759 
1760  attrib(MRES, "isHomog", @V);
1761
1762//  L = L, lead(N);  attrib(basering, "InducionLeads", L);
1763
1764  if( @DEBUG )
1765  {
1766    "SSstep::NextSyzOutput: ";
1767    N;
1768//    DetailedPrint(N);
1769    attrib(N);
1770  }
1771
1772}
1773
1774proc SScontinue(int l)
1775"USAGE:  SScontinue(l)
1776RETURN:  nothing, instead it changes RES and MRES variables in the current ring
1777PURPOSE: computes further (at most l) syzygies
1778NOTE:    must be used within a ring returned by Sres or Ssyz. RES and MRES are
1779         explained in Sres
1780EXAMPLE: example Scontinue; shows an example
1781"
1782{
1783
1784  /// TODO!
1785//  def data = GetInducedData();
1786
1787  if( (!defined(RES)) || (!defined(MRES)) ) /* || (typeof(data) != "list") || (size(data) != 2) */
1788  {
1789    ERROR("Sorry, but basering does not seem to be returned by Sres or Ssyz");
1790  }
1791  for (;  (l != 0) && (size(RES[size(RES)]) > 0); l-- )
1792  {
1793    SSstep();
1794  }
1795}
1796example
1797{ "EXAMPLE:"; echo = 2;
1798  ring r;
1799  module M = maxideal(1); M;
1800  def S = SSsyz(M); setring S; S;
1801  "Only the first syzygy: ";
1802  RES; MRES;
1803  "More syzygies: ";
1804  SScontinue(10);
1805  RES; MRES;
1806}
1807
1808proc SSsyz(def M)
1809"USAGE:  SSsyz(M)
1810RETURN:  ring, containing a list of modules RES and a module MRES
1811PURPOSE: computes the first syzygy module of M (wrt some Schreyer ordering)?
1812NOTE:    The output is explained in Sres
1813EXAMPLE: example Ssyz; shows an example
1814"
1815{
1816  if( (typeof(M) != "module") && (typeof(M) != "ideal") )
1817  {
1818    ERROR("Sorry: need an ideal or a module for input");
1819  }
1820
1821  def SS = SSinit(M); setring SS;
1822 
1823  SSstep(); // NOTE: what if M is zero?
1824
1825  return (SS);
1826}
1827example
1828{ "EXAMPLE:"; echo = 2;
1829  ring r;
1830
1831/*  ideal M = 0;
1832  def S = SSsyz(M); setring S; S;
1833  "Only the first syzygy: ";
1834  RES; LRES; TRES;
1835  MRES;
1836 
1837  kill S; setring r; kill M;
1838*/ 
1839
1840  ideal M = maxideal(1); M;
1841
1842  def S = SSres(M, 0); setring S; S;
1843  MRES;
1844  print(_);
1845  RES;
1846
1847  kill S; setring r; kill M;
1848
1849  kill r;
1850 
1851  ring R = 0, (w, x, y, z), dp;
1852  ideal M = w^2 - x*z,  w*x - y*z,  x^2 - w*y, x*y - z^2, y^2 - w*z;
1853 
1854  def S = SSres(M, 0); setring S; S;
1855  "";
1856  LRES;
1857  "";
1858  TRES;
1859  "";
1860  MRES;
1861  print(_);
1862  RES;
1863}
1864
1865proc SSres(def M, int l)
1866"USAGE:  SSres(I, l)
1867RETURN:  ring, containing a list of modules RES and a module MRES
1868PURPOSE: computes (at most l) syzygy modules of M wrt the classical Schreyer
1869         induced ordering with gen(i) > gen(j) if i > j, provided both gens
1870         are from the same syzygy level.???
1871NOTE:    RES contains the images of maps subsituting the beginning of the
1872         Schreyer free resolution of baseRing^r/M, while MRES is a sum of
1873         these images in a big free sum, containing all the syzygy modules.
1874         The syzygy modules are shifted so that gen(i) correspons to MRES[i].
1875         The leading zero module RES[0] indicates the fact that coker of the
1876         first map is zero. The number of zeroes inducates the rank of input.
1877NOTE:    If l == 0 then l is set to be nvars(basering) + 1
1878EXAMPLE: example SSres; shows an example
1879"
1880{
1881  if( (typeof(M) != "module") && (typeof(M) != "ideal") )
1882  {
1883    ERROR("Sorry: need an ideal or a module for input");
1884  }
1885
1886  def SS = SSinit(M); setring SS;
1887
1888  if (l == 0)
1889  {
1890    l = nvars(basering) + 1; // not really an estimate...?!
1891  }
1892
1893  SSstep(); l = l - 1;
1894
1895  SScontinue(l);
1896
1897  return (SS);
1898}
1899example
1900{ "EXAMPLE:"; echo = 2;
1901  ring r;
1902  module M = maxideal(1); M;
1903  def S = SSres(M, 0); setring S; S;
1904  RES;
1905  MRES;
1906  kill S;
1907  setring r; kill M;
1908
1909  def A = nc_algebra(-1,0); setring A;
1910  ideal Q = var(1)^2, var(2)^2, var(3)^2;
1911  qring SCA = twostd(Q);
1912  basering;
1913
1914  module M = maxideal(1);
1915  def S = SSres(M, 2); setring S; S;
1916  RES;
1917  MRES;
1918}
1919
1920
1921
1922static proc loadme()
1923{
1924  int @DEBUG = !system("with", "ndebug");
1925
1926  if( @DEBUG )
1927  {
1928   
1929    "ndebug?: ", system("with", "ndebug");
1930    "om_ndebug?: ", system("with", "om_ndebug");
1931
1932    listvar(Top);
1933    listvar(Schreyer);
1934  }
1935//  listvar(Syzextra); listvar(Syzextra_g);
1936
1937  if( !defined(DetailedPrint) )
1938  {
1939    if( 1 )
1940    {
1941
1942      if( @DEBUG )
1943      {
1944        "Loading the Release version!";
1945      }
1946      load("syzextra.so");
1947
1948      if( @DEBUG )
1949      {
1950        listvar(Syzextra);
1951      }
1952
1953      exportto(Top, Syzextra::ClearContent);
1954      exportto(Top, Syzextra::ClearDenominators);
1955
1956      exportto(Schreyer, Syzextra::m2_end);
1957     
1958//      export Syzextra;
1959
1960//      exportto(Schreyer, Syzextra::noop);
1961      exportto(Schreyer, Syzextra::DetailedPrint);
1962      exportto(Schreyer, Syzextra::leadmonomial);
1963      exportto(Schreyer, Syzextra::leadcomp);
1964//      exportto(Schreyer, Syzextra::leadrawexp);
1965//      exportto(Schreyer, Syzextra::ISUpdateComponents);
1966      exportto(Schreyer, Syzextra::SetInducedReferrence);
1967      exportto(Schreyer, Syzextra::GetInducedData);
1968//      exportto(Schreyer, Syzextra::GetAMData);
1969//      exportto(Schreyer, Syzextra::SetSyzComp);
1970      exportto(Schreyer, Syzextra::MakeInducedSchreyerOrdering);
1971//      exportto(Schreyer, Syzextra::MakeSyzCompOrdering);
1972      exportto(Schreyer, Syzextra::idPrepare);
1973//      exportto(Schreyer, Syzextra::reduce_syz);
1974//      exportto(Schreyer, Syzextra::p_Content);
1975
1976      exportto(Schreyer, Syzextra::ProfilerStart); exportto(Schreyer, Syzextra::ProfilerStop);
1977
1978      exportto(Schreyer, Syzextra::Tail);
1979      exportto(Schreyer, Syzextra::ComputeLeadingSyzygyTerms);     
1980      exportto(Schreyer, Syzextra::Compute2LeadingSyzygyTerms);
1981      exportto(Schreyer, Syzextra::Sort_c_ds);
1982
1983      exportto(Schreyer, Syzextra::FindReducer);
1984
1985      exportto(Schreyer, Syzextra::ReduceTerm);
1986      exportto(Schreyer, Syzextra::TraverseTail);
1987
1988      exportto(Schreyer, Syzextra::SchreyerSyzygyNF);
1989    }
1990/*
1991    else
1992    {
1993      if( @DEBUG )
1994      {
1995        "Loading the Debug version!";
1996      }
1997
1998      load("syzextra.so");
1999
2000      if( @DEBUG )
2001      {     
2002        listvar(Syzextra_g);
2003      }
2004     
2005      exportto(Top, Syzextra_g::ClearContent);
2006      exportto(Top, Syzextra_g::ClearDenominators);
2007
2008      exportto(Schreyer, Syzextra_g::m2_end);
2009
2010//      export Syzextra_g;
2011//      exportto(Schreyer, Syzextra_g::noop);
2012      exportto(Schreyer, Syzextra_g::DetailedPrint);
2013      exportto(Schreyer, Syzextra_g::leadmonomial);
2014      exportto(Schreyer, Syzextra_g::leadcomp);
2015//      exportto(Schreyer, Syzextra_g::leadrawexp);
2016//      exportto(Schreyer, Syzextra_g::ISUpdateComponents);
2017      exportto(Schreyer, Syzextra_g::SetInducedReferrence);
2018      exportto(Schreyer, Syzextra_g::GetInducedData);
2019//      exportto(Schreyer, Syzextra_g::GetAMData);
2020//      exportto(Schreyer, Syzextra_g::SetSyzComp);
2021      exportto(Schreyer, Syzextra_g::MakeInducedSchreyerOrdering);
2022//      exportto(Schreyer, Syzextra_g::MakeSyzCompOrdering);
2023      exportto(Schreyer, Syzextra_g::idPrepare);
2024//      exportto(Schreyer, Syzextra_g::reduce_syz);
2025//      exportto(Schreyer, Syzextra_g::p_Content);
2026
2027      exportto(Schreyer, Syzextra_g::ProfilerStart); exportto(Schreyer, Syzextra_g::ProfilerStop);
2028
2029      exportto(Schreyer, Syzextra_g::Tail);
2030      exportto(Schreyer, Syzextra_g::ComputeLeadingSyzygyTerms);
2031      exportto(Schreyer, Syzextra_g::Compute2LeadingSyzygyTerms);
2032      exportto(Schreyer, Syzextra_g::Sort_c_ds);
2033
2034      exportto(Schreyer, Syzextra_g::FindReducer);
2035     
2036      exportto(Schreyer, Syzextra_g::ReduceTerm);
2037      exportto(Schreyer, Syzextra_g::TraverseTail);
2038
2039      exportto(Schreyer, Syzextra_g::SchreyerSyzygyNF);
2040    }
2041*/
2042
2043    exportto(Top, DetailedPrint);
2044    exportto(Top, GetInducedData);
2045
2046    if( @DEBUG )
2047    {
2048      listvar(Top);
2049      listvar(Schreyer);
2050    }
2051  }
2052 
2053  if( !defined(GetInducedData) )
2054  {
2055    ERROR("Sorry but we are missing the dynamic module (syzextra.so)...");
2056  }
2057
2058}
2059
2060static proc mod_init()
2061{
2062  loadme();
2063}
2064
2065
2066proc testallSexamples()
2067{
2068  example Ssyz;
2069  example Scontinue;
2070  example Sres; 
2071}
2072
2073proc testallSSexamples()
2074{
2075  example SSsyz;
2076  example SScontinue;
2077  example SSres; 
2078}
2079
2080example
2081{ "EXAMPLE:"; echo = 2;
2082  testallSexamples();
2083  testallSSexamples();
2084}
2085
2086proc TestSSres(def M)
2087{
2088  "/ ----------------------------------- : ", "options: ", attrib(SSinit, "LEAD2SYZ"), attrib(SSinit, "TAILREDSYZ"), attrib(SSinit, "HYBRIDNF"), "...";
2089  int t = timer;
2090  def S = SSres(M, 0);
2091  int tt = timer;
2092/*
2093  setring S;
2094 
2095  MRES;
2096  RES;
2097  "";
2098  LRES;
2099  "";
2100  TRES;
2101*/ 
2102  kill S;
2103  "\ ----------------------------------- / ", "options: ", attrib(SSinit, "LEAD2SYZ"), attrib(SSinit, "TAILREDSYZ"), attrib(SSinit, "HYBRIDNF"), ": ", "Time: ", tt - t;
2104}
2105
2106
2107proc TestSres(def M)
2108{
2109  def opts = option(get);
2110  option(redSB); option(redTail);
2111  "/ ----------------------------------- : Sres ...";
2112  int t = timer;
2113  def S = Sres(M, 0);
2114  int tt = timer;
2115/*
2116  setring S;
2117
2118  MRES;
2119  RES;
2120  "";
2121  LRES;
2122  "";
2123  TRES;
2124*/ 
2125  kill S;
2126  "\ ----------------------------------- / Sres ", "Time: ", tt - t; 
2127  option(set, opts);
2128  kill opts;
2129}
2130
2131
2132proc Testsres(def M)
2133{
2134  def opts = option(get);
2135  option(redSB); option(redTail);
2136  "/ ----------------------------------- : sres ...";
2137  int t = timer;
2138  def S = list(sres(M, 0));
2139  int tt = timer;
2140/*
2141  setring S;
2142
2143  MRES;
2144  RES;
2145  "";
2146  LRES;
2147  "";
2148  TRES;
2149*/ 
2150  kill S;
2151  "\ ----------------------------------- / sres ", "Time: ", tt - t; 
2152  option(set, opts);
2153  kill opts;
2154}
2155
2156
2157proc Testlres(def M)
2158{
2159  def opts = option(get);
2160  option(redSB); option(redTail);
2161  "/ ----------------------------------- : lres ...";
2162  int t = timer;
2163  def S = list(lres(M, 0));
2164  int tt = timer;
2165  kill S;
2166  "\ ----------------------------------- / lres ", "Time: ", tt - t; 
2167  option(set, opts);
2168  kill opts;
2169}
2170
2171
2172proc Testnres(def M)
2173{
2174  def opts = option(get);
2175  option(redSB); option(redTail);
2176  "/ ----------------------------------- : nres ...";
2177  int t = timer;
2178  def S = list(nres(M, 0));
2179  int tt = timer;
2180  kill S;
2181  "\ ----------------------------------- / nres ", "Time: ", tt - t; 
2182  option(set, opts);
2183  kill opts;
2184}
2185
2186
2187proc TestSSresAttribs(def M)
2188{
2189//  M = groebner(M);  "groebner: "; M;  "";
2190
2191
2192  // the following 2 setups are bad for AGR@101n3d002s004%1:(((
2193
2194  //////////  attrib(SSinit, "LEAD2SYZ", 0); attrib(SSinit, "TAILREDSYZ", 0); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2195  //////////  attrib(SSinit, "LEAD2SYZ", 0); attrib(SSinit, "TAILREDSYZ", 0); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2196
2197  attrib(SSinit, "LEAD2SYZ", 0); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2198  attrib(SSinit, "LEAD2SYZ", 0); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2199
2200  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 0); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2201  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 0); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2202
2203  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2204  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2205}
2206
2207
2208proc TestSSresAttribs2tr(def M)
2209{
2210  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2211  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2212
2213  Testlres(M); 
2214  Testnres(M); 
2215  Testsres(M); 
2216//  TestSres(M); // too long for the last medium test :(
2217}
2218
2219
2220proc testALLA()
2221{
2222  // TODO: only for now!!
2223  attrib(SSinit, "DEBUG", 0);
2224  attrib(SSinit, "SYZCHECK", 1);
2225  attrib(SSinit, "KERCHECK", 1);
2226
2227  ring r; r; ideal M = maxideal(1); M;
2228  TestSSresAttribs(M); 
2229  kill r;
2230
2231  ring r = 0, (a, b, c, d), lp; r; ideal M = maxideal(1); M;
2232  TestSSresAttribs(M); 
2233  kill r;
2234
2235  ring R = 0, (w, x, y, z), dp; R;
2236  ideal M = w^2 - x*z,  w*x - y*z,  x^2 - w*y, x*y - z^2, y^2 - w*z; M;
2237  TestSSresAttribs(M); 
2238  kill R;
2239
2240
2241  ring r = 0, (a, b, c, d, e, f), dp; r; ideal M = maxideal(1); M;
2242  TestSSresAttribs(M); 
2243  kill r; 
2244 
2245  ring AGR = (101), (a, b, c, d), dp; AGR;
2246  // simple: AGR@101n3d002s004%1:
2247  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;
2248  M;
2249  TestSSresAttribs(M);
2250
2251  // medium: AGR@101n3d004s009%1;
2252  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;
2253  M;
2254  TestSSresAttribs(M);
2255}
2256
2257proc testAGR()
2258{
2259  attrib(SSinit, "DEBUG", 0);
2260  attrib(SSinit, "SYZCHECK", 1);
2261  attrib(SSinit, "KERCHECK", 0);
2262
2263  ring AGR = (101), (a, b, c, d), dp; AGR;
2264  // lengthy: AGR@101n3d008s058%3, kernel only!
2265  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;
2266  M;
2267  TestSSresAttribs2tr(M);
2268
2269  // AGR@101n3d010s010%3, a bit slower...
2270  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;
2271  M;
2272  TestSSresAttribs2tr(M); 
2273
2274  kill AGR;
2275
2276  ring AGR = (101), (a,b,c,d,e,f,g,h), dp; AGR;
2277  // AGR@101n7d005s010%2) medium: <= 2
2278  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;
2279  M;
2280  TestSSresAttribs2tr(M);
2281}
2282
2283// TODO: betti!!!
Note: See TracBrowser for help on using the repository browser.