1
2
3
4
5
6
7
8
9
10
11
12
14
15
17
18
19 F.sort(key=lambda x: -x.lm().degree())
20
21
22 G = list()
23 for f in F:
24 ff = f.reduce(G);
25 if (ff == 0):
26 continue;
27 G = self.incremental_basis(G,f)
28 Gnew = [g[1] for g in G]
29 R = f.parent()
30 print "size before reduction", len(G)
31 G = R.ideal(Gnew).interreduced_basis()
32 return G
33
42
44
45 result = set()
46 for s in S:
47 if criterion(s):
48 result.add(s)
49 return result
50
52
53 return min([p[0].degree() for p in P])
54
56
57
58 return (sig,p,q)
59
69
73
77
82
87
89
90
91
92 r = s
93 r_sigma = sigma
94 R = self.R
95 reduced = True
96 while (r != 0) and reduced:
97 reduced = False
98 r = r.reduce(F)
99 if any(g[1] != 0 and R.monomial_divides(g[1].lm(),r.lm()) for g in G):
100 for g in G:
101 if g[1] != 0 and R.monomial_divides(g[1].lm(),r.lm()):
102 u = self.R.monomial_quotient(r.lt(),g[1].lt(),coeff=True)
103 sig_ug = u*g[0]
104 if (sig_ug < r_sigma) or ((sig_ug.lm() == r_sigma.lm()) and (sig_ug.lc() != r_sigma.lc())):
105 reduced = True
106 r -= u*g[1]
107 if (sig_ug.lm() == r_sigma.lm()):
108 r_sigma -= sig_ug
109
110 if r != 0:
111 c = r.lc()
112 r *= c**(-1)
113 r_sigma *= c**(-1)
114 return r_sigma, r
115
123
125
126
127 self.R = g.parent(); R = self.R
128
129
130 G = [(R(0),F[i]) for i in xrange(len(F))] + [(R(1),g)]
131
132
133
134 P = set([self.new_pair(self.spoly_multipliers(g,f)[0],g,f,G) for f in F])
135 Syz = self.initialize_Syz(F,G)
136
137 Done = list()
138 while len(P) != 0:
139 P = self.prune_P(P,Syz)
140 if len(P) != 0:
141 S = list(self.subset(P,lambda x: x[0].degree() == self.min_sig_degree(P)))
142 print "treating", len(S), "signatures of degree", self.min_sig_degree(P)
143 P.difference_update(S)
144 while len(S) != 0:
145 S = self.prune_S(S,Syz,Done,G)
146 if len(S) != 0:
147
148 S.sort(key=lambda x:x[0]); s = S.pop(0)
149 sigma,r = self.sigsafe_reduction(self.spoly(s,G),s[0],G,F,Syz)
150 if (r != 0) and (not self.sig_redundant(sigma,r,G)):
151
152 for (tau,g) in G:
153 if (g != 0):
154 rmul,gmul = self.spoly_multipliers(r,g)
155 if rmul*sigma.lm() != gmul*tau.lm():
156 if rmul*sigma.lm() > gmul*tau.lm():
157 p = self.new_pair(rmul*sigma,r,g,G)
158 else:
159 p = self.new_pair(gmul*tau,g,r,G)
160 if p[0].degree() == sigma.degree():
161 S.append(p)
162 else:
163 P.add(p)
164 G.append((sigma,r))
165 Done.append((sigma,r))
166 elif r == 0:
167
168 self.update_Syz(Syz,sigma,r)
169 Done.append((sigma,r))
170
171
172 return list(self.subset(G,lambda x: x[1] != 0))
173
174 -class ggv(sigbased_gb):
175
176
178
179
180 i = -1; j = -1; k = 0
181 up,uq = self.spoly_multipliers(p,q)
182 while (i<0 or j<0) and k < len(G):
183 if p == G[k][1]:
184 i = k
185 elif q == G[k][1]:
186 j = k
187 k += 1;
188 if (i == -1):
189 i=len(G)
190 elif (j == -1):
191 j = len(G)
192 return (sig,i,j)
193
195
196 return set([f.lm() for f in F])
197
199
200
201
202 f = G[s[1]][1]; g = G[s[2]][1]
203 tf = f.lm(); tg = g.lm()
204 tfg = tf.lcm(tg)
205 uf = self.R.monomial_quotient(tfg,tf)
206 return uf*f
207
209
210 result = set()
211 R = self.R
212 for p in P:
213 if not any(R.monomial_divides(t,p[0]) for t in Syz):
214 result.add(p)
215 return result
216
218
219
220 result = list()
221 R = self.R
222 for s in S:
223 if not any(R.monomial_divides(t,s[0]) for t in Syz):
224 if not any(s[0].lm()==sig[0].lm() and s[1]<sig[1] for sig in S):
225 if not any(s[0].lm()==sig[0].lm() for sig in result):
226 result.append(s)
227 return result
228
230
231
232 if r == 0:
233 Syz.add(sigma.lm())
234 return Syz
235
237
239
240
241 i = -1; j = -1; k = 0
242 return (sig,p,q)
243
245
246
247
248
249 f = s[1]; g = s[2]
250 tf = f.lm(); tg = g.lm()
251 tfg = tf.lcm(tg)
252 uf = self.R.monomial_quotient(tfg,tf)
253 return uf*f
254
256
257
258 result = list()
259 R = self.R
260 for s in S:
261 if not any(R.monomial_divides(t,s[0]) for t in Syz):
262 if not any(s[0].lm()==sig[0].lm() for sig in Done):
263 result.append(s)
264 return result
265
267
268
270
271 r = s
272 r_sigma = sigma
273 R = self.R
274 reduced = True
275 while (r != 0) and reduced:
276 reduced = False
277 r = r.reduce(F)
278 if any( g[1] != 0 and R.monomial_divides(g[1].lm(),r.lm()) for g in G ):
279 for g in G:
280 if g[1] != 0 and R.monomial_divides(g[1].lm(),r.lm()):
281 u = self.R.monomial_quotient(r.lt(),g[1].lt(),coeff=True)
282 sig_ug = u*g[0]
283 if sig_ug.lm() < r_sigma.lm():
284 reduced = True
285 r -= u*g[1]
286
287 if r != 0:
288 c = r.lc()
289 r *= c**(-1)
290 return r_sigma, r
291
293
294
296
297 return set([f.lm() for f in F])
298
300
301
302 if r == 0:
303 Syz.add(sigma.lm())
304 return Syz
305
307
308 result = set()
309 for p in P:
310 if not any(self.R.monomial_divides(t,p[0]) for t in Syz):
311 result.add(p)
312 return result
313
315
316
317
318 result = list()
319 for s in S:
320 if not any(self.R.monomial_divides(t,s[0]) for t in Syz):
321 if not any(s[0]==sig[0] and s[1].lm()>sig[1].lm() for sig in S):
322 for (sig,f) in Done:
323 if self.R.monomial_divides(sig,s[0]):
324 u = self.R.monomial_quotient(s[0],sig)
325 if u*f.lm() < s[1].lm():
326 break
327 else:
328 result.append(s)
329 return result
330
339
342
343 -class f5(coeff_free_sigbased_gb):
344
345
347
348 return set([f.lm() for f in F])
349
354
356
357 result = set()
358 for p in P:
359 if not any(self.R.monomial_divides(t,p[0]) for t in Syz):
360 result.add(p)
361 return result
362
364
365
366
367 result = list()
368 for (sig,u,j,v,k) in S:
369 if not any(self.R.monomial_divides(t,sig) for t in Syz):
370 if G[j][0] == 0 or not any(self.R.monomial_divides(Done[i][0],G[j][0]*u) and Done[i][0] > G[j][0] for i in xrange(len(Done))):
371 result.append((sig,u,j,v,k))
372 return result
373
375
376
377
378 i = -1; j = -1; k = 0
379 up,uq = self.spoly_multipliers(p,q)
380 while (i<0 or j<0) and k < len(G):
381 if p == G[k][1]:
382 i = k
383 elif q == G[k][1]:
384 j = k
385 k += 1;
386 if (i == -1):
387 i=len(G)
388 elif (j == -1):
389 j = len(G)
390 return (sig,up,i,uq,j)
391
393
394
395 f = G[s[2]][1]; g = G[s[4]][1]
396 uf = s[1]; ug = s[3]
397 return uf*f - ug*g
398
400
402
403 if r == 0:
404 Syz.add(sigma.lm())
405 return Syz
406
408
409
411
412
413
414
415 result = list()
416 R = G[0][1].parent()
417 for (sigma,s) in S:
418 if not any(R.monomial_divides(tau,sigma) for tau in Syz):
419 if not any(tau == sigma for (tau,g) in result):
420 for (tau,g) in Done:
421 if tau.divides(sigma) and len(g.monomials()) < len(s.monomials()):
422 u = R.monomial_quotient(sigma,tau)
423 result.append((u*tau,u*g))
424 break
425 else:
426 result.append((sigma,s))
427 return result
428