source: git/Singular/LIB/schreyer.lib @ c7d29b

spielwiese
Last change on this file since c7d29b was c7d29b, checked in by Oleksandr Motsak <motsak@…>, 12 years ago
final removal of old _INTERNAL_ functions and corresp. wrappers TODO/Q?: eliminate "const BOOLEAN __DEBUG__ = attributes.__DEBUG__;" by inheriting SchreyerSyzygyComputation from SchreyerSyzygyComputationFlags?
  • Property mode set to 100644
File size: 80.6 KB
RevLine 
[380a17b]1///////////////////////////////////////////////////////////////////////////
[3686937]2version="version schreyer.lib 4.0.0.0 Jun_2013 "; // $Id$
[4c6c938]3category="General purpose";
4info="
[789d6f]5LIBRARY: schreyer.lib     Helpers for computing a Schreyer resolution in @code{derham.lib}
[4c6c938]6AUTHOR:  Oleksandr Motsak <U@D>, where U={motsak}, D={mathematik.uni-kl.de}
[789d6f]7KEYWORDS: Schreyer ordering; Schreyer resolution; syzygy
[b1645e]8OVERVIEW:
[370468]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]).
[43e3e7]12   Here, we call a free resolution a Schreyer resolution if each syzygy module is given by a Groebner basis
[b1645e]13   with respect to the corresponding Schreyer ordering.
[370468]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}.
[b1645e]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}:
[370468]20@* The list of modules @code{RES} contains the images of maps (also called syzygy modules) substituting the
[43e3e7]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.
[b1645e]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
[370468]25   the resolution of @code{(R^rank(M))/M} is being computed.
[b1645e]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.
[370468]28@* The Schreyer ordering succesively extends the starting module ordering on @code{M} (defined in Singular by the basering @code{R})
[b1645e]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}),
[370468]32   and @code{comp(a)} is the module component, for any module terms @code{a} and @code{b} from the same higher syzygy module.
[b1645e]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}
[4c6c938]40
41PROCEDURES:
[b1645e]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
[4c6c938]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);
[2c16b8]141//    DetailedPrint(M);
[4c6c938]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);
[f37467]176 
[4c6c938]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");
[2c16b8]187//    DetailedPrint(M);
[4c6c938]188  }
189
[f37467]190  if( @DEBUG )
[4c6c938]191  {
[f37467]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    }
[4c6c938]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;
[7fe9f8b]282    deg(M[1..ncols(M)]); // no use of @W :(?
[4c6c938]283    @RANK;   
284    DetailedPrint(MRES);
[7fe9f8b]285    attrib(MRES, "isHomog"); @W;
286    deg(MRES[1..ncols(MRES)]);
[4c6c938]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);
[7fe9f8b]308
309//  basering; print(@V); type(N);
310//  attrib(N, "isHomog", @V);  // TODO: fix "wrong weights"!!!? deg is wrong :(((
311  N = std(N);
[4c6c938]312  attrib(N, "isHomog", @V);
313
314//  N;
315 
[f37467]316  if( @DEBUG )
[4c6c938]317  {
[f37467]318    if( size(N) > 0 )
[4c6c938]319    {
[f37467]320      // next syz. property
321      if( size(module(transpose( transpose(N) * transpose(MRES) ))) > 0 )
322      {
323        MRES;
[4c6c938]324
[f37467]325        "N: "; N; DetailedPrint(N, 10);
[4c6c938]326
[f37467]327        "K:"; K; DetailedPrint(K, 10);
[4c6c938]328
[f37467]329        "RANKS: ", @RANK;
[4c6c938]330
[f37467]331        "transpose( transpose(N) * transpose(MRES) ) != 0!!!";
332        transpose( transpose(N) * transpose(MRES) );
[4c6c938]333
[f37467]334        "transpose(N) * transpose(MRES): ";
335        transpose(N) * transpose(MRES);
336        DetailedPrint(module(_), 2);
337        $
338      }
[4c6c938]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)
[33694c]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
[b1645e]364ASSUME:  must be used within a ring returned by Sres or Ssyz
[4c6c938]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)
[33694c]392"USAGE:  Ssyz(module M)
393RETURN:  ring, containing a Schreyer resolution
[b1645e]394PURPOSE: computes a Schreyer resolution of M of length 1 (see the library overview)
395SEE ALSO: Sres
[4c6c938]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)
[33694c]424"USAGE:  Sres(module M, int len)
425RETURN:  ring, containing a Schreyer resolution
[b1645e]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
[4c6c938]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
[6b6c82]468// ================================================================== //
469
470
471LIB "general.lib"; // for sort
472
[e89ff5]473/* static proc Tail(def M) // DONE: in C++ (dyn. module: syzextra)!
[6b6c82]474{
475  int i = ncols(M); def m;
476  while (i > 0)
477  {
478    m = M[i];
[e89ff5]479    m = m - lead(m); // m = tail(m)   
480    M[i] = m;   
[6b6c82]481    i--;
482  }
483  return (M);
[e89ff5]484}*/
485
[8b78ee]486/* static */
487proc MySort(def M)
[f6c459]488"
489   Sorts the given ideal or module wrt >_{(c, ds)}  (.<.<.<.<)
490   NOTE: inplace??
491"
[8b78ee]492{
493  if( typeof( attrib(basering, "DEBUG") ) == "int" )
494  {
495    int @DEBUG = attrib(basering, "DEBUG");
496  } else
497  {
[2c16b8]498    int @DEBUG = 0; // !system("with", "ndebug");
[8b78ee]499  }
500
[8b368ff]501  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
[8b78ee]502  {
[8b368ff]503    int @KERCHECK = attrib(basering, "KERCHECK");
[8b78ee]504  } else
505  {
[f6c459]506    int @KERCHECK = @DEBUG;
[8b78ee]507  }
508
509
510  if( @DEBUG )
511  {
512    "MySort:: Input: "; M;
513  }
514
[210d1b]515  def @N = M;
[8b78ee]516 
[210d1b]517  if( size(M) > 0 )
[8b78ee]518  {
[210d1b]519    Sort_c_ds(@N);
520
521    if( @KERCHECK )
[8b78ee]522    {
[210d1b]523      def iv = sort(lead(M), "c,ds", 1)[2]; // ,1 => reversed! // TODO: not needed?
524      def @M = M;
525      @M = M[iv];
[8b78ee]526
[210d1b]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;
[8b78ee]536
[210d1b]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      }
[8b78ee]544    }
545  }
546
547  if( @DEBUG )
548  {
549    "MySort:: Ouput: "; @N;
550  }
551 
552  return (@N);
553}
554
[6b6c82]555
[f6c459]556static proc SSinit(def M)
[6b6c82]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");
[8e650e]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  }
[8b368ff]579
[f6c459]580  int @KERCHECK = @DEBUG;
[8b368ff]581
582  if( typeof( attrib(SSinit, "KERCHECK") ) == "int" )
583  {
584    @KERCHECK = attrib(SSinit, "KERCHECK");
585  }
586
[6b6c82]587  if( @DEBUG )
588  {
589    "SSinit::Input";
590    type(M);
[4b2e47]591//    DetailedPrint(M);
[6b6c82]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
[8b78ee]611  def @N = MySort(M); // TODO: replace with inplace sorting!!!
612  def LEAD = lead(@N);
613
[f6c459]614  if( @KERCHECK )
[8b78ee]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) );
[6b6c82]631
[8b78ee]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  }
[6b6c82]649
[8b78ee]650  M = @N;
651 
[6b6c82]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  {
[fdde6ce]676    "SSinit::NewRing(C, lex)";
[6b6c82]677    basering;
[7b7c2c]678    DetailedPrint(basering);
[6b6c82]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);
[f37467]691
[6b6c82]692  attrib(M, "isHomog", @V);
693  attrib(M, "isSB", 1);
694  attrib(M, "degrees", @DEGS); 
695 
696  def LEAD = imap(@save, LEAD);
[f37467]697 
[6b6c82]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");
[4b2e47]709//    DetailedPrint(M);
[6b6c82]710  }
711
[b0ca43c]712  if( @SYZCHECK )
[6b6c82]713  {
[f37467]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    }
[6b6c82]721  }
722
[7b7c2c]723  RES [size(RES)+1] = M; // list of all syzygy modules
[6b6c82]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
[f37467]729  attrib(MRES, "isHomog", @V);
730 
[b0ca43c]731//  attrib(S, "InducionStart", @RANK);
[8e650e]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 
[fdde6ce]759  attrib(S, "DEBUG", @DEBUG);
[b0ca43c]760  attrib(S, "SYZCHECK", @SYZCHECK);
[8b368ff]761  attrib(S, "KERCHECK", @KERCHECK);
[6b6c82]762 
763  if( @DEBUG )
764  {
765    "SSinit::MRES";
[4b2e47]766    MRES;
767//    DetailedPrint(MRES);
[6b6c82]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
[8f57c0]801
802LIB "poly.lib"; // for lcm
803
804
[f37467]805
806/// Compute L(Syz(L))
807proc SSComputeLeadingSyzygyTerms(def L)
[8f57c0]808{
[fdde6ce]809  if( typeof( attrib(basering, "DEBUG") ) == "int" )
810  {
811    int @DEBUG = attrib(basering, "DEBUG");
812  } else
813  {
814    int @DEBUG = !system("with", "ndebug");
815  }
[8f57c0]816
[7b7c2c]817  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
818  {
819    int @SYZCHECK = attrib(basering, "SYZCHECK");
820  } else
821  {
822    int @SYZCHECK = @DEBUG;
823  }
[8b368ff]824
825  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
826  {
827    int @KERCHECK = attrib(basering, "KERCHECK");
828  } else
829  {
[f6c459]830    int @KERCHECK = @DEBUG;
[8b368ff]831  }
832
[8f57c0]833  if( @DEBUG )
834  {
835    "SSComputeLeadingSyzygyTerms::Input: ";
836    L;
837  }
838
[7b7c2c]839  module SS = ComputeLeadingSyzygyTerms(L);
[8f57c0]840
[8b368ff]841  if( @KERCHECK )
[7b7c2c]842  { 
[8b78ee]843    int i, j, r;
[7b7c2c]844    int N = ncols(L);
845    def a, b;
846    poly aa, bb;
[8f57c0]847
[7b7c2c]848    bigint c;
[8f57c0]849
[7b7c2c]850    ideal M;
[4b2e47]851
[7b7c2c]852    module S = 0;
[8f57c0]853
[7b7c2c]854    for(i = 1; i <= N; i++)
[8f57c0]855    {
[7b7c2c]856      a = L[i];
857      c = leadcomp(a);
858      r = int(c);
[8f57c0]859
[7b7c2c]860      aa = leadmonomial(a);
861
862      M = 0;
863
864      for(j = i-1; j > 0; j--)
[8f57c0]865      {
[7b7c2c]866        b = L[j];
867
868        if( leadcomp(b) == c )
[4b2e47]869        {
[7b7c2c]870          bb = leadmonomial(b);
[8f57c0]871
[7b7c2c]872          M[j] = (lcm(aa, bb) / aa);
873        }
[8f57c0]874      }
[7b7c2c]875
876      // TODO: add quotient relations here...
877
878      M = simplify(M, 1 + 2 + 32);
879
[8b78ee]880      M = MySort(M);
[7b7c2c]881
882      S = S, M * gen(i);
[8f57c0]883    }
884
[8b78ee]885    S = MySort(simplify(S, 2));
[8f57c0]886
[210d1b]887    if( (size(S) + size(SS)) > 0 )
[8b368ff]888    {
[7b7c2c]889    if( size(module(matrix(S) - matrix(SS))) > 0 )
890    {
[8b368ff]891        "ERROR: SSComputeLeadingSyzygyTerms: S != SS ";
[8f57c0]892
[f6c459]893        "basering: "; basering;
894//        DetailedPrint(basering);
[8f57c0]895
[7b7c2c]896        "S: ";  S;
[f6c459]897//        DetailedPrint(_, 1);
[7b7c2c]898        "SS: "; SS;
[f6c459]899//        DetailedPrint(_, 1);
[7b7c2c]900
901        "DIFF: ";
[f6c459]902        module(matrix(S) - matrix(SS));
903//        DetailedPrint(_, 2);     
[7b7c2c]904        print(matrix(S) - matrix(SS));
905        $
906    }
[8b368ff]907    }
[7b7c2c]908  }
[8f57c0]909
910 
911  if( @DEBUG )
912  {
913    "SSComputeLeadingSyzygyTerms::Output: ";
[2c16b8]914    "SS: "; SS;
[7b7c2c]915  }
916 
[8b368ff]917  if( size(SS) > 0 )
918  {
919    attrib(SS, "isSB", 1);
920  }
921 
[7b7c2c]922  return (SS);
[f37467]923}
924
925/// Compute Syz(L), where L is a monomial (leading) module
[74afe1f]926proc SSCompute2LeadingSyzygyTerms(def L)
[f37467]927{
[fdde6ce]928  if( typeof( attrib(basering, "DEBUG") ) == "int" )
929  {
930    int @DEBUG = attrib(basering, "DEBUG");
931  } else
932  {
933    int @DEBUG = !system("with", "ndebug");
934  }
[f37467]935
[b0ca43c]936  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
937  {
938    int @SYZCHECK = attrib(basering, "SYZCHECK");
939  } else
940  {
941    int @SYZCHECK = @DEBUG;
942  }
[74afe1f]943
[8b368ff]944  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
945  {
946    int @KERCHECK = attrib(basering, "KERCHECK");
947  } else
948  {
[f6c459]949    int @KERCHECK = @DEBUG;
[8b368ff]950  }
951
[f37467]952  if( @DEBUG )
953  {
954    "SSCompute2LeadingSyzygyTerms::Input: ";
955    L;
956  }
957
[d058ea]958  module SS = Compute2LeadingSyzygyTerms(L);
[f37467]959
[d058ea]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    }
[8b368ff]976  }
977   
978  if( @KERCHECK )
979  {
[f6c459]980    int @TAILREDSYZ = 1;
981    if( typeof( attrib(basering, "TAILREDSYZ") ) == "int" )
982    {
983      @TAILREDSYZ = attrib(basering, "TAILREDSYZ");
984    }
[f37467]985
[d058ea]986    int i, j, r;
987    int N = ncols(L);
988    def a, b;
[f37467]989
[d058ea]990    poly aa, bb, @lcm;
[f37467]991
[d058ea]992    bigint c;
[f37467]993
[d058ea]994    module M;
[f37467]995
[d058ea]996    module S = 0;
[f37467]997
[d058ea]998    for(i = 1; i <= N; i++)
[f37467]999    {
[d058ea]1000      a = L[i];
1001  //    "a: ", a;
1002      c = leadcomp(a);
1003      r = int(c);
1004
1005      aa = leadmonomial(a);
1006
1007      M = 0;
[f37467]1008
[d058ea]1009      for(j = i-1; j > 0; j--)
[f37467]1010      {
[d058ea]1011        b = L[j];
1012  //      "b: ", b;
1013
1014        if( leadcomp(b) == c )
1015        {
1016          bb = leadmonomial(b);
1017          @lcm = lcm(aa, bb);
[f37467]1018
[d058ea]1019          M[j] = (@lcm / aa)* gen(i) - (@lcm / bb)* gen(j);
1020        }
[f37467]1021      }
1022
[d058ea]1023      M = simplify(M, 2);
[f37467]1024
[d058ea]1025      // TODO: add quotient relations here...
1026      S = S, M;
1027    }
[f37467]1028
[d058ea]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    }
[f37467]1041
[d058ea]1042    S = MySort(S);
[f37467]1043
[d058ea]1044    if( @DEBUG )
[f37467]1045    {
[d058ea]1046      "SSCompute2LeadingSyzygyTerms::Syz(S): "; S;
[f37467]1047    }
[74afe1f]1048
[9e69e0]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))
[74afe1f]1063    {
[9e69e0]1064      "ERROR: SSCompute2LeadingSyzygyTerms: size(S) != size(SS)";
[74afe1f]1065
[9e69e0]1066      "basering: "; basering; //      DetailedPrint(basering);
[74afe1f]1067
1068      "S: ";  S;
[9e69e0]1069//      DetailedPrint(S, 2);
[74afe1f]1070      "SS: "; SS;
[9e69e0]1071//      DetailedPrint(SS, 2);
[74afe1f]1072      $
[9e69e0]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      }
[74afe1f]1118    }
[d058ea]1119  }
1120 
1121  module S2 = Tail(SS);
1122  SS = lead(SS); // (C,lp) on base ring!
[2c16b8]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  } 
[f37467]1135             
1136  if( @DEBUG )
1137  {
[d058ea]1138    "SSCompute2LeadingSyzygyTerms::Output: "; SS; S2;
[f37467]1139  } 
1140 
[d058ea]1141  attrib(SS, "isSB", 1);
[f37467]1142
[d058ea]1143  return (SS, S2);
[8f57c0]1144}
1145
[f37467]1146// -------------------------------------------------------- //
1147
[b2fb0c]1148/// TODO: save shortcut (syz: |-.->) LM(LM(m) * "t") -> syz?
[f6c459]1149proc SSFindReducer(def product, def syzterm, def L, list #)
[8f57c0]1150{
[fdde6ce]1151  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1152  {
1153    int @DEBUG = attrib(basering, "DEBUG");
1154  } else
1155  {
1156    int @DEBUG = !system("with", "ndebug");
1157  }
[4b2e47]1158
[f6c459]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
[b2fb0c]1175
[4b2e47]1176  if( @DEBUG )
1177  {
[b2fb0c]1178    "SSFindReducer::Input: ";
[4b2e47]1179
[b2fb0c]1180    "syzterm: ", syzterm;
1181    "product: ", product;
[4b2e47]1182    "L: ", L;
[33161fd]1183//    "T: ", T;
[fdde6ce]1184    if( size(#) > 0 )
1185    {
1186      "LSyz: ", #;
1187    }
[4b2e47]1188  }
1189
[b2fb0c]1190
[f6c459]1191  if( @DEBUG && (syzterm != 0) )
[4b2e47]1192  {
[b2fb0c]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    }
[4b2e47]1202  }
1203
[33161fd]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 
[8f57c0]1212
[f6c459]1213  if( @KERCHECK )
[33161fd]1214  {
1215    bigint c = leadcomp(product); int r = int(c);
[b2fb0c]1216
[33161fd]1217    def a, b, bb;
[8f57c0]1218
[33161fd]1219    vector nf = [0];
[b2fb0c]1220
[33161fd]1221    // looking for an appropriate diviser
1222    for( int k = ncols(L); k > 0; k-- )
[4b2e47]1223    {
[33161fd]1224      a = L[k];
1225      // with the same mod. component
1226      if( leadcomp(a) == c )
[4b2e47]1227      {
[33161fd]1228        b = - (leadmonomial(product) / leadmonomial(L[k]));
[4b2e47]1229
[33161fd]1230        // which divides the product: looking for the 1st appropriate one!
1231        if( b != 0 )
[fdde6ce]1232        {
[33161fd]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
[fdde6ce]1239          {
[33161fd]1240            nf = bb;
[fdde6ce]1241          }
1242
[33161fd]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          }
[fdde6ce]1251
[33161fd]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          }
[4b2e47]1260        }
1261      }
1262    }
[33161fd]1263
1264    if( my != nf )
1265    {
1266      "ERROR in FindReducer => ", my, " != nf: ", nf;
1267      $;
1268    }
1269  }
1270
[b2fb0c]1271  if( @DEBUG )
1272  {
[33161fd]1273    "SSFindReducer::Output: ", my;
[b2fb0c]1274  }
[33161fd]1275 
1276  return (my);
[b2fb0c]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
[f6c459]1307  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
1308  {
1309    int @KERCHECK = attrib(basering, "KERCHECK");
1310  } else
1311  {
1312    int @KERCHECK = @DEBUG;
1313  }
1314 
[b2fb0c]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
[fe35f2]1337  if( typeof(#[1]) == "module" )
1338  {
1339    vector ss = ReduceTerm(m, t, syzterm, L, T, #[1]);
1340  } else
[b2fb0c]1341  {
[fe35f2]1342    vector ss = ReduceTerm(m, t, syzterm, L, T);
1343  }
[b2fb0c]1344
[fe35f2]1345  if( @KERCHECK )
1346  {
1347    vector s = 0;
[b2fb0c]1348
[fe35f2]1349    if( size(t) > 0 )
[b2fb0c]1350    {
[fe35f2]1351      def product = m * t;
[b2fb0c]1352
[fe35f2]1353      s = SSFindReducer(product, syzterm, L, #);
[b2fb0c]1354
[fe35f2]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      }
[b2fb0c]1363    }
1364   
[fe35f2]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
[4b2e47]1376  if( @DEBUG )
1377  {
[fe35f2]1378    "SSReduceTerm::Output: ", ss;
[4b2e47]1379  }
[b2fb0c]1380 
[fe35f2]1381  return (ss);
[8f57c0]1382}
1383
[b2fb0c]1384
[fdde6ce]1385// TODO: store m * @tail -.-^-.-^-.--> ?
1386proc SSTraverseTail(poly m, def @tail, def L, def T, list #)
[4b2e47]1387{
[fdde6ce]1388  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1389  {
1390    int @DEBUG = attrib(basering, "DEBUG");
1391  } else
1392  {
1393    int @DEBUG = !system("with", "ndebug");
1394  }
[4b2e47]1395
[f6c459]1396  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
1397  {
1398    int @KERCHECK = attrib(basering, "KERCHECK");
1399  } else
1400  {
1401    int @KERCHECK = @DEBUG;
1402  }
1403 
1404
[4b2e47]1405  if( @DEBUG )
1406  {
1407    "SSTraverse::Input: ";
[8f57c0]1408
[4b2e47]1409    "mult: ", m;
[fdde6ce]1410    "tail: ", @tail; // T[i];
[4b2e47]1411
[fdde6ce]1412    if( size(#) > 0 )
1413    {
1414      "LSyz: "; #[1];
1415    }
[4b2e47]1416  }
1417
[fe35f2]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;
[4b2e47]1429
[fe35f2]1430    def @l, @p;
1431    @p = @tail;
[fdde6ce]1432
1433  // iterate tail-terms in ANY order!
[fe35f2]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 )
[4b2e47]1507  {
[fe35f2]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    }
[4b2e47]1534  }
1535
1536  if( @DEBUG )
1537  {
[fe35f2]1538    "SSSchreyerSyzygyNF::Output: ", my;
[4b2e47]1539  }
[fe35f2]1540 
1541  return (my);
[4b2e47]1542}
[8f57c0]1543
[fe35f2]1544
1545
[f37467]1546// -------------------------------------------------------- //
1547
1548// module (N, LL, TT) = SSComputeSyzygy(L, T);
1549// Compute Syz(L ++ T) = N = LL ++ TT
[fdde6ce]1550proc SSComputeSyzygy(def L, def T)
[6b6c82]1551{
[fdde6ce]1552  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1553  {
1554    int @DEBUG = attrib(basering, "DEBUG");
1555  } else
1556  {
1557    int @DEBUG = !system("with", "ndebug");
1558  }
[8e650e]1559
[2c16b8]1560  if( typeof( attrib(basering, "KERCHECK") ) == "int" )
[8e650e]1561  {
[2c16b8]1562    int @KERCHECK = attrib(basering, "KERCHECK");
[8e650e]1563  } else
1564  {
[2c16b8]1565    int @KERCHECK = @DEBUG;
[8e650e]1566  }
[fdde6ce]1567 
[6b6c82]1568  if( @DEBUG )
1569  {
1570    "SSComputeSyzygy::Input";
1571    "basering: ", basering; attrib(basering);
1572//    DetailedPrint(basering);
1573
[f37467]1574//    "iCompShift: ", iCompShift;
[6b6c82]1575
1576    "L: "; L;
1577    "T: "; T;
1578  }
1579
[14e93b]1580  list @res = ComputeSyzygy(L, T);
[f37467]1581
[14e93b]1582  module @LL = @res[1]; module @TT = @res[2];
[7b7c2c]1583
[14e93b]1584  if( @KERCHECK )
[b2fb0c]1585  {
[14e93b]1586    if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
1587    {
1588      int @SYZCHECK = attrib(basering, "SYZCHECK");
1589    } else
1590    {
1591      int @SYZCHECK = @DEBUG;
1592    }
[b2fb0c]1593
[14e93b]1594    int @LEAD2SYZ = 1;
1595    if( typeof( attrib(basering, "LEAD2SYZ") ) == "int" )
1596    {
1597      @LEAD2SYZ = attrib(basering, "LEAD2SYZ");
1598    }
[b2fb0c]1599
[14e93b]1600    int @TAILREDSYZ = 1;
1601    if( typeof( attrib(basering, "TAILREDSYZ") ) == "int" )
1602    {
1603      @TAILREDSYZ = attrib(basering, "TAILREDSYZ");
1604    }
[4b2e47]1605
[14e93b]1606    int @HYBRIDNF = 0;
1607    if( typeof( attrib(basering, "HYBRIDNF") ) == "int" )
1608    {
1609      @HYBRIDNF = attrib(basering, "HYBRIDNF");
1610    }
[4b2e47]1611
[14e93b]1612    module LL;
[fdde6ce]1613
[14e93b]1614    /// Get the critical leading syzygy terms
1615    if( @LEAD2SYZ ) // & 2nd syz. term
1616    {
1617      module LL2;
1618      (LL, LL2) = SSCompute2LeadingSyzygyTerms(L);
1619    } else
[fdde6ce]1620    {
[14e93b]1621      LL = SSComputeLeadingSyzygyTerms(L);
[fdde6ce]1622    }
[b2fb0c]1623
[14e93b]1624    module TT, SYZ;
[8f57c0]1625
[14e93b]1626    vector a, a2; bigint c; int r; poly aa;
1627
1628    if( size(LL) > 0 )
[4b2e47]1629    {
[14e93b]1630      list LS;
[4b2e47]1631
[14e93b]1632      if( @TAILREDSYZ)
[b2fb0c]1633      {
[14e93b]1634        LS = list(LL);
1635      }
[b2fb0c]1636
[14e93b]1637      vector @tail;
[b2fb0c]1638
[14e93b]1639      for(int k = ncols(LL); k > 0; k-- )
[fdde6ce]1640      {
[14e93b]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);
[b2fb0c]1648
[14e93b]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:
[b2fb0c]1661        {
[14e93b]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) )
[b2fb0c]1673          {
[14e93b]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            }
[b2fb0c]1679          }
[14e93b]1680
1681          @tail = SSSchreyerSyzygyNF(a, a2, L, T, LS);
[b2fb0c]1682        }
1683
[14e93b]1684        TT[k] = @tail;
1685        SYZ[k] = a + @tail;
[b2fb0c]1686      }
[4b2e47]1687    }
[14e93b]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!?";
[c7d29b]1729      "";
[14e93b]1730      TT; @TT;
[c7d29b]1731      "";
[14e93b]1732      L; T;
[c7d29b]1733      "";
1734      type(LL);
1735      type(@LL);
[14e93b]1736      $
1737    }   
1738   
[8f57c0]1739  }
[6b6c82]1740
[14e93b]1741  module @SYZ;
1742 
1743  for(int @k = ncols(@LL); @k > 0; @k-- )
1744  {
1745    @SYZ[@k] = @LL[@k] + @TT[@k];
1746  }
1747 
[6b6c82]1748  if( @DEBUG )
1749  {
1750    "SSComputeSyzygy::Output";
1751
[14e93b]1752//    "SYZ: "; @SYZ;
1753    "LL: "; @LL;
1754    "TT: "; @TT;
[6b6c82]1755  }
1756
[14e93b]1757  return (@SYZ, @LL, @TT);
[6b6c82]1758}
1759
1760// resolution/syzygy step:
1761static proc SSstep()
1762{
[b0ca43c]1763  if( typeof( attrib(basering, "DEBUG") ) == "int" )
1764  {
1765    int @DEBUG = attrib(basering, "DEBUG");
1766  } else
1767  {
1768    int @DEBUG = !system("with", "ndebug");
1769  }
1770
1771
1772  if( typeof( attrib(basering, "SYZCHECK") ) == "int" )
1773  {
1774    int @SYZCHECK = attrib(basering, "SYZCHECK");
1775  } else
1776  {
1777    int @SYZCHECK = @DEBUG;
1778  }
[6b6c82]1779
1780  if( @DEBUG )
1781  {
1782    "SSstep::NextInducedRing";
1783    "basering: ", basering; attrib(basering);
1784  }
1785
1786/*
1787  // is initial weights are all zeroes!
1788  def L =  lead(M);
1789  intvec @V = deg(M[1..ncols(M)]);  @W;  @V;  @W = @V;  attrib(L, "isHomog", @W); 
1790  SetInducedReferrence(L, @RANK, 0);
1791*/
1792
1793//  def L =  lead(MRES);
1794//  @W = @W, @V;
1795//  attrib(L, "isHomog", @W); 
1796
1797
1798  // General setting:
1799//  SetInducedReferrence(MRES, 0, 0); // limit: 0!
1800  int @l = size(RES);
1801
1802  def M =  RES[@l];
1803
1804  def L = LRES[@l];
1805  def T = TRES[@l];
1806
1807
1808  //// TODO: wrong !!!!!
1809  int @RANK = ncols(MRES) - ncols(M); // nrows(M); // what if M is zero?!
1810
1811 
1812
1813/*
1814  if( @RANK !=  nrows(M) )
1815  {
1816    type(MRES);
1817    @RANK;
1818    type(M);
1819    pause();
1820  }
1821*/
1822 
1823  intvec @W = attrib(M, "isHomog"); intvec @V = attrib(M, "degrees"); @V = @W, @V;
1824   
1825  if( @DEBUG )
1826  {
1827    "Sstep::NextInput: ";
1828    M;
1829    L;
1830    @V;
1831    @RANK;
[4b2e47]1832//    DetailedPrint(MRES);
[6b6c82]1833    attrib(MRES, "isHomog");
1834  }
1835
1836     
1837  // TODO: N  = SYZ( M )!!!
[f37467]1838  module N, LL, TT;
1839  (N, LL, TT) = SSComputeSyzygy(/*M, */L, T/*, @RANK*/);
1840
1841  // shift syz.comp by @RANK:
1842  module Z;
1843  Z = 0; Z[@RANK] = 0; Z = Z, transpose(LL);   LL = transpose(Z);
1844  Z = 0; Z[@RANK] = 0; Z = Z, transpose(TT);   TT = transpose(Z);
1845  Z = 0; Z[@RANK] = 0; Z = Z, transpose(N);     N = transpose(Z);
[6b6c82]1846
1847
[b0ca43c]1848  if( @SYZCHECK )
[6b6c82]1849  {
[b0ca43c]1850    if( size(N) > 0 )
[6b6c82]1851    {
[f37467]1852      // next syz. property
1853      if( size(module(transpose( transpose(N) * transpose(MRES) ))) > 0 )
1854      {
1855        "MRES", MRES;
[6b6c82]1856
[f37467]1857        "N: "; N; // DetailedPrint(N, 2);
[6b6c82]1858
[f37467]1859        "LL:"; LL; // DetailedPrint(LL, 1);
1860        "TT:"; TT; // DetailedPrint(TT, 10);
[6b6c82]1861
[f37467]1862        "RANKS: ", @RANK;
[6b6c82]1863
[f37467]1864        "transpose( transpose(N) * transpose(MRES) ) != 0!!!";
1865        transpose( transpose(N) * transpose(MRES) );
[6b6c82]1866
[f37467]1867        "transpose(N) * transpose(MRES): ";
1868        transpose(N) * transpose(MRES);
1869        // DetailedPrint(module(_), 2);
1870        $
1871      }
[6b6c82]1872    }
1873  }
[f37467]1874
1875  attrib(N, "isHomog", @V);
1876
1877  // TODO: correct the following:
1878  intvec @DEGS = deg(N[1..ncols(N)]); // no mod. comp. weights :(
1879
1880 
1881  attrib(N, "degrees", @DEGS);
[6b6c82]1882 
1883   RES[@l + 1] = N; // list of all syzygy modules
1884  LRES[@l + 1] = LL; // list of all syzygy modules
1885  TRES[@l + 1] = TT; // list of all syzygy modules
1886
1887  MRES = MRES, N;
[f37467]1888 
[6b6c82]1889  attrib(MRES, "isHomog", @V);
1890
1891//  L = L, lead(N);  attrib(basering, "InducionLeads", L);
1892
1893  if( @DEBUG )
1894  {
1895    "SSstep::NextSyzOutput: ";
[f37467]1896    N;
[4b2e47]1897//    DetailedPrint(N);
[6b6c82]1898    attrib(N);
1899  }
1900
1901}
1902
1903proc SScontinue(int l)
1904"USAGE:  SScontinue(l)
1905RETURN:  nothing, instead it changes RES and MRES variables in the current ring
1906PURPOSE: computes further (at most l) syzygies
1907NOTE:    must be used within a ring returned by Sres or Ssyz. RES and MRES are
1908         explained in Sres
1909EXAMPLE: example Scontinue; shows an example
1910"
1911{
1912
1913  /// TODO!
1914//  def data = GetInducedData();
1915
1916  if( (!defined(RES)) || (!defined(MRES)) ) /* || (typeof(data) != "list") || (size(data) != 2) */
1917  {
1918    ERROR("Sorry, but basering does not seem to be returned by Sres or Ssyz");
1919  }
1920  for (;  (l != 0) && (size(RES[size(RES)]) > 0); l-- )
1921  {
1922    SSstep();
1923  }
1924}
1925example
1926{ "EXAMPLE:"; echo = 2;
1927  ring r;
1928  module M = maxideal(1); M;
1929  def S = SSsyz(M); setring S; S;
1930  "Only the first syzygy: ";
1931  RES; MRES;
1932  "More syzygies: ";
1933  SScontinue(10);
1934  RES; MRES;
1935}
1936
1937proc SSsyz(def M)
1938"USAGE:  SSsyz(M)
1939RETURN:  ring, containing a list of modules RES and a module MRES
1940PURPOSE: computes the first syzygy module of M (wrt some Schreyer ordering)?
1941NOTE:    The output is explained in Sres
1942EXAMPLE: example Ssyz; shows an example
1943"
1944{
1945  if( (typeof(M) != "module") && (typeof(M) != "ideal") )
1946  {
1947    ERROR("Sorry: need an ideal or a module for input");
1948  }
1949
1950  def SS = SSinit(M); setring SS;
1951 
1952  SSstep(); // NOTE: what if M is zero?
1953
1954  return (SS);
1955}
1956example
1957{ "EXAMPLE:"; echo = 2;
1958  ring r;
1959
1960/*  ideal M = 0;
1961  def S = SSsyz(M); setring S; S;
1962  "Only the first syzygy: ";
1963  RES; LRES; TRES;
1964  MRES;
1965 
1966  kill S; setring r; kill M;
1967*/ 
1968
[7b7c2c]1969  ideal M = maxideal(1); M;
[b2fb0c]1970
[4b2e47]1971  def S = SSres(M, 0); setring S; S;
[6b6c82]1972  MRES;
[8b368ff]1973  print(_);
[f37467]1974  RES;
[6b6c82]1975
1976  kill S; setring r; kill M;
1977
1978  kill r;
1979 
1980  ring R = 0, (w, x, y, z), dp;
1981  ideal M = w^2 - x*z,  w*x - y*z,  x^2 - w*y, x*y - z^2, y^2 - w*z;
1982 
[4b2e47]1983  def S = SSres(M, 0); setring S; S;
[f37467]1984  "";
1985  LRES;
1986  "";
[8b368ff]1987  TRES;
1988  "";
1989  MRES;
1990  print(_);
1991  RES;
[6b6c82]1992}
1993
1994proc SSres(def M, int l)
1995"USAGE:  SSres(I, l)
1996RETURN:  ring, containing a list of modules RES and a module MRES
1997PURPOSE: computes (at most l) syzygy modules of M wrt the classical Schreyer
1998         induced ordering with gen(i) > gen(j) if i > j, provided both gens
1999         are from the same syzygy level.???
2000NOTE:    RES contains the images of maps subsituting the beginning of the
2001         Schreyer free resolution of baseRing^r/M, while MRES is a sum of
2002         these images in a big free sum, containing all the syzygy modules.
2003         The syzygy modules are shifted so that gen(i) correspons to MRES[i].
2004         The leading zero module RES[0] indicates the fact that coker of the
2005         first map is zero. The number of zeroes inducates the rank of input.
2006NOTE:    If l == 0 then l is set to be nvars(basering) + 1
2007EXAMPLE: example SSres; shows an example
2008"
2009{
2010  if( (typeof(M) != "module") && (typeof(M) != "ideal") )
2011  {
2012    ERROR("Sorry: need an ideal or a module for input");
2013  }
2014
2015  def SS = SSinit(M); setring SS;
2016
2017  if (l == 0)
2018  {
2019    l = nvars(basering) + 1; // not really an estimate...?!
2020  }
2021
2022  SSstep(); l = l - 1;
2023
2024  SScontinue(l);
2025
2026  return (SS);
2027}
2028example
2029{ "EXAMPLE:"; echo = 2;
2030  ring r;
2031  module M = maxideal(1); M;
2032  def S = SSres(M, 0); setring S; S;
2033  RES;
2034  MRES;
2035  kill S;
2036  setring r; kill M;
2037
2038  def A = nc_algebra(-1,0); setring A;
2039  ideal Q = var(1)^2, var(2)^2, var(3)^2;
2040  qring SCA = twostd(Q);
2041  basering;
2042
2043  module M = maxideal(1);
2044  def S = SSres(M, 2); setring S; S;
2045  RES;
2046  MRES;
2047}
2048
2049
[4c6c938]2050
2051static proc loadme()
2052{
2053  int @DEBUG = !system("with", "ndebug");
2054
2055  if( @DEBUG )
2056  {
2057   
2058    "ndebug?: ", system("with", "ndebug");
2059    "om_ndebug?: ", system("with", "om_ndebug");
2060
2061    listvar(Top);
2062    listvar(Schreyer);
2063  }
2064//  listvar(Syzextra); listvar(Syzextra_g);
2065
2066  if( !defined(DetailedPrint) )
2067  {
[b5d6f0]2068    if( 1 )
[4c6c938]2069    {
2070
2071      if( @DEBUG )
2072      {
2073        "Loading the Release version!";
2074      }
2075      load("syzextra.so");
2076
2077      if( @DEBUG )
2078      {
2079        listvar(Syzextra);
2080      }
[ff12c6]2081
2082      exportto(Top, Syzextra::ClearContent);
2083      exportto(Top, Syzextra::ClearDenominators);
[7b7c2c]2084
2085      exportto(Schreyer, Syzextra::m2_end);
[4c6c938]2086     
2087//      export Syzextra;
2088
2089//      exportto(Schreyer, Syzextra::noop);
2090      exportto(Schreyer, Syzextra::DetailedPrint);
[4b2e47]2091      exportto(Schreyer, Syzextra::leadmonomial);
[4c6c938]2092      exportto(Schreyer, Syzextra::leadcomp);
2093//      exportto(Schreyer, Syzextra::leadrawexp);
2094//      exportto(Schreyer, Syzextra::ISUpdateComponents);
2095      exportto(Schreyer, Syzextra::SetInducedReferrence);
2096      exportto(Schreyer, Syzextra::GetInducedData);
[71e402]2097//      exportto(Schreyer, Syzextra::GetAMData);
[4c6c938]2098//      exportto(Schreyer, Syzextra::SetSyzComp);
2099      exportto(Schreyer, Syzextra::MakeInducedSchreyerOrdering);
2100//      exportto(Schreyer, Syzextra::MakeSyzCompOrdering);
2101      exportto(Schreyer, Syzextra::idPrepare);
2102//      exportto(Schreyer, Syzextra::reduce_syz);
2103//      exportto(Schreyer, Syzextra::p_Content);
2104
[f63b13]2105      exportto(Schreyer, Syzextra::ProfilerStart); exportto(Schreyer, Syzextra::ProfilerStop);
2106
[e89ff5]2107      exportto(Schreyer, Syzextra::Tail);
[7b7c2c]2108      exportto(Schreyer, Syzextra::ComputeLeadingSyzygyTerms);     
[74afe1f]2109      exportto(Schreyer, Syzextra::Compute2LeadingSyzygyTerms);
[8b78ee]2110      exportto(Schreyer, Syzextra::Sort_c_ds);
[33161fd]2111
2112      exportto(Schreyer, Syzextra::FindReducer);
[fe35f2]2113
2114      exportto(Schreyer, Syzextra::ReduceTerm);
2115      exportto(Schreyer, Syzextra::TraverseTail);
2116
2117      exportto(Schreyer, Syzextra::SchreyerSyzygyNF);
[14e93b]2118      exportto(Schreyer, Syzextra::ComputeSyzygy);
[4c6c938]2119    }
[b5d6f0]2120/*
[4c6c938]2121    else
2122    {
2123      if( @DEBUG )
2124      {
2125        "Loading the Debug version!";
2126      }
2127
[b5d6f0]2128      load("syzextra.so");
[4c6c938]2129
2130      if( @DEBUG )
2131      {     
2132        listvar(Syzextra_g);
2133      }
2134     
[ff12c6]2135      exportto(Top, Syzextra_g::ClearContent);
2136      exportto(Top, Syzextra_g::ClearDenominators);
2137
[7b7c2c]2138      exportto(Schreyer, Syzextra_g::m2_end);
2139
[4c6c938]2140//      export Syzextra_g;
2141//      exportto(Schreyer, Syzextra_g::noop);
2142      exportto(Schreyer, Syzextra_g::DetailedPrint);
[4b2e47]2143      exportto(Schreyer, Syzextra_g::leadmonomial);
[4c6c938]2144      exportto(Schreyer, Syzextra_g::leadcomp);
2145//      exportto(Schreyer, Syzextra_g::leadrawexp);
2146//      exportto(Schreyer, Syzextra_g::ISUpdateComponents);
2147      exportto(Schreyer, Syzextra_g::SetInducedReferrence);
2148      exportto(Schreyer, Syzextra_g::GetInducedData);
[71e402]2149//      exportto(Schreyer, Syzextra_g::GetAMData);
[4c6c938]2150//      exportto(Schreyer, Syzextra_g::SetSyzComp);
2151      exportto(Schreyer, Syzextra_g::MakeInducedSchreyerOrdering);
2152//      exportto(Schreyer, Syzextra_g::MakeSyzCompOrdering);
2153      exportto(Schreyer, Syzextra_g::idPrepare);
2154//      exportto(Schreyer, Syzextra_g::reduce_syz);
2155//      exportto(Schreyer, Syzextra_g::p_Content);
2156
[f63b13]2157      exportto(Schreyer, Syzextra_g::ProfilerStart); exportto(Schreyer, Syzextra_g::ProfilerStop);
2158
[e89ff5]2159      exportto(Schreyer, Syzextra_g::Tail);
[8b78ee]2160      exportto(Schreyer, Syzextra_g::ComputeLeadingSyzygyTerms);
[74afe1f]2161      exportto(Schreyer, Syzextra_g::Compute2LeadingSyzygyTerms);
[8b78ee]2162      exportto(Schreyer, Syzextra_g::Sort_c_ds);
[33161fd]2163
2164      exportto(Schreyer, Syzextra_g::FindReducer);
[8b78ee]2165     
[fe35f2]2166      exportto(Schreyer, Syzextra_g::ReduceTerm);
2167      exportto(Schreyer, Syzextra_g::TraverseTail);
2168
2169      exportto(Schreyer, Syzextra_g::SchreyerSyzygyNF);
[14e93b]2170      exportto(Schreyer, Syzextra_g::ComputeSyzygy);
[4c6c938]2171    }
[b5d6f0]2172*/
[4c6c938]2173
2174    exportto(Top, DetailedPrint);
2175    exportto(Top, GetInducedData);
2176
2177    if( @DEBUG )
2178    {
2179      listvar(Top);
2180      listvar(Schreyer);
2181    }
2182  }
2183 
2184  if( !defined(GetInducedData) )
2185  {
[b5d6f0]2186    ERROR("Sorry but we are missing the dynamic module (syzextra.so)...");
[4c6c938]2187  }
2188
2189}
2190
2191static proc mod_init()
2192{
2193  loadme();
2194}
2195
2196
2197proc testallSexamples()
2198{
2199  example Ssyz;
2200  example Scontinue;
2201  example Sres; 
2202}
[6b6c82]2203
2204proc testallSSexamples()
2205{
2206  example SSsyz;
2207  example SScontinue;
2208  example SSres; 
2209}
2210
[4c6c938]2211example
2212{ "EXAMPLE:"; echo = 2;
2213  testallSexamples();
[6b6c82]2214  testallSSexamples();
[ff12c6]2215}
[c1931a4]2216
2217proc TestSSres(def M)
2218{
[f6c459]2219  "/ ----------------------------------- : ", "options: ", attrib(SSinit, "LEAD2SYZ"), attrib(SSinit, "TAILREDSYZ"), attrib(SSinit, "HYBRIDNF"), "...";
[c1931a4]2220  int t = timer;
2221  def S = SSres(M, 0);
2222  int tt = timer;
2223/*
2224  setring S;
2225 
2226  MRES;
2227  RES;
2228  "";
2229  LRES;
2230  "";
2231  TRES;
2232*/ 
2233  kill S;
[4eba3ad]2234  "\\ ----------------------------------- / ", "options: ", attrib(SSinit, "LEAD2SYZ"), attrib(SSinit, "TAILREDSYZ"), attrib(SSinit, "HYBRIDNF"), ": ", "Time: ", tt - t;
[9cf220]2235}
2236
2237
2238proc TestSres(def M)
2239{
2240  def opts = option(get);
2241  option(redSB); option(redTail);
2242  "/ ----------------------------------- : Sres ...";
2243  int t = timer;
2244  def S = Sres(M, 0);
2245  int tt = timer;
2246/*
2247  setring S;
2248
2249  MRES;
2250  RES;
2251  "";
2252  LRES;
2253  "";
2254  TRES;
2255*/ 
2256  kill S;
2257  "\ ----------------------------------- / Sres ", "Time: ", tt - t; 
2258  option(set, opts);
2259  kill opts;
2260}
2261
2262
2263proc Testsres(def M)
2264{
2265  def opts = option(get);
2266  option(redSB); option(redTail);
2267  "/ ----------------------------------- : sres ...";
2268  int t = timer;
2269  def S = list(sres(M, 0));
2270  int tt = timer;
2271/*
2272  setring S;
2273
2274  MRES;
2275  RES;
2276  "";
2277  LRES;
2278  "";
2279  TRES;
2280*/ 
2281  kill S;
2282  "\ ----------------------------------- / sres ", "Time: ", tt - t; 
2283  option(set, opts);
2284  kill opts;
2285}
2286
2287
2288proc Testlres(def M)
2289{
2290  def opts = option(get);
2291  option(redSB); option(redTail);
2292  "/ ----------------------------------- : lres ...";
2293  int t = timer;
2294  def S = list(lres(M, 0));
2295  int tt = timer;
2296  kill S;
2297  "\ ----------------------------------- / lres ", "Time: ", tt - t; 
2298  option(set, opts);
2299  kill opts;
2300}
2301
2302
2303proc Testnres(def M)
2304{
2305  def opts = option(get);
2306  option(redSB); option(redTail);
2307  "/ ----------------------------------- : nres ...";
2308  int t = timer;
2309  def S = list(nres(M, 0));
2310  int tt = timer;
2311  kill S;
2312  "\ ----------------------------------- / nres ", "Time: ", tt - t; 
2313  option(set, opts);
2314  kill opts;
[c1931a4]2315}
2316
2317
2318proc TestSSresAttribs(def M)
2319{
[f6c459]2320//  M = groebner(M);  "groebner: "; M;  "";
2321
[c1931a4]2322
2323  // the following 2 setups are bad for AGR@101n3d002s004%1:(((
[f6c459]2324
2325  //////////  attrib(SSinit, "LEAD2SYZ", 0); attrib(SSinit, "TAILREDSYZ", 0); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2326  //////////  attrib(SSinit, "LEAD2SYZ", 0); attrib(SSinit, "TAILREDSYZ", 0); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
[c1931a4]2327
2328  attrib(SSinit, "LEAD2SYZ", 0); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2329  attrib(SSinit, "LEAD2SYZ", 0); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2330
2331  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 0); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2332  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 0); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2333
2334  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2335  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2336}
2337
2338
[9cf220]2339proc TestSSresAttribs2tr(def M)
2340{
2341  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 0); TestSSres(M);
2342  attrib(SSinit, "LEAD2SYZ", 1); attrib(SSinit, "TAILREDSYZ", 1); attrib(SSinit, "HYBRIDNF", 1); TestSSres(M);
2343
2344  Testlres(M); 
2345  Testnres(M); 
2346  Testsres(M); 
2347//  TestSres(M); // too long for the last medium test :(
2348}
2349
2350
[c1931a4]2351proc testALLA()
2352{
[d353e4f]2353  // TODO: only for now!!
2354  attrib(SSinit, "DEBUG", 0);
2355  attrib(SSinit, "SYZCHECK", 1);
[f6c459]2356  attrib(SSinit, "KERCHECK", 1);
[c1931a4]2357
2358  ring r; r; ideal M = maxideal(1); M;
2359  TestSSresAttribs(M); 
2360  kill r;
2361
2362  ring r = 0, (a, b, c, d), lp; r; ideal M = maxideal(1); M;
2363  TestSSresAttribs(M); 
2364  kill r;
2365
2366  ring R = 0, (w, x, y, z), dp; R;
2367  ideal M = w^2 - x*z,  w*x - y*z,  x^2 - w*y, x*y - z^2, y^2 - w*z; M;
2368  TestSSresAttribs(M); 
2369  kill R;
2370
[d353e4f]2371
2372  ring r = 0, (a, b, c, d, e, f), dp; r; ideal M = maxideal(1); M;
2373  TestSSresAttribs(M); 
2374  kill r; 
[c1931a4]2375 
2376  ring AGR = (101), (a, b, c, d), dp; AGR;
2377  // simple: AGR@101n3d002s004%1:
2378  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;
2379  M;
2380  TestSSresAttribs(M);
2381
2382  // medium: AGR@101n3d004s009%1;
[f6c459]2383  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;
[c1931a4]2384  M;
2385  TestSSresAttribs(M);
[9cf220]2386}
2387
2388proc testAGR()
2389{
2390  attrib(SSinit, "DEBUG", 0);
2391  attrib(SSinit, "SYZCHECK", 1);
2392  attrib(SSinit, "KERCHECK", 0);
[c1931a4]2393
[9cf220]2394  ring AGR = (101), (a, b, c, d), dp; AGR;
2395  // lengthy: AGR@101n3d008s058%3, kernel only!
[c1931a4]2396  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;
2397  M;
[9cf220]2398  TestSSresAttribs2tr(M);
2399
2400  // AGR@101n3d010s010%3, a bit slower...
2401  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;
2402  M;
2403  TestSSresAttribs2tr(M); 
2404
[c1931a4]2405  kill AGR;
2406
[9cf220]2407  ring AGR = (101), (a,b,c,d,e,f,g,h), dp; AGR;
2408  // AGR@101n7d005s010%2) medium: <= 2
2409  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;
2410  M;
2411  TestSSresAttribs2tr(M);
[c1931a4]2412}
2413
2414// TODO: betti!!!
Note: See TracBrowser for help on using the repository browser.