source: git/Singular/LIB/compregb.lib @ 7de8e4

spielwiese
Last change on this file since 7de8e4 was 7f3ad4, checked in by Hans Schönemann <hannes@…>, 15 years ago
*hannes: format git-svn-id: file:///usr/local/Singular/svn/trunk@11306 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 5.4 KB
Line 
1///////////////////////////////////////////////////////////////////////////////
2version="$Id: compregb.lib,v 1.3 2009-01-14 16:07:03 Singular Exp $";
3category="General purpose";
4info="
5LIBRARY:  compregb.lib      experimental implementation for comprehensive Groebner systems
6AUTHOR:  Akira Suzuki (http://kurt.scitec.kobe-u.ac.jp/~sakira/CGBusingGB/)
7                      (<sakira@kobe-u.ac.jp>)
8OVERVIEW:
9see \"A Simple Algorithm to compute Comprehensive Groebner Bases using Groebner
10Bases\" by Akira Suzuki and Yosuke Sato for details.
11
12PROCEDURES:
13  cgs(polys,vars,pars,R1,R2);     comprehensive Groebner systems
14  base2str(G);                    pretty print of the result G
15
16KEYWORDS: comprehensive Groebner system
17";
18///////////////////////////////////////////////////////////////////////////////
19// global variables are the followings:
20// Parameters, Variables, VMinDPoly,
21// RingAll, RingVar;
22
23///////////////////////////////////////////////////////////////////////////////
24static proc setup_special_dpolys()
25{
26  poly VMinDPoly = Variables[size(Variables)];
27  export(VMinDPoly);
28}
29
30static proc newcasebasis(poly Case, ideal Basis)
31{
32  list CB = Case, Basis;
33  return(CB);
34}
35
36static proc contains(poly Vari, list Varis)
37{
38  int l = size(Varis);
39  for (int i = 1; i <= l; i ++)
40  {
41    if (Vari == Varis[i])
42    {
43      return(1);
44    }
45  }
46
47  return(0);
48}
49
50static proc polys_heads(list PolyL)
51{
52  int i, j;
53  int length = size(PolyL);
54  if (!length)
55  {
56    return(PolyL);
57  }
58
59  setring(RingVar);
60  list PolyL = imap(RingAll, PolyL);
61  list HCoefs = list();
62  length = size(PolyL);
63  for (i = 1; i <= length; i ++)
64  {
65    HCoefs = insert(HCoefs, leadcoef(PolyL[i]));
66  }
67  setring(RingAll);
68  list HCoefs = imap(RingVar, HCoefs);
69
70  list CoefL;
71  ideal CoefLsub;
72  poly Coef;
73  for (i = 1; i <= length; i ++)
74  {
75    Coef = HCoefs[i];
76    if (typeof(Coef) == "poly")
77    {
78      CoefLsub = factorize(Coef, 1);
79      for (j = 1; j <= size(CoefLsub); j ++)
80      {
81        if (CoefLsub[j] > 1)
82        {
83          CoefL = insert(CoefL, CoefLsub[j]);
84        }
85      }
86    }
87  }
88
89  for (i = 1; i <= size(CoefL); i ++)
90  {
91    Coef = CoefL[i];
92    for (j = i + 1; j <= size(CoefL); j ++)
93    {
94      if (Coef == CoefL[j])
95      {
96        CoefL = delete(CoefL, j);
97        j --;
98      }
99    }
100  }
101
102  return(CoefL);
103}
104
105static proc polys_restrict_v(ideal Polys)
106{
107  return(polys_separate_v_p(Polys)[0]);
108}
109
110static proc polys_restrict_p(ideal Polys)
111{
112  return(polys_separate_v_p(Polys)[1]);
113}
114
115static proc polys_separate_v_p(ideal Polys)
116{
117  list R_v, R_p;
118  poly P;
119  int length = size(Polys);
120
121  for (int i = 1; i <= length; i ++)
122  {
123    P = Polys[i];
124    if (P < VMinDPoly)
125    {
126      R_p = insert(R_p, P);
127    }
128    else
129    {
130      R_v = insert(R_v, P);
131    }
132  }
133
134  return(R_v, R_p);
135}
136
137static proc cgs_main(ideal Polys)
138{
139  ideal F;
140  list FP, FV, HFact, Bases;
141  poly H;
142  int i;
143
144//    F = groebner(Polys);
145  F = slimgb(Polys);
146
147  if (F[1] == 1)
148  {
149    return(list());
150  }
151
152  FV, FP = polys_separate_v_p(F);
153
154  HFact = polys_heads(FV);
155  int HFL = size(HFact);
156
157  H = 1;
158  for (i = 1; i <= HFL; i ++)
159  {
160    H = H * HFact[i];
161  }
162
163  Bases = insert(Bases, list(H, F));
164
165  for (i = 1; i <= HFL; i ++)
166  {
167    //    print("paras:" + string(FP));
168    //    print("ideal:" + string(HFact[i]));
169    Bases = cgs_main(F + ideal(HFact[i])) + Bases;
170  }
171
172  return(Bases);
173}
174
175proc cgs(ideal Polys, list Vars, list Paras, RingVar, RingAll)
176"USAGE: cgs(Polys,Vars,Paras,RingVar,RingAll); Polys an ideal, Vars, the list
177        of variables, Paras the list of parameters, RingVar the ring with
178        Paras as parameters, RingAll the ring with Paras as variables
179        (RingAll should be the current ring)
180RETURN: a list L of lists L[i] of a polynomial and an ideal:
181        L[i][1] the polynomial giving the condition on the parameters
182        L[i][2] the Groebner basis for this case
183EXAMPLE: example cgs; shows an example
184"
185{
186  option(redSB);
187  list Parameters = Paras;
188  list Variables = Vars;
189  poly VMinDPoly = Vars[size(Vars)];
190  export(Parameters, Variables, VMinDPoly);
191
192  export(RingVar, RingAll);
193  setring(RingAll);
194
195  list G = cgs_main(Polys);
196
197  keepring(RingAll);
198  return(G);
199}
200example
201{ "EXAMPLE:";echo=2;
202  ring RingVar=(0,a,b),(x,y,t),lp;
203  ring RingAll=0,(x,y,t,a,b),(lp(3),dp);
204  ideal polys=x^3-a,y^4-b,x+y-t;
205  list vars=x,y,t;
206  list paras=a,b;
207  list G = cgs(polys,vars,paras,RingVar,RingAll);
208  G;
209}
210proc basis2str(list B)
211{
212  string Str;
213  ideal Factors;
214  int i;
215
216  Str = "(";
217  Factors = factorize(B[1], 1);
218  for (i = 1; i <= size(Factors); i ++)
219  {
220    Str = Str + "(" + string(Factors[i]) + ")";
221  }
222  Str = Str + "!=0,";
223
224  list FV, FP;
225  FV, FP = polys_separate_v_p(B[2]);
226  for (i = 1; i <= size(FP); i ++)
227  {
228    Str = Str + string(FP[i]) + "=0,";
229  }
230
231  if (size(Str) > 1)
232  {
233    Str = Str[1, size(Str) - 1] + ")[";
234  }
235  else
236  {
237    Str = "()[";
238  }
239
240  if (size(FV))
241  {
242    for (i = 1; i <= size(FV); i ++)
243    {
244      Str = Str + string(FV[i]) + ",";
245    }
246
247    Str = Str[1, size(Str) - 1] + "]";
248  }
249  else
250  {
251    Str += "]";
252  }
253
254  return(Str);
255}
256
257proc bases2str(list Bases)
258{
259  string Str;
260  int i;
261
262  Str = "";
263  for (i = 1; i <= size(Bases); i ++)
264  {
265    Str = Str + basis2str(Bases[i]) + newline;
266  }
267
268  return(Str);
269}
270
271/*
272ring RingVar=(0,a,b),(x,y,t),lp; ring RingAll=0,(x,y,t,a,b),(lp(3),dp);
273ideal polys=x^3-a,y^4-b,x+y-t; list vars=x,y,t; list paras=a,b;
274list G = cgs(polys,vars,paras,RingVar,RingAll);
275bases2str(G);
276*/
Note: See TracBrowser for help on using the repository browser.