def get_embedding(self,prec): r""" Returns an embedding of the quaternion algebra into the algebra of 2x2 matrices with coefficients in `\QQ_p`. INPUT: - prec -- Integer. The precision of the splitting. """ if self.F == QQ and self.discriminant == 1: R = Qp(self.p,prec) self._F_to_local = QQ.hom([R(1)]) def iota(q): return q.change_ring(R) self._prec = prec else: I,J,K = self.local_splitting(prec) mats = [1,I,J,K] def iota(q): R=I.parent() try: q = q.coefficient_tuple() except AttributeError: q = q.list() return sum(self._F_to_local(a)*b for a,b in zip(q,mats)) return iota
def get_embedding(self, prec): r""" Returns an embedding of the quaternion algebra into the algebra of 2x2 matrices with coefficients in `\QQ_p`. INPUT: - prec -- Integer. The precision of the splitting. """ if prec == -1: prec = self._prec if self.F == QQ and self.discriminant == 1: R = Qp(self.p, prec) self._F_to_local = QQ.hom([R(1)]) def iota(q): return q.change_ring(R) if prec > self._prec: # DEBUG self._prec = prec else: I, J, K = self.local_splitting(prec) mats = [1, I, J, K] def iota(q): R = I.parent() try: q = q.coefficient_tuple() except AttributeError: q = q.list() return sum(self._F_to_local(a) * b for a, b in zip(q, mats)) return iota
def _compute_padic_splitting(self, prec): verbose('Entering compute_padic_splitting') prime = self.p if self.seed is not None: self.magma.eval('SetSeed(%s)' % self.seed) R = Qp(prime, prec + 10) #Zmod(prime**prec) # B_magma = self.Gpn._get_B_magma() a, b = self.Gpn.B.invariants() if self._hardcode_matrices: self._II = matrix(R, 2, 2, [1, 0, 0, -1]) self._JJ = matrix(R, 2, 2, [0, 1, 1, 0]) goodroot = self.F.gen().minpoly().change_ring(R).roots()[0][0] self._F_to_local = self.F.hom([goodroot]) else: verbose('Calling magma pMatrixRing') if self.F == QQ: _, f = self.magma.pMatrixRing(self.Gpn._Omax_magma, prime * self.Gpn._Omax_magma.BaseRing(), Precision=20, nvals=2) self._F_to_local = QQ.hom([R(1)]) else: _, f = self.magma.pMatrixRing(self.Gpn._Omax_magma, sage_F_ideal_to_magma( self.Gpn._F_magma, self.ideal_p), Precision=20, nvals=2) try: self._goodroot = R( f.Image(B_magma( B_magma.BaseRing().gen(1))).Vector()[1]._sage_()) except SyntaxError: raise SyntaxError( "Magma has trouble finding local splitting") self._F_to_local = None for o, _ in self.F.gen().minpoly().change_ring(R).roots(): if (o - self._goodroot).valuation() > 5: self._F_to_local = self.F.hom([o]) break assert self._F_to_local is not None verbose('Initializing II,JJ,KK') v = f.Image(B_magma.gen(1)).Vector() self._II = matrix(R, 2, 2, [v[i + 1]._sage_() for i in xrange(4)]) v = f.Image(B_magma.gen(2)).Vector() self._JJ = matrix(R, 2, 2, [v[i + 1]._sage_() for i in xrange(4)]) v = f.Image(B_magma.gen(3)).Vector() self._KK = matrix(R, 2, 2, [v[i + 1]._sage_() for i in xrange(4)]) self._II, self._JJ = lift_padic_splitting(self._F_to_local(a), self._F_to_local(b), self._II, self._JJ, prime, prec) self.Gn._F_to_local = self._F_to_local if not self.use_shapiro(): self.Gpn._F_to_local = self._F_to_local self._KK = self._II * self._JJ self._prec = prec return self._II, self._JJ, self._KK
def _compute_padic_splitting(self,prec): verbose('Entering compute_padic_splitting') prime = self.p if self.seed is not None: self.magma.eval('SetSeed(%s)'%self.seed) R = Qp(prime,prec+10) #Zmod(prime**prec) # B_magma = self.Gn._B_magma a,b = self.Gn.B.invariants() if self._matrix_group: self._II = matrix(R,2,2,[1,0,0,-1]) self._JJ = matrix(R,2,2,[0,1,1,0]) goodroot = self.F.gen().minpoly().change_ring(R).roots()[0][0] self._F_to_local = self.F.hom([goodroot]) else: verbose('Calling magma pMatrixRing') if self.F == QQ: _,f = self.magma.pMatrixRing(self.Gn._O_magma,prime*self.Gn._O_magma.BaseRing(),Precision = 20,nvals = 2) self._F_to_local = QQ.hom([R(1)]) else: _,f = self.magma.pMatrixRing(self.Gn._O_magma,sage_F_ideal_to_magma(self.Gn._F_magma,self.ideal_p),Precision = 20,nvals = 2) try: self._goodroot = R(f.Image(B_magma(B_magma.BaseRing().gen(1))).Vector()[1]._sage_()) except SyntaxError: raise SyntaxError("Magma has trouble finding local splitting") self._F_to_local = None for o,_ in self.F.gen().minpoly().change_ring(R).roots(): if (o - self._goodroot).valuation() > 5: self._F_to_local = self.F.hom([o]) break assert self._F_to_local is not None verbose('Initializing II,JJ,KK') v = f.Image(B_magma.gen(1)).Vector() self._II = matrix(R,2,2,[v[i+1]._sage_() for i in xrange(4)]) v = f.Image(B_magma.gen(2)).Vector() self._JJ = matrix(R,2,2,[v[i+1]._sage_() for i in xrange(4)]) v = f.Image(B_magma.gen(3)).Vector() self._KK = matrix(R,2,2,[v[i+1]._sage_() for i in xrange(4)]) self._II , self._JJ = lift_padic_splitting(self._F_to_local(a),self._F_to_local(b),self._II,self._JJ,prime,prec) self.Gn._F_to_local = self._F_to_local if not self.use_shapiro(): self.Gpn._F_to_local = self._F_to_local self._KK = self._II * self._JJ self._prec = prec return self._II, self._JJ, self._KK