@@ -73,7 +73,7 @@ from sage.misc.verbose import verbose, get_verbose
7373from sage.arith.misc import previous_prime
7474from sage.arith.long cimport integer_check_long_py
7575from sage.arith.power cimport generic_power
76- from sage.structure.element cimport Element
76+ from sage.structure.element cimport Element, Vector
7777from sage.structure.proof.proof import get_flag as get_proof_flag
7878from sage.structure.richcmp cimport rich_to_bool
7979from sage.misc.randstate cimport randstate, current_randstate
@@ -88,11 +88,10 @@ from sage.rings.rational_field import QQ
8888from sage.rings.real_double import RDF
8989from sage.rings.integer_ring import ZZ, IntegerRing_class
9090from sage.rings.integer_ring cimport IntegerRing_class
91+ from sage.matrix.matrix_dense cimport Matrix_dense
9192from sage.rings.finite_rings.integer_mod_ring import IntegerModRing
9293from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
9394from sage.rings.polynomial.polynomial_integer_dense_flint cimport Polynomial_integer_dense_flint
94- from sage.structure.element cimport Element, Vector
95-
9695from sage.rings.finite_rings.finite_field_constructor import GF
9796
9897
@@ -101,8 +100,9 @@ from sage.matrix.matrix2 import decomp_seq
101100from sage.matrix.matrix cimport Matrix
102101from sage.matrix.constructor import matrix
103102cimport sage.structure.element
104- from sage.rings.integer_ring import ZZ
105103import sage.matrix.matrix_space as matrix_space
104+ from sage.modules.free_module_element import vector # to use in GraverBasis.orthogonal_range_search
105+
106106
107107# ###############
108108# Used for modular HNF
@@ -152,7 +152,7 @@ class GraverBasis:
152152 def __iter__ (self ):
153153 """ To Iterate over the Graver basis vectors (each to return as a vector in ZZ^n)."""
154154 for i in range (self ._nrows):
155- yield self ._basis_matrix.row(i) # To return each row as a Sage vector (element of ZZ^n)
155+ yield self ._ambient( self . _basis_matrix.row(i) ) # To return each row as a Sage vector (element of ZZ^n)
156156
157157 def __len__ (self ):
158158 """ To return the number of vectors in the Graver basis."""
@@ -172,7 +172,7 @@ class GraverBasis:
172172 index += self ._nrows
173173 if index < 0 or index >= self ._nrows:
174174 raise IndexError (" GraverBasis index out of range" )
175- return self ._basis_matrix.row(index)
175+ return self ._ambient( self . _basis_matrix.row(index) )
176176
177177 def orthogonal_range_search (self , l , u ):
178178 r """
@@ -202,8 +202,14 @@ class GraverBasis:
202202 .... : def __init__( self, amb) : self. _ambient = amb
203203 .... : def __iter__( self) : return _fake_iter( )
204204 .... : def orthogonal_range_search( self, l, u) :
205- .... : # Reuse the library implementation for filtering:
206- .... : return GraverBasis. orthogonal_range_search( self, l, u)
205+ .... : # To Inline the small filter: avoid referring to GraverBasis in doctest scope
206+ .... : l_vec = vector( ZZ, l) ; u_vec = vector( ZZ, u)
207+ .... : n = self. _ambient. rank( )
208+ .... : def _gen( ) :
209+ .... : for v in self:
210+ .... : w = self. _ambient( v)
211+ .... : if all( l_vec[i ] <= w[i ] <= u_vec[i ] for i in range( n)) : .... : yield w
212+ .... : return _gen( )
207213 sage: G = _GB( amb)
208214 sage: list( G. orthogonal_range_search( [0,0,0 ], [2,2,2 ]))
209215 [(0, 1, 2), (1, 1, 1) ]
@@ -959,7 +965,7 @@ cdef class Matrix_integer_dense(Matrix_dense):
959965 sig_off()
960966 return M
961967
962- def graver_basis (self ):
968+ cpdef graver_basis(self ):
963969 r """
964970 To Compute the Graver basis of this integer matrix.
965971
0 commit comments