Exemplo n.º 1
0
 def is_consistent(self,k):
     r"""
     Return True if the Weil representation is a multiplier of weight k.
     """
     if self._verbose>0:
         print "is_consistent at wr! k={0}".format(k)
     twok =QQ(2)*QQ(k)
     if not twok.is_integral():
         return False
     if self._sym_type <>0:
         if self.is_dual():
             sig_mod_4 = -self._weil_module.signature() % 4
         else:
             sig_mod_4 = self._weil_module.signature() % 4
         if is_odd(self._weil_module.signature()):                
             return (twok % 4 == (self._sym_type*sig_mod_4 %4))
         else:
             if sig_mod_4 == (1 - self._sym_type) % 4:
                 return twok % 4 == 0
             else:
                 return twok % 4 == 2
     if is_even(twok) and  is_even(self._weil_module.signature()):
             return True
     if is_odd(twok) and  is_odd(self._weil_module.signature()):
             return True
     return False
Exemplo n.º 2
0
 def is_consistent(self, k):
     r"""
     Return True if the Weil representation is a multiplier of weight k.
     """
     if self._verbose > 0:
         print("is_consistent at wr! k={0}".format(k))
     twok = QQ(2) * QQ(k)
     if not twok.is_integral():
         return False
     if self._sym_type != 0:
         if self.is_dual():
             sig_mod_4 = -self._weil_module.signature() % 4
         else:
             sig_mod_4 = self._weil_module.signature() % 4
         if is_odd(self._weil_module.signature()):
             return (twok % 4 == (self._sym_type * sig_mod_4 % 4))
         else:
             if sig_mod_4 == (1 - self._sym_type) % 4:
                 return twok % 4 == 0
             else:
                 return twok % 4 == 2
     if is_even(twok) and is_even(self._weil_module.signature()):
         return True
     if is_odd(twok) and is_odd(self._weil_module.signature()):
         return True
     return False
Exemplo n.º 3
0
    def __init__(self,WR,weight=QQ(1)/QQ(2),use_symmetry=True,group=SL2Z,dual=False,**kwargs):
        r"""
        WR should be a Weil representation.
        INPUT:
         - weight -- weight (should be consistent with the signature of self)
         - use_symmetry -- if False we do not symmetrize the functions with respect to Z
                        -- if True we need a compatible weight
        - 'group' -- Group to act on.
        """
        if isinstance(WR,(Integer,int)):
            #self.WR=WeilRepDiscriminantForm(WR)
            #self.WR=WeilModule(WR)
            self._weil_module = WeilModule(WR)
        elif hasattr(WR,"signature"):
            self._weil_module=WR
        else:
            raise ValueError,"{0} is not a Weil module!".format(WR)
        self._sym_type = 0

        if group.level() <>1:
            raise NotImplementedError,"Only Weil representations of SL2Z implemented!"
        self._group = MySubgroup(Gamma0(1))
        self._dual = int(dual)
        self._sgn = (-1)**self._dual
        self.Qv=[]
        self._weight = weight
        self._use_symmetry = use_symmetry
        self._kwargs = kwargs
        self._sgn = (-1)**int(dual)        
        half = QQ(1)/QQ(2)
        threehalf = QQ(3)/QQ(2)
        if use_symmetry:
            ## First find weight mod 2:
            twok= QQ(2)*QQ(weight)
            if not twok.is_integral():
                raise ValueError,"Only integral or half-integral weights implemented!"
            kmod2 = QQ(twok % 4)/QQ(2)
            if dual:
                sig_mod_4 = -self._weil_module.signature() % 4
            else:
                sig_mod_4 = self._weil_module.signature() % 4
            sym_type = 0
            if (kmod2,sig_mod_4) in [(half,1),(threehalf,3),(0,0),(1,2)]:
                sym_type = 1
            elif (kmod2,sig_mod_4) in [(half,3),(threehalf,1),(0,2),(1,0)]:
                sym_type = -1
            else:
                raise ValueError,"The Weil module with signature {0} is incompatible with the weight {1}!".format( self._weil_module.signature(),weight)
            ## Deven and Dodd contains the indices for the even and odd basis
            Deven=[]; Dodd=[]
            if sym_type==1:
                self._D = self._weil_module.even_submodule(indices=1)
            else: #sym_type==-1:
                self._D = self._weil_module.odd_submodule(indices=1)
            self._sym_type=sym_type
            dim = len(self._D)  #Dfinish-Dstart+1
        else:
            dim = len(self._weil_module.finite_quadratic_module().list())
            self._D = range(dim)
            self._sym_type=0
        if hasattr(self._weil_module,"finite_quadratic_module"):
#            for x in list(self._weil_module.finite_quadratic_module()):
            for x in self._weil_module.finite_quadratic_module():
                self.Qv.append(self._weil_module.finite_quadratic_module().Q(x))
        else:
            self.Qv=self._weil_module.Qv
        ambient_rank = self._weil_module.rank()
        MultiplierSystem.__init__(self,self._group,dual=dual,dimension=dim,ambient_rank=ambient_rank)
Exemplo n.º 4
0
    def __init__(self,
                 WR,
                 weight=QQ(1) / QQ(2),
                 use_symmetry=True,
                 group=SL2Z,
                 dual=False,
                 **kwargs):
        r"""
        WR should be a Weil representation.
        INPUT:
         - weight -- weight (should be consistent with the signature of self)
         - use_symmetry -- if False we do not symmetrize the functions with respect to Z
                        -- if True we need a compatible weight
        - 'group' -- Group to act on.
        """
        if isinstance(WR, (Integer, int)):
            #self.WR=WeilRepDiscriminantForm(WR)
            #self.WR=WeilModule(WR)
            self._weil_module = WeilModule(WR)
        elif hasattr(WR, "signature"):
            self._weil_module = WR
        else:
            raise ValueError("{0} is not a Weil module!".format(WR))
        self._sym_type = 0

        if group.level() != 1:
            raise NotImplementedError(
                "Only Weil representations of SL2Z implemented!")
        self._group = MySubgroup(Gamma0(1))
        self._dual = int(dual)
        self._sgn = (-1)**self._dual
        self.Qv = []
        self._weight = weight
        self._use_symmetry = use_symmetry
        self._kwargs = kwargs
        self._sgn = (-1)**int(dual)
        half = QQ(1) / QQ(2)
        threehalf = QQ(3) / QQ(2)
        if use_symmetry:
            ## First find weight mod 2:
            twok = QQ(2) * QQ(weight)
            if not twok.is_integral():
                raise ValueError(
                    "Only integral or half-integral weights implemented!")
            kmod2 = QQ(twok % 4) / QQ(2)
            if dual:
                sig_mod_4 = -self._weil_module.signature() % 4
            else:
                sig_mod_4 = self._weil_module.signature() % 4
            sym_type = 0
            if (kmod2, sig_mod_4) in [(half, 1), (threehalf, 3), (0, 0),
                                      (1, 2)]:
                sym_type = 1
            elif (kmod2, sig_mod_4) in [(half, 3), (threehalf, 1), (0, 2),
                                        (1, 0)]:
                sym_type = -1
            else:
                raise ValueError(
                    "The Weil module with signature {0} is incompatible with the weight {1}!"
                    .format(self._weil_module.signature(), weight))
            ## Deven and Dodd contains the indices for the even and odd basis
            Deven = []
            Dodd = []
            if sym_type == 1:
                self._D = self._weil_module.even_submodule(indices=1)
            else:  #sym_type==-1:
                self._D = self._weil_module.odd_submodule(indices=1)
            self._sym_type = sym_type
            dim = len(self._D)  #Dfinish-Dstart+1
        else:
            dim = len(self._weil_module.finite_quadratic_module().list())
            self._D = list(range(dim))
            self._sym_type = 0
        if hasattr(self._weil_module, "finite_quadratic_module"):
            #            for x in list(self._weil_module.finite_quadratic_module()):
            for x in self._weil_module.finite_quadratic_module():
                self.Qv.append(
                    self._weil_module.finite_quadratic_module().Q(x))
        else:
            self.Qv = self._weil_module.Qv
        ambient_rank = self._weil_module.rank()
        MultiplierSystem.__init__(self,
                                  self._group,
                                  dual=dual,
                                  dimension=dim,
                                  ambient_rank=ambient_rank)