def __init__(self, degree, base_ring, category=None): """ Base class for matrix groups over generic base rings You should not use this class directly. Instead, use one of the more specialized derived classes. INPUT: - ``degree`` -- integer. The degree (matrix size) of the matrix group. - ``base_ring`` -- ring. The base ring of the matrices. TESTS:: sage: G = GL(2, QQ) sage: from sage.groups.matrix_gps.matrix_group import MatrixGroup_generic sage: isinstance(G, MatrixGroup_generic) True """ assert is_Ring(base_ring) assert is_Integer(degree) self._deg = degree if self._deg <= 0: raise ValueError('the degree must be at least 1') if (category is None) and is_FiniteField(base_ring): from sage.categories.finite_groups import FiniteGroups category = FiniteGroups() super(MatrixGroup_generic, self).__init__(base=base_ring, category=category)
def _coerce_(self, x): """ EXAMPLES:: >>> s = server(); c = client(s.port) >>> c._coerce_(False) 0 >>> c._coerce_(True) 1 >>> c._coerce_('lkjdf') 'lkjdf' >>> c._coerce_(2.5) 2.5 >>> c._coerce_([1,2]) '__pickleeJxrYIot...' """ if isinstance(x, bool): x = int(x) elif isinstance(x, (str, int, long, float)): pass elif is_Integer(x) and x.nbits()<32: x = int(x) elif is_RealNumber(x) and x.prec()==53: return float(x) elif isinstance(x, unicode): return str(x) else: x = '__pickle' + base64.b64encode(zlib.compress(cPickle.dumps(x, 2))) return x
def _coerce_(self, x): """ EXAMPLES:: >>> s = server(); c = client(s.port) >>> c._coerce_(False) 0 >>> c._coerce_(True) 1 >>> c._coerce_('lkjdf') 'lkjdf' >>> c._coerce_(2.5) 2.5 >>> c._coerce_([1,2]) '__pickleeJxrYIot...' """ if isinstance(x, bool): x = int(x) elif isinstance(x, (str, int, long, float)): pass elif x is None: pass elif is_Integer(x) and x.nbits() < 32: x = int(x) elif is_RealNumber(x) and x.prec() == 53: return float(x) elif isinstance(x, unicode): return str(x) else: x = '__pickle' + base64.b64encode( zlib.compress(cPickle.dumps(x, 2))) return x
def __call__(self, P): r""" Returns a rational point P in the abstract Homset J(K), given: 0. A point P in J = Jac(C), returning P; 1. A point P on the curve C such that J = Jac(C), where C is an odd degree model, returning [P - oo]; 2. A pair of points (P, Q) on the curve C such that J = Jac(C), returning [P-Q]; 2. A list of polynomials (a,b) such that `b^2 + h*b - f = 0 mod a`, returning [(a(x),y-b(x))]. EXAMPLES:: sage: P.<x> = PolynomialRing(QQ) sage: f = x^5 - x + 1; h = x sage: C = HyperellipticCurve(f,h,'u,v') sage: P = C(0,1,1) sage: J = C.jacobian() sage: Q = J(QQ)(P) sage: for i in range(6): i*Q (1) (u, v - 1) (u^2, v + u - 1) (u^2, v + 1) (u, v + 1) (1) :: sage: F.<a> = GF(3) sage: R.<x> = F[] sage: f = x^5-1 sage: C = HyperellipticCurve(f) sage: J = C.jacobian() sage: X = J(F) sage: a = x^2-x+1 sage: b = -x +1 sage: c = x-1 sage: d = 0 sage: D1 = X([a,b]) sage: D1 (x^2 + 2*x + 1, y + x + 2) sage: D2 = X([c,d]) sage: D2 (x + 2, y) sage: D1+D2 (x^2 + 2*x + 2, y + 2*x + 1) """ if isinstance(P, (int, long, Integer)) and P == 0: R = PolynomialRing(self.value_ring(), 'x') return JacobianMorphism_divisor_class_field(self, (R(1), R(0))) elif isinstance(P, (list, tuple)): if len(P) == 1 and P[0] == 0: R = PolynomialRing(self.value_ring(), 'x') return JacobianMorphism_divisor_class_field(self, (R(1), R(0))) elif len(P) == 2: P1 = P[0] P2 = P[1] if is_Integer(P1) and is_Integer(P2): R = PolynomialRing(self.value_ring(), 'x') P1 = R(P1) P2 = R(P2) return JacobianMorphism_divisor_class_field( self, tuple([P1, P2])) if is_Integer(P1) and is_Polynomial(P2): R = PolynomialRing(self.value_ring(), 'x') P1 = R(P1) return JacobianMorphism_divisor_class_field( self, tuple([P1, P2])) if is_Integer(P2) and is_Polynomial(P1): R = PolynomialRing(self.value_ring(), 'x') P2 = R(P2) return JacobianMorphism_divisor_class_field( self, tuple([P1, P2])) if is_Polynomial(P1) and is_Polynomial(P2): return JacobianMorphism_divisor_class_field(self, tuple(P)) if is_SchemeMorphism(P1) and is_SchemeMorphism(P2): return self(P1) - self(P2) raise TypeError, "Argument P (= %s) must have length 2." % P elif isinstance( P, JacobianMorphism_divisor_class_field) and self == P.parent(): return P elif is_SchemeMorphism(P): x0 = P[0] y0 = P[1] R, x = PolynomialRing(self.value_ring(), 'x').objgen() return self((x - x0, R(y0))) raise TypeError, "Argument P (= %s) does not determine a divisor class" % P
def __call__(self, P): r""" Returns a rational point P in the abstract Homset J(K), given: 0. A point P in J = Jac(C), returning P; 1. A point P on the curve C such that J = Jac(C), where C is an odd degree model, returning [P - oo]; 2. A pair of points (P, Q) on the curve C such that J = Jac(C), returning [P-Q]; 2. A list of polynomials (a,b) such that `b^2 + h*b - f = 0 mod a`, returning [(a(x),y-b(x))]. EXAMPLES:: sage: P.<x> = PolynomialRing(QQ) sage: f = x^5 - x + 1; h = x sage: C = HyperellipticCurve(f,h,'u,v') sage: P = C(0,1,1) sage: J = C.jacobian() sage: Q = J(QQ)(P) sage: for i in range(6): i*Q (1) (u, v - 1) (u^2, v + u - 1) (u^2, v + 1) (u, v + 1) (1) :: sage: F.<a> = GF(3) sage: R.<x> = F[] sage: f = x^5-1 sage: C = HyperellipticCurve(f) sage: J = C.jacobian() sage: X = J(F) sage: a = x^2-x+1 sage: b = -x +1 sage: c = x-1 sage: d = 0 sage: D1 = X([a,b]) sage: D1 (x^2 + 2*x + 1, y + x + 2) sage: D2 = X([c,d]) sage: D2 (x + 2, y) sage: D1+D2 (x^2 + 2*x + 2, y + 2*x + 1) """ if isinstance(P, (int, long, Integer)) and P == 0: R = PolynomialRing(self.value_ring(), "x") return JacobianMorphism_divisor_class_field(self, (R(1), R(0))) elif isinstance(P, (list, tuple)): if len(P) == 1 and P[0] == 0: R = PolynomialRing(self.value_ring(), "x") return JacobianMorphism_divisor_class_field(self, (R(1), R(0))) elif len(P) == 2: P1 = P[0] P2 = P[1] if is_Integer(P1) and is_Integer(P2): R = PolynomialRing(self.value_ring(), "x") P1 = R(P1) P2 = R(P2) return JacobianMorphism_divisor_class_field(self, tuple([P1, P2])) if is_Integer(P1) and is_Polynomial(P2): R = PolynomialRing(self.value_ring(), "x") P1 = R(P1) return JacobianMorphism_divisor_class_field(self, tuple([P1, P2])) if is_Integer(P2) and is_Polynomial(P1): R = PolynomialRing(self.value_ring(), "x") P2 = R(P2) return JacobianMorphism_divisor_class_field(self, tuple([P1, P2])) if is_Polynomial(P1) and is_Polynomial(P2): return JacobianMorphism_divisor_class_field(self, tuple(P)) if is_SchemeMorphism(P1) and is_SchemeMorphism(P2): return self(P1) - self(P2) raise TypeError, "Argument P (= %s) must have length 2." % P elif isinstance(P, JacobianMorphism_divisor_class_field) and self == P.parent(): return P elif is_SchemeMorphism(P): x0 = P[0] y0 = P[1] R, x = PolynomialRing(self.value_ring(), "x").objgen() return self((x - x0, R(y0))) raise TypeError, "Argument P (= %s) does not determine a divisor class" % P