33from sage .matroids .utilities import cmp_elements_key
44from sage .rings .polynomial .polynomial_ring_constructor import PolynomialRing
55from sage .sets .set import Set
6+ from sage .rings .polynomial .multi_polynomial_sequence import PolynomialSequence
67
78
89class ChowRingIdeal (MPolynomialIdeal ):
@@ -20,13 +21,13 @@ def __init__(self, M, R):
2021 names = ['A{}' .format ('' .join (str (x ) for x in sorted (F , key = cmp_elements_key ))) for F in self .flats ]
2122
2223 try :
23- poly_ring = PolynomialRing (R , names ) #self.ring
24+ self . poly_ring = PolynomialRing (R , names ) #self.ring
2425 except ValueError : # variables are not proper names
25- poly_ring = PolynomialRing (R , 'A' , len (self .flats ))
26+ self . poly_ring = PolynomialRing (R , 'A' , len (self .flats ))
2627
2728
28- gens = poly_ring .gens ()
29- self .flat_generator = dict (zip (self .flats , gens ))
29+ gens = self . poly_ring .gens ()
30+ self .flats_generator = dict (zip (self .flats , gens ))
3031
3132
3233 Q = [gens [i ] * gens [i + j + 1 ] for i ,F in enumerate (self .flats )
@@ -36,38 +37,39 @@ def __init__(self, M, R):
3637 for j ,x in enumerate (E ) for y in E [j + 1 :]]
3738
3839
39- MPolynomialIdeal .__init__ (self , poly_ring , Q + L )
40+ MPolynomialIdeal .__init__ (self , self . poly_ring , Q + L )
4041
4142 def _repr_ (self ):
4243 return "Chow ring ideal of {}" .format (self ._matroid )
4344
4445 def groebner_basis (self ):
4546 gb = list ()
4647 for F in self .flats :
47- for G in self .flats : #write from F not G
48+ for G in self .flats :
4849 if not (F < G or G < F ):
49- gb .append (self .names [F ]* self .names [G ])
50+ gb .append (self .flats_generator [F ]* self .flats_generator [G ])
5051 elif Set (F ).is_empty ():
51- term = 0
52+ term = self . poly_ring . zero ()
5253 for H in self .flats :
5354 if H < F :
54- term += self .names [H ]
55+ term += self .flats_generator [H ]
5556 gb .append (term ** self ._matroid .rank (Set (G )))
5657 elif F < G :
57- term = 0
58+ term = self . poly_ring . zero ()
5859 for H in self .flats :
5960 if H < F :
60- term += self .names [H ]
61+ term += self .flats_generator [H ]
6162 gb .append (term ** (self ._matroid .rank (Set (G ))- self ._matroid .rank (Set (F ))))
6263
63- return gb
64+ g_basis = PolynomialSequence (self .poly_ring , [gb ])
65+ return g_basis
6466
6567
6668 def matroid (self ):
6769 return self ._matroid
6870
69- def flat_generator (self ):
70- return dict (self .flat_generator )
71+ def flats_generator (self ):
72+ return dict (self .flats_generator )
7173
7274
7375
@@ -85,8 +87,8 @@ def __init__(self, M, R):
8587 self .flats_generator = dict ()
8688 #names_groundset = ['A{}'.format(''.join(str(x))) for x in E]
8789 #names_flats = ['B{}'.format(''.join(str(x) for x in sorted(F, key=cmp_elements_key))) for F in self.flats]
88- poly_ring = PolynomialRing (R , 'A' , len (E ) + len (self .flats ))
89- gens = poly_ring .gens ()
90+ self . poly_ring = PolynomialRing (R , 'A' , len (E ) + len (self .flats ))
91+ gens = self . poly_ring .gens ()
9092 for i ,x in enumerate (E ):
9193 self .flats_generator [x ] = gens [i ]
9294 for i ,F in enumerate (self .flats ):
@@ -116,17 +118,13 @@ def __init__(self, M, R):
116118 #Q.append([gens[i]*gens[len(E)+j] for i,x in enumerate(E) for j,F in enumerate(self.flats) if F not in flats_containing[x]])
117119 L = list ()
118120 for i ,x in enumerate (E ):
119- term = poly_ring .zero ()
121+ term = self . poly_ring .zero ()
120122 for j ,F in enumerate (self .flats ):
121123 if F not in flats_containing [x ]:
122124 term += gens [le + j ]
123125 L .append (gens [i ] - term )
124126
125- for g in Q :
126- print (g , g .parent ())
127- for g in L :
128- print (g , g .parent ())
129- MPolynomialIdeal .__init__ (self , poly_ring , Q + L )
127+ MPolynomialIdeal .__init__ (self , self .poly_ring , Q + L )
130128
131129 def _repr_ (self ): #use single underscore
132130 return "Augmented Chow ring ideal of {}" .format (self ._matroid )
@@ -135,14 +133,13 @@ def matroid(self):
135133 return self ._matroid
136134
137135 def flat_generator (self ):
138- return self .flat_generator
136+ return self .flats_generator
139137
140138
141139
142140
143141
144142 def groebner_basis (self , atom_free = False ):
145- #list returned or iterator returned? - neither - polynomial_sequence_generic object
146143 gb = []
147144 flats = self .flats
148145 if Set ([]) in flats :
@@ -151,48 +148,49 @@ def groebner_basis(self, atom_free=False):
151148 for F in flats :
152149 for G in flats :
153150 if not (F > G or G > F ):
154- gb .append (self .names [F ]* self .names [G ])
151+ gb .append (self .flats_generator [F ]* self .flats_generator [G ])
155152 elif F < G :
156- term = 0
153+ term = self . poly_ring . zero ()
157154 for H in self .flats :
158155 if H < F :
159- term += self .names [H ]
160- gb .append (self .names [F ]* (term ** self ._matroid .rank (Set (G )))*
156+ term += self .flats_generator [H ]
157+ gb .append (self .flats_generator [F ]* (term ** self ._matroid .rank (Set (G )))*
161158 (term ** (self ._matroid .rank (Set (G ))- self ._matroid .rank (Set (F )))))
162159
163160 else :
164161 E = list (self ._matroid .groundset ())
165162 for i in E :
166163 for F in flats :
167164 for G in flats :
168- term = 0
165+ term = self . poly_ring . zero ()
169166 for H in flats :
170167 if i in Set (H ):
171- term += self .names [H ]
172- gb .append (self .names [i ] + term )
168+ term += self .flats_generator [H ]
169+ gb .append (self .flats_generator [i ] + term )
173170
174171 if i in Set (F ):
175- term = 0
172+ term = self . poly_ring . zero ()
176173 for H in flats :
177174 if H < F :
178- term += self .names [H ]
179- gb .append (self .names [i ]* (term ** self ._matroid .rank (Set (G )))*
175+ term += self .flats_generator [H ]
176+ gb .append (self .flats_generator [i ]* (term ** self ._matroid .rank (Set (G )))*
180177 (term ** (self ._matroid .rank (Set (G ))- self ._matroid .rank (Set (F )))))
181178
182179 elif not i in Set (F ):
183- gb .append (self .names [i ]* self .names [F ])
180+ gb .append (self .flats_generator [i ]* self .flats_generator [F ])
184181
185182 elif not (F < G or G < F ):
186- gb .append (self .names [F ]* self .names [G ])
183+ gb .append (self .flats_generator [F ]* self .flats_generator [G ])
187184
188185 elif F < G :
189- term = 0
186+ term = self . poly_ring . zero ()
190187 for H in flats :
191188 if H < F :
192- term += self .names [H ]
189+ term += self .flats_generator [H ]
193190 gb .append (term ** (self ._matroid .rank (Set (G ))- self ._matroid .rank (Set (F ))))
194191
195- return gb
192+ g_basis = PolynomialSequence (self .poly_ring , [gb ])
193+ return g_basis
196194
197195
198196
0 commit comments