コード例 #1
0
ファイル: dims.py プロジェクト: thalespaiva/sagelib
def CO_delta(r, p, N, eps):
    r"""
    This is used as an intermediate value in computations related to
    the paper of Cohen-Oesterle.
    
    INPUT:
    
    
    -  ``r`` - positive integer
    
    -  ``p`` - a prime
    
    -  ``N`` - positive integer
    
    -  ``eps`` - character
    
    
    OUTPUT: element of the base ring of the character
    
    EXAMPLES::
    
        sage: G.<eps> = DirichletGroup(7)
        sage: sage.modular.dims.CO_delta(1,5,7,eps^3)
        2
    """
    if not is_prime(p):
        raise ValueError, "p must be prime"
    K = eps.base_ring()
    if p % 4 == 3:
        return K(0)
    if p == 2:
        if r == 1:
            return K(1)
        return K(0)
    # interesting case: p=1(mod 4).
    # omega is a primitive 4th root of unity mod p.
    omega = (IntegerModRing(p).unit_gens()[0])**((p - 1) // 4)
    # this n is within a p-power root of a "local" 4th root of 1 modulo p.
    n = Mod(int(omega.crt(Mod(1, N // (p**r)))), N)
    n = n**(p**(r - 1))  # this is correct now
    t = eps(n)
    if t == K(1):
        return K(2)
    if t == K(-1):
        return K(-2)
    return K(0)
コード例 #2
0
ファイル: dims.py プロジェクト: thalespaiva/sagelib
def CO_nu(r, p, N, eps):
    r"""
    This is used as an intermediate value in computations related to
    the paper of Cohen-Oesterle.
    
    INPUT:
    
    
    -  ``r`` - positive integer
    
    -  ``p`` - a prime
    
    -  ``N`` - positive integer
    
    -  ``eps`` - character
    
    
    OUTPUT: element of the base ring of the character
    
    EXAMPLES::
    
        sage: G.<eps> = DirichletGroup(7)
        sage: G.<eps> = DirichletGroup(7)
        sage: sage.modular.dims.CO_nu(1,7,7,eps)
        -1
    """
    K = eps.base_ring()
    if p % 3 == 2:
        return K(0)
    if p == 3:
        if r == 1:
            return K(1)
        return K(0)
    # interesting case: p=1(mod 3)
    # omega is a cube root of 1 mod p.
    omega = (IntegerModRing(p).unit_gens()[0])**((p - 1) // 3)
    n = Mod(omega.crt(Mod(1, N // (p**r))),
            N)  # within a p-power root of a "local" cube root of 1 mod p.
    n = n**(p**(r - 1))  # this is right now
    t = eps(n)
    if t == K(1):
        return K(2)
    return K(-1)
コード例 #3
0
    def additive_order(self):
        """
        Return the additive order of this element.

        EXAMPLES::

            sage: V = span([[1/2,1,1],[3/2,2,1],[0,0,1]],ZZ); W = V.span([2*V.0+4*V.1, 9*V.0+12*V.1, 4*V.2])
            sage: Q = V/W; Q
            Finitely generated module V/W over Integer Ring with invariants (4, 12)
            sage: Q.0.additive_order()
            4
            sage: Q.1.additive_order()
            12
            sage: (Q.0+Q.1).additive_order()
            12
            sage: V = span([[1/2,1,1],[3/2,2,1],[0,0,1]],ZZ); W = V.span([2*V.0+4*V.1, 9*V.0+12*V.1])
            sage: Q = V/W; Q
            Finitely generated module V/W over Integer Ring with invariants (12, 0)
            sage: Q.0.additive_order()
            12
            sage: type(Q.0.additive_order())
            <type 'sage.rings.integer.Integer'>
            sage: Q.1.additive_order()
            +Infinity
        """
        Q = self.parent()
        I = Q.invariants()
        v = self.vector()

        from sage.rings.all import infinity, Mod, Integer
        from sage.arith.all import lcm
        n = Integer(1)
        for i, a in enumerate(I):
            if a == 0:
                if v[i] != 0:
                    return infinity
            else:
                n = lcm(n, Mod(v[i],a).additive_order())
        return n
コード例 #4
0
    def __init__(self, disc, level, reduced = True) :
        self.__level = level
        
        if isinstance(disc, ParamodularFormD2Filter_discriminant) :
            disc = disc.index()

        if disc is infinity :
            self.__disc = disc
        else :
            oDmod = (-disc + 1) % (4 * level)
            Dmod = oDmod
            while Dmod > 0 :
                if not Mod(Dmod, 4 * level) :
                    Dmod = Dmod - 1
                else :
                    break
            
            self.__disc = disc - (oDmod - Dmod)
             
        self.__reduced = reduced
        
        self.__p1list = P1List(level)
コード例 #5
0
 def iter_positive_forms(self) :
     if self.__disc is infinity :
         raise ValueError, "infinity is not a true filter index"
     
     if self.__reduced :
         for (l, (u,x)) in enumerate(self.__p1list) :
             if u == 0 :
                 for a in xrange(self.__level, isqrt(self.__disc // 4) + 1, self.__level) :
                     for b in xrange(a+1) :
                         for c in xrange(a, (b**2 + (self.__disc - 1))//(4*a) + 1) :
                             yield ((a,b,c), l)
             else :
                 for a in xrange(1, isqrt(self.__disc // 3) + 1) :
                     for b in xrange(a+1) :
                         ## We need x**2 * a + x * b + c % N == 0
                         h = (-((x**2 + 1) * a + x * b)) % self.__level
                         for c in xrange( a + h,
                                          (b**2 + (self.__disc - 1))//(4*a) + 1, self.__level ) :
                             yield ((a,b,c), l)
     #! if self.__reduced
     else :
         maxtrace = floor(self.__disc / Integer(3) + sqrt(self.__disc / Integer(3)))
         for (l, (u,x)) in enumerate(self.__p1list) :
             if u == 0 :
                 for a in xrange(self.__level, maxtrace + 1, self.__level) :
                     for c in xrange(1, maxtrace - a + 1) :
                         Bu = isqrt(4*a*c - 1)
     
                         di = 4*a*c - self.__disc
                         if di >= 0 :
                             Bl = isqrt(di) + 1 
                         else :
                             Bl = 0
                         
                         for b in xrange(-Bu, -Bl + 1) :
                             yield ((a,b,c), l)
                         for b in xrange(Bl, Bu + 1) :
                             yield ((a,b,c), l)
             else :
                 for a in xrange(1, maxtrace + 1) :
                     for c in xrange(1, maxtrace - a + 1) :
                         Bu = isqrt(4*a*c - 1)
     
                         di = 4*a*c - self.__disc
                         if di >= 0 :
                             Bl = isqrt(di) + 1 
                         else :
                             Bl = 0
                         
                         h = (-x * a - int(Mod(x, self.__level)**-1) * c - Bu) % self.__level \
                             if x != 0 else \
                             (-Bu) % self.__level
                         for b in xrange(-Bu + self.__level - h, -Bl + 1, self.__level) :
                             yield ((a,b,c), l)
                         h = (-x * a - int(Mod(x, self.__level)**-1) * c + Bl) % self.__level \
                             if x !=0 else \
                             Bl % self.__level
                         for b in xrange(Bl + self.__level - h, Bu + 1, self.__level) :
                             yield ((a,b,c), l)
     #! else self.__reduced
     
     raise StopIteration