Ticket #9334: 9334_review_jdemeyer.patch

File 9334_review_jdemeyer.patch, 11.9 KB (added by jdemeyer, 8 years ago)
  • sage/libs/pari/gen.pyx

    # HG changeset patch
    # User Jeroen Demeyer <jdemeyer@cage.ugent.be>
    # Date 1317291875 -7200
    # Node ID bc8b7228ec42de19b26b9a4b5e5cdd705c4d8358
    # Parent  592f8b2d947829fc4dabe18e093481593750f37a
    Reviewer patch, fixes some doctests, simplifies code, add documentation
    
    diff --git a/sage/libs/pari/gen.pyx b/sage/libs/pari/gen.pyx
    a b  
    72277227        in nf, that is 1 if X^2-aY^2-bZ^2 has a non-trivial solution (X,Y,Z)
    72287228        in nf, -1 otherwise. Otherwise compute the local symbol modulo the
    72297229        prime ideal p.
    7230         """
     7230
     7231        EXAMPLES::
     7232
     7233            sage: x = polygen(QQ)
     7234            sage: K.<t> = NumberField(x^3 - x + 1)
     7235            sage: pari(K).nfhilbert(t, t+2)  # not tested, known bug #11868
     7236            -1
     7237            sage: pari(K).nfhilbert(pari(t), pari(t+2))
     7238            -1
     7239            sage: P = K.ideal(t^2 + t - 2)   # Prime ideal above 5
     7240            sage: pari(K).nfhilbert(pari(t), pari(t+2), P.pari_prime())
     7241            -1
     7242            sage: P = K.ideal(t^2 + 3*t - 1) # Prime ideal above 23, ramified
     7243            sage: pari(K).nfhilbert(pari(t), pari(t+2), P.pari_prime())
     7244            1
     7245        """
     7246        cdef long r
    72317247        t0GEN(a)
    72327248        t1GEN(b)
    7233         sig_on()
    7234         if p == None:
    7235             return nfhilbert(self.g, t0, t1)
    7236         t2GEN(p)
    7237         return nfhilbert0(self.g, t0, t1, t2)
     7249        if p:
     7250            t2GEN(p)
     7251            sig_on()
     7252            r = nfhilbert0(self.g, t0, t1, t2)
     7253        else:
     7254            sig_on()
     7255            r = nfhilbert(self.g, t0, t1)
     7256        P.clear_stack()
     7257        return r
    72387258
    72397259
    72407260    def nfinit(self, long flag=0, long precision=0):
  • sage/rings/number_field/number_field.py

    diff --git a/sage/rings/number_field/number_field.py b/sage/rings/number_field/number_field.py
    a b  
    66406640
    66416641        INPUT:
    66426642
    6643         - ``a, b`` -- elements of self
    6644         - ``P`` -- prime ideal of self
     6643        - ``a``, ``b`` -- elements of self
     6644
     6645        - ``P`` -- (default: None) If `P` is ``None``, compute the global
     6646          symbol.  Otherwise, `P` should be either a prime ideal of self
     6647          (which may also be given as a generator or set of generators)
     6648          or a real or complex embedding.
    66456649
    66466650        OUTPUT:
    66476651
     
    66556659        If a and b are non-zero and P is unspecified, returns 1
    66566660        if the equation has a solution in self and -1 otherwise.
    66576661
    6658         EXAMPLES::
     6662        EXAMPLES:
     6663
     6664        Some global examples::
    66596665
    66606666            sage: K.<a> = NumberField(x^2 - 23)
    6661             sage: O = K.maximal_order()
    6662             sage: K.hilbert_symbol(a, a+5, 5*O)
    6663             1
    6664             sage: K.hilbert_symbol(a+1, 13, (-a-6)*O)
     6667            sage: K.hilbert_symbol(0, a+5)
     6668            0
     6669            sage: K.hilbert_symbol(a, 0)
     6670            0
     6671            sage: K.hilbert_symbol(-a, a+1)
     6672            1
     6673            sage: K.hilbert_symbol(-a, a+2)
     6674            -1
     6675            sage: K.hilbert_symbol(a, a+5)
     6676            -1
     6677
     6678        That the latter two are unsolvable should be visible in local
     6679        obstructions.  For the first, this is a prime ideal above 19.
     6680        For the second, the ramified prime above 23::
     6681
     6682            sage: K.hilbert_symbol(-a, a+2, a+2)
     6683            -1
     6684            sage: K.hilbert_symbol(a, a+5, K.ideal(23).factor()[0][0])
     6685            -1
     6686
     6687        More local examples::
     6688
     6689            sage: K.hilbert_symbol(a, 0, K.ideal(5))
     6690            0
     6691            sage: K.hilbert_symbol(a, a+5, K.ideal(5))
     6692            1
     6693            sage: K.hilbert_symbol(a+1, 13, (a+6)*K.maximal_order())
    66656694            -1
    66666695            sage: [emb1, emb2] = K.embeddings(AA)
    66676696            sage: K.hilbert_symbol(a, -1, emb1)
     
    66696698            sage: K.hilbert_symbol(a, -1, emb2)
    66706699            1
    66716700
    6672         Principal ideals P can be given by generators::
     6701        Ideals P can be given by generators::
    66736702     
    6674             sage: K.<a> = NumberField(x^5 - 23) 
     6703            sage: K.<a> = NumberField(x^5 - 23)
    66756704            sage: pi = 2*a^4 + 3*a^3 + 4*a^2 + 15*a + 11
    6676             sage: K.hilbert_symbol(a, a+5, pi) 
    6677             1 
     6705            sage: K.hilbert_symbol(a, a+5, pi)
     6706            1
    66786707            sage: rho = 2*a^4 + 3*a^3 + 4*a^2 + 15*a + 11
    66796708            sage: K.hilbert_symbol(a, a+5, rho)
    6680             1
     6709            1
     6710
     6711        This also works for non-principal ideals::
     6712
     6713            sage: K.<a> = QuadraticField(-5)
     6714            sage: P = K.ideal(3).factor()[0][0]
     6715            sage: P.gens_reduced()  # random, could be the other factor
     6716            (3, a + 1)
     6717            sage: K.hilbert_symbol(a, a+3, P)
     6718            1
     6719            sage: K.hilbert_symbol(a, a+3, [3, a+1])
     6720            1
    66816721
    66826722        Primes above 2::
    66836723
    6684             sage: K.<a> = NumberField(x^5 - 23) 
     6724            sage: K.<a> = NumberField(x^5 - 23)
    66856725            sage: O = K.maximal_order()
    66866726            sage: p = [p[0] for p in (2*O).factor() if p[0].norm() == 16][0]
    6687             sage: K.hilbert_symbol(a, a+5, p) 
     6727            sage: K.hilbert_symbol(a, a+5, p)
    66886728            1
    6689             sage: K.hilbert_symbol(a, 2, p) 
     6729            sage: K.hilbert_symbol(a, 2, p)
    66906730            1
    66916731            sage: K.hilbert_symbol(-1, a-2, p)
    66926732            -1
    66936733     
    6694         Various real fields are allowed:: 
     6734        Various real fields are allowed::
    66956735
    66966736            sage: K.<a> = NumberField(x^3+x+1)
    66976737            sage: K.hilbert_symbol(a/3, 1/2, K.embeddings(RDF)[0])
     
    67266766
    67276767        a and b do not have to be integral or coprime::
    67286768
    6729             sage: K.<i> = QuadraticField(-1)
    6730             sage: O = K.maximal_order()
    6731             sage: K.hilbert_symbol(1/2, 1/6, 3*O)
    6732             1
    6733             sage: p = 1+i
    6734             sage: K.hilbert_symbol(p,p,p*O)
    6735             -1
     6769            sage: K.<i> = QuadraticField(-1)
     6770            sage: O = K.maximal_order()
     6771            sage: K.hilbert_symbol(1/2, 1/6, 3*O)
     6772            1
     6773            sage: p = 1+i
     6774            sage: K.hilbert_symbol(p, p, p)
     6775            1
     6776            sage: K.hilbert_symbol(p, 3*p, p)
     6777            -1
     6778            sage: K.hilbert_symbol(3, p, p)
     6779            -1
    67366780            sage: K.hilbert_symbol(1/3, 1/5, 1+i)
    67376781            1
    67386782            sage: L = QuadraticField(5, 'a')
    67396783            sage: L.hilbert_symbol(-3, -1/2, 2)
    67406784            1
    67416785
    6742         a non-principal ideal P::
    6743 
    6744             sage: K.<a> = QuadraticField(-5)
    6745             sage: P = K.ideal(3).factor()[0][0]
    6746             sage: P.is_principal()
    6747             False
    6748             sage: K.hilbert_symbol(a, a+3, P)
    6749             1
    6750 
    67516786        Various other examples::
    67526787           
    6753             sage: K.<a> = NumberField(x^3+x+1)
    6754             sage: K.hilbert_symbol(-6912, 24, -a^2-a-2)
    6755             1
    6756             sage: K.<a> = NumberField(x^5-23)
    6757             sage: P = K.ideal(-1105*a^4 + 1541*a^3 - 795*a^2 - 2993*a + 11853)
    6758             sage: Q = K.ideal(-7*a^4 + 13*a^3 - 13*a^2 - 2*a + 50)
    6759             sage: b = -a+5
    6760             sage: K.hilbert_symbol(a,b,P)
    6761             -1
    6762             sage: K.hilbert_symbol(a,b,Q)
    6763             1
    6764             sage: K.<a> = NumberField(x^5-23)
    6765             sage: P = K.ideal(-1105*a^4 + 1541*a^3 - 795*a^2 - 2993*a + 11853)
    6766             sage: b = a+5
    6767             sage: K.hilbert_symbol(a, b, P)
    6768             -1
    6769             sage: K.hilbert_symbol(a, 2, P)
    6770             -1
    6771             sage: K.hilbert_symbol(a+5, 2, P)
    6772             -1
     6788            sage: K.<a> = NumberField(x^3+x+1)
     6789            sage: K.hilbert_symbol(-6912, 24, -a^2-a-2)
     6790            1
     6791            sage: K.<a> = NumberField(x^5-23)
     6792            sage: P = K.ideal(-1105*a^4 + 1541*a^3 - 795*a^2 - 2993*a + 11853)
     6793            sage: Q = K.ideal(-7*a^4 + 13*a^3 - 13*a^2 - 2*a + 50)
     6794            sage: b = -a+5
     6795            sage: K.hilbert_symbol(a,b,P)
     6796            1
     6797            sage: K.hilbert_symbol(a,b,Q)
     6798            1
     6799            sage: K.<a> = NumberField(x^5-23)
     6800            sage: P = K.ideal(-1105*a^4 + 1541*a^3 - 795*a^2 - 2993*a + 11853)
     6801            sage: K.hilbert_symbol(a, a+5, P)
     6802            1
     6803            sage: K.hilbert_symbol(a, 2, P)
     6804            1
     6805            sage: K.hilbert_symbol(a+5, 2, P)
     6806            -1
    67736807
    67746808        AUTHOR:
    67756809
     
    67776811
    67786812        - Marco Streng (2010-12-06)
    67796813        """
    6780         if a == 0 or b == 0:
    6781             return ZZ(0)
    6782         if P != None:
    6783             if sage.rings.all.is_RingHomomorphism(P):
    6784                 if not P.domain() == self:
    6785                     raise ValueError, "Domain of P (=%s) should be self (=%s) in self.hilbert_symbol" % (P, self)
    6786                 codom = P.codomain()
    6787                 one = ZZ(1)
    6788                 from sage.rings.all import (is_ComplexField, AA, CDF, QQbar,
    6789                                     is_ComplexIntervalField, is_RealField,
    6790                                     is_RealIntervalField, RDF)
    6791                 if is_ComplexField(codom) or is_ComplexIntervalField(codom) or \
    6792                                              codom is CDF or codom is QQbar:
    6793                     if P(self.gen()).imag() == 0:
    6794                         raise ValueError, "Possibly real place (=%s) given as complex embedding in hilbert_symbol. Is it real or complex?" % P
    6795                     return one
    6796                 if is_RealField(codom) or codom is RDF or codom is AA:
    6797                     if P(a) > 0 or P(b) > 0:
    6798                         return one
    6799                     return -one
    6800             if P in self:
    6801                 P = P*self.maximal_order()
    6802             if not is_NumberFieldIdeal(P):
    6803                 raise ValueError, "P (=%s) should be an ideal or real or complex embedding in hilbert_symbol" % str(P)
    6804             if not P.number_field() == self:
    6805                 raise ValueError, "P (=%s) should be an ideal of self (=%s) in hilbert_symbol, not of %s" % (P, self, P.number_field())
    6806             if not P.is_prime():
    6807                 raise ValueError, "Non-prime ideal P (=%s) in hilbert_symbol" % P
    6808         k = pari(self)
    6809         if P != None:
    6810             P = k.idealfactor(pari(P))[0,0]
    6811         a = pari(self(a))
    6812         b = pari(self(b))
    6813         return ZZ(pari(self).nfhilbert(a, b, P))
    6814 
    6815 
     6814        if a.is_zero() or b.is_zero():
     6815            return 0
     6816        a = self(a)
     6817        b = self(b)
     6818        if P is None:
     6819            # We MUST convert a and b to pari before calling the function
     6820            # to work around Trac #11868 -- Jeroen Demeyer
     6821            return pari(self).nfhilbert(pari(a), pari(b))
     6822
     6823        if sage.rings.all.is_RingHomomorphism(P):
     6824            if not P.domain() == self:
     6825                raise ValueError, "Domain of P (=%s) should be self (=%s) in self.hilbert_symbol" % (P, self)
     6826            codom = P.codomain()
     6827            from sage.rings.all import (is_ComplexField, AA, CDF, QQbar,
     6828                                is_ComplexIntervalField, is_RealField,
     6829                                is_RealIntervalField, RDF)
     6830            if is_ComplexField(codom) or is_ComplexIntervalField(codom) or \
     6831                                         codom is CDF or codom is QQbar:
     6832                if P(self.gen()).imag() == 0:
     6833                    raise ValueError, "Possibly real place (=%s) given as complex embedding in hilbert_symbol. Is it real or complex?" % P
     6834                return 1
     6835            if is_RealField(codom) or codom is RDF or codom is AA:
     6836                if P(a) > 0 or P(b) > 0:
     6837                    return 1
     6838                return -1
     6839        if not is_NumberFieldIdeal(P):
     6840            P = self.ideal(P)
     6841        if not P.number_field() == self:
     6842            raise ValueError, "P (=%s) should be an ideal of self (=%s) in hilbert_symbol, not of %s" % (P, self, P.number_field())
     6843        if not P.is_prime():
     6844            raise ValueError, "Non-prime ideal P (=%s) in hilbert_symbol" % P
     6845        # We MUST convert a and b to pari before calling the function
     6846        # to work around Trac #11868 -- Jeroen Demeyer
     6847        return pari(self).nfhilbert(pari(a), pari(b), P.pari_prime())
    68166848
    68176849
    68186850class NumberField_cyclotomic(NumberField_absolute):