def a_number(self): r""" INPUT: - ``E``: Hyperelliptic Curve of the form `y^2 = f(x)` over a finite field, `\mathbb{F}_q` OUTPUT: - ``a`` : a-number EXAMPLES:: sage: K.<x>=GF(49,'x')[] sage: C=HyperellipticCurve(x^5+1,0) sage: C.a_number() 1 sage: K.<x>=GF(9,'x')[] sage: C=HyperellipticCurve(x^7-1,0) sage: C.a_number() 1 sage: P.<x>=GF(9,'a')[] sage: E=HyperellipticCurve(x^29+1,0) sage: E.a_number() 5 """ #We use caching here since Cartier matrix is needed to compute a_number. So if the Cartier #is already computed it is stored in list A. If it was not cached (i.e. A is empty), we simply #compute it. If it is cached then we need to make sure that we have the correct one. So check #which curve does the matrix correspond to. Since caching stores a lot of stuff, we only check #the last entry in A. If it does not match, clear A and compute Cartier. # Since Trac Ticket #11115, there is a special cache for methods # that don't accept arguments. The easiest is: Call the cached # method, and test whether the last entry is self. M,Coeffs,g, Fq, p,E= self._Cartier_matrix_cached() if E != self: self._Cartier_matrix_cached.clear_cache() M,Coeffs,g, Fq, p,E= self._Cartier_matrix_cached() a=g-rank(M); return a;
def a_number(self): r""" INPUT: - ``E``: Hyperelliptic Curve of the form `y^2 = f(x)` over a finite field, `\mathbb{F}_q` OUTPUT: - ``a`` : a-number EXAMPLES:: sage: K.<x>=GF(49,'x')[] sage: C=HyperellipticCurve(x^5+1,0) sage: C.a_number() 1 sage: K.<x>=GF(9,'x')[] sage: C=HyperellipticCurve(x^7-1,0) sage: C.a_number() 1 sage: P.<x>=GF(9,'a')[] sage: E=HyperellipticCurve(x^29+1,0) sage: E.a_number() 5 """ #We use caching here since Cartier matrix is needed to compute a_number. So if the Cartier #is already computed it is stored in list A. If it was not cached (i.e. A is empty), we simply #compute it. If it is cached then we need to make sure that we have the correct one. So check #which curve does the matrix correspond to. Since caching stores a lot of stuff, we only check #the last entry in A. If it does not match, clear A and compute Cartier. # Since Trac Ticket #11115, there is a special cache for methods # that don't accept arguments. The easiest is: Call the cached # method, and test whether the last entry is self. M, Coeffs, g, Fq, p, E = self._Cartier_matrix_cached() if E != self: self._Cartier_matrix_cached.clear_cache() M, Coeffs, g, Fq, p, E = self._Cartier_matrix_cached() a = g - rank(M) return a
def p_rank(self): r""" INPUT: - ``E`` : Hyperelliptic Curve of the form `y^2 = f(x)` over a finite field, `\mathbb{F}_q` OUTPUT: - ``pr`` :p-rank EXAMPLES:: sage: K.<x>=GF(49,'x')[] sage: C=HyperellipticCurve(x^5+1,0) sage: C.p_rank() 0 sage: K.<x>=GF(9,'x')[] sage: C=HyperellipticCurve(x^7-1,0) sage: C.p_rank() 0 sage: P.<x>=GF(9,'a')[] sage: E=HyperellipticCurve(x^29+1,0) sage: E.p_rank() 0 """ #We use caching here since Hasse Witt is needed to compute p_rank. So if the Hasse Witt #is already computed it is stored in list A. If it was not cached (i.e. A is empty), we simply #compute it. If it is cached then we need to make sure that we have the correct one. So check #which curve does the matrix correspond to. Since caching stores a lot of stuff, we only check #the last entry in A. If it does not match, clear A and compute Hasse Witt. # However, it seems a waste of time to manually analyse the cache # -- See Trac Ticket #11115 N,E= self._Hasse_Witt_cached() if E!=self: self._Hasse_Witt_cached.clear_cache() N,E= self._Hasse_Witt_cached() pr=rank(N); return pr
def p_rank(self): r""" INPUT: - ``E`` : Hyperelliptic Curve of the form `y^2 = f(x)` over a finite field, `\mathbb{F}_q` OUTPUT: - ``pr`` :p-rank EXAMPLES:: sage: K.<x>=GF(49,'x')[] sage: C=HyperellipticCurve(x^5+1,0) sage: C.p_rank() 0 sage: K.<x>=GF(9,'x')[] sage: C=HyperellipticCurve(x^7-1,0) sage: C.p_rank() 0 sage: P.<x>=GF(9,'a')[] sage: E=HyperellipticCurve(x^29+1,0) sage: E.p_rank() 0 """ #We use caching here since Hasse Witt is needed to compute p_rank. So if the Hasse Witt #is already computed it is stored in list A. If it was not cached (i.e. A is empty), we simply #compute it. If it is cached then we need to make sure that we have the correct one. So check #which curve does the matrix correspond to. Since caching stores a lot of stuff, we only check #the last entry in A. If it does not match, clear A and compute Hasse Witt. # However, it seems a waste of time to manually analyse the cache # -- See Trac Ticket #11115 N, E = self._Hasse_Witt_cached() if E != self: self._Hasse_Witt_cached.clear_cache() N, E = self._Hasse_Witt_cached() pr = rank(N) return pr
def _set_rank(self, cd): r""" Returns the rank of degree `cd` as well as the matrix of relations. For given codimension cd, returns dimension of kernel of relations which is rank of MW^cd and matrix A of relations Any vector in the kernel of A is a balanced weight of codimension cd TESTS:: sage: vertices = [(0,1,0),(0,1,1),(0,2,0),(0,2,2),(1,1,1),(1,2,1),(1,2,2)] sage: fan = NormalFan(Polyhedron(vertices = vertices)) sage: A = MW(fan) sage: A._set_rank(2) ( [ 0 0 1 -1 0 -1] [ 1 -1 0 0 1 0] 3, [-1 0 0 1 0 0] ) sage: A._set_rank(5) (0, []) """ d = self._dim - cd ConeList = self._cones(d) #it's a tuple! n = len(ConeList) #generate balancing conditions for every cone of dimension d-1 ConeRelns = self._cones(d - 1) relations = [] for c in ConeRelns: balance = self._balancing(c) for b in balance: relations.append(b) # remove redundant relations, rank = dimension of space perpendicular to the list of vectors A = Matrix(relations) r = rank(A) # kernel(A.T) gives a basis for MW^cd where coordinates designate coefficients of cones in that place return n - r, A