def twist_by(self, x):
     r"""
     twist self by a primitive Dirichlet character x
     """
     # xx = x.primitive()
     assert x.is_primitive()
     q = x.conductor()
     # what level will the twist live on?
     level = self.level()
     qq = self.character().conductor()
     new_level = lcm(self.level(), lcm(q * q, q * qq))
     D = DirichletGroup(new_level)
     new_x = D(self.character()) * D(x) * D(x)
     ix = D.list().index(new_x)
     #  the correct space
     NS = WebModFormSpace(self._k, new_level, ix, self._prec)
     # have to find whih form wee want
     NS.galois_decomposition()
     M = NS.sturm_bound() + len(divisors(new_level))
     C = self.coefficients(range(M))
     for label in NS._galois_orbits_labels:
         wmf_logger.debug("label={0}".format(label))
         FT = NS.f(label)
         CT = FT.f.coefficients(M)
         wmf_logger.debug("{0}".format(CT))
         K = FT.f.hecke_eigenvalue_field()
         try:
             for n in range(2, M):
                 if(new_level % n + 1 == 0):
                     continue
                 wmf_logger.debug("n={0}".format(n))
                 ct = CT[n]
                 c = K(x(n)) * K(C[n])
                 wmf_logger.debug("{0} {1}".format(ct, c))
                 if ct != c:
                     raise StopIteration()
         except StopIteration:
             pass
         else:
             wmf_logger.debug("Twist of f={0}".format(FT))
     return FT
Beispiel #2
0
 def set_table_browsing(self,skip=[0,0],limit=[(2,16),(1,50)],keys=['Weight','Level'],character=0,dimension_fun=dimension_new_cusp_forms,title='Dimension of newforms'):
     r"""
     Table of Holomorphic modular forms spaces.
     Skip tells you how many chunks of data you want to skip (from the geginning) and limit tells you how large each chunk is.
     INPUT:
     - dimension_fun should be a function which gives you the desired dimensions, as functions of level N and weight k
     - character = 0 for trivial character and 1 for Kronecker symbol.
       set to 'all' for all characters.
     """
     self._keys=keys
     self._skip=skip
     self._limit=limit
     self._metadata=[]
     self._title=''
     self._cols=[]
     self.table={}
     self._character = character
     emf_logger.debug("skip= {0}".format(self._skip))
     emf_logger.debug("limit= {0}".format(self._limit))
     il  = self._keys.index('Level')
     iwt = self._keys.index('Weight')
     level_len = self._limit[il][1]-self._limit[il][0]+1
     level_ll=self._skip[il]*level_len+self._limit[il][0];   level_ul=self._skip[il]*level_len+self._limit[il][1]
     wt_len = self._limit[iwt][1]-self._limit[iwt][0]+1
     wt_ll=self._skip[iwt]*wt_len+self._limit[iwt][0]; wt_ul=self._skip[iwt]*wt_len+self._limit[iwt][1]
     if level_ll<1: level_l=1
     self._table={}
     self._table['rows']=[]
     self._table['col_heads']=[] #range(wt_ll,wt_ul+1)
     self._table['row_heads']=[] #range(level_ll,level_ul+1)
     emf_logger.debug("wt_range: {0} -- {1}".format(wt_ll,wt_ul))
     emf_logger.debug("level_range: {0} -- {1}".format(level_ll,level_ul))
     if character in [0,1]:
         if level_ll == level_ul:
             N=level_ll
             self._table['rowhead']='Weight'
             if character==0:
                 self._table['row_heads']=['Trivial character']
             else:
                 self._table['row_heads']=['\( \\( \frac{\cdot}{N} \\)\)']
             row=[]
             for k in range(wt_ll,wt_ul+1):
                 if character == 0 and is_odd(k):
                     continue
                 try:
                     if character==0:
                         d = dimension_fun(N,k)
                     elif character==1:
                         x = kronecker_character_upside_down(N)
                         d = dimension_fun(x,k)
                 except Exception as ex:
                     emf_logger.critical("Exception: {0}. \n Could not compute the dimension with function {0}".format(ex,dimension_fun))
                 url = url_for('emf.render_elliptic_modular_form_browsing',level=N,weight=k)
                 if not k in self._table['col_heads']:
                     self._table['col_heads'].append(k)
                 row.append({'N':N,'k':k,'url':url,'dim':d})
             self._table['rows'].append(row)                
         else:
             for N in range(level_ll,level_ul+1):
                 if not N in self._table['row_heads']:
                     self._table['row_heads'].append(N)
                 row=[]
                 for k in range(wt_ll,wt_ul+1):
                     if character == 0 and is_odd(k):
                         continue
                     try:
                         if character==0:
                             d = dimension_fun(N,k)
                         elif character==1:
                             x = kronecker_character_upside_down(N)
                             d = dimension_fun(x,k)
                     except Exception as ex:
                         emf_logger.critical("Exception: {0}. \n Could not compute the dimension with function {0}".format(ex,dimension_fun))
                     url = url_for('emf.render_elliptic_modular_form_browsing',level=N,weight=k)
                     if not k in self._table['col_heads']:
                         self._table['col_heads'].append(k)
                     row.append({'N':N,'k':k,'url':url,'dim':d})
                 self._table['rows'].append(row)
     elif character=='all':
         # make table with all characters.
         self._table['characters']=dict()
         if level_ll == level_ul:
             N = level_ll
             D = DirichletGroup(N)
             emf_logger.debug("I am here!")
             self._table['rowhead']='Character&nbsp;\&nbspWeight'
             for x in D:
                 xi = D.list().index(x)
                 row=[]
                 self._table['row_heads'].append(xi)
                 for k in range(wt_ll,wt_ul+1):
                     if not k in self._table['col_heads']:              
                         self._table['col_heads'].append(k)
                     try:
                         d = dimension_fun(x,k)
                     except Exception as ex:
                         emf_logger.critical("Exception: {0} \n Could not compute the dimension with function {0}".format(ex,dimension_fun))
                         d = -1
                     url = url_for('emf.render_elliptic_modular_form_space',level=N,weight=k,character=xi)
                     row.append({'N':N,'k':k,'chi':xi,'url':url,'dim':d})
                 self._table['rows'].append(row)                            
         else:
             for N in range(level_ll,level_ul+1):
                 self._table['row_heads'].append(N)
                 self._table['characters'][N]=list()
                 row=[]
                 if N==0: continue
                 D = DirichletGroup(N)
                 for k in range(wt_ll,wt_ul+1):
                     tbl=[]
                     for x in D:
                         xi = D.list().index(x)
                         if not N in self._table['characters'][N]:              
                             self._table['characters'][N].append(xi)
                         if x.is_even() and is_odd(k):
                             continue
                         if x.is_odd() and is_even(k):
                             continue
                         try:
                             d = dimension_fun(x,k)
                         except Exception as ex:
                             emf_logger.critical("Exception: {0} \n Could not compute the dimension with function {0}".format(ex,dimension_fun))
                         url = url_for('emf.render_elliptic_modular_form_browsing',level=N,weight=k)
                     if not k in self._table['col_heads']:
                         self._table['col_heads'].append(k)
                     tbl.append({'N':N,'k':k,'chi':xi,'url':url,'dim':d})
                     row.append(tbl)
                 self._table['rows'].append(row)            
Beispiel #3
0
 def set_table_browsing(self,
                        skip=[0, 0],
                        limit=[(2, 16), (1, 50)],
                        keys=['Weight', 'Level'],
                        character=0,
                        dimension_fun=dimension_new_cusp_forms,
                        title='Dimension of newforms'):
     r"""
     Table of Holomorphic modular forms spaces.
     Skip tells you how many chunks of data you want to skip (from the geginning) and limit tells you how large each chunk is.
     INPUT:
     - dimension_fun should be a function which gives you the desired dimensions, as functions of level N and weight k
     - character = 0 for trivial character and 1 for Kronecker symbol.
       set to 'all' for all characters.
     """
     self._keys = keys
     self._skip = skip
     self._limit = limit
     self._metadata = []
     self._title = ''
     self._cols = []
     self.table = {}
     self._character = character
     emf_logger.debug("skip= {0}".format(self._skip))
     emf_logger.debug("limit= {0}".format(self._limit))
     il = self._keys.index('Level')
     iwt = self._keys.index('Weight')
     level_len = self._limit[il][1] - self._limit[il][0] + 1
     level_ll = self._skip[il] * level_len + self._limit[il][0]
     level_ul = self._skip[il] * level_len + self._limit[il][1]
     wt_len = self._limit[iwt][1] - self._limit[iwt][0] + 1
     wt_ll = self._skip[iwt] * wt_len + self._limit[iwt][0]
     wt_ul = self._skip[iwt] * wt_len + self._limit[iwt][1]
     if level_ll < 1: level_l = 1
     self._table = {}
     self._table['rows'] = []
     self._table['col_heads'] = []  #range(wt_ll,wt_ul+1)
     self._table['row_heads'] = []  #range(level_ll,level_ul+1)
     emf_logger.debug("wt_range: {0} -- {1}".format(wt_ll, wt_ul))
     emf_logger.debug("level_range: {0} -- {1}".format(level_ll, level_ul))
     if character in [0, 1]:
         if level_ll == level_ul:
             N = level_ll
             self._table['rowhead'] = 'Weight'
             if character == 0:
                 self._table['row_heads'] = ['Trivial character']
             else:
                 self._table['row_heads'] = ['\( \\( \frac{\cdot}{N} \\)\)']
             row = []
             for k in range(wt_ll, wt_ul + 1):
                 if character == 0 and is_odd(k):
                     continue
                 try:
                     if character == 0:
                         d = dimension_fun(N, k)
                     elif character == 1:
                         x = kronecker_character_upside_down(N)
                         d = dimension_fun(x, k)
                 except Exception as ex:
                     emf_logger.critical(
                         "Exception: {0}. \n Could not compute the dimension with function {0}"
                         .format(ex, dimension_fun))
                 url = url_for('emf.render_elliptic_modular_form_browsing',
                               level=N,
                               weight=k)
                 if not k in self._table['col_heads']:
                     self._table['col_heads'].append(k)
                 row.append({'N': N, 'k': k, 'url': url, 'dim': d})
             self._table['rows'].append(row)
         else:
             for N in range(level_ll, level_ul + 1):
                 if not N in self._table['row_heads']:
                     self._table['row_heads'].append(N)
                 row = []
                 for k in range(wt_ll, wt_ul + 1):
                     if character == 0 and is_odd(k):
                         continue
                     try:
                         if character == 0:
                             d = dimension_fun(N, k)
                         elif character == 1:
                             x = kronecker_character_upside_down(N)
                             d = dimension_fun(x, k)
                     except Exception as ex:
                         emf_logger.critical(
                             "Exception: {0}. \n Could not compute the dimension with function {0}"
                             .format(ex, dimension_fun))
                     url = url_for(
                         'emf.render_elliptic_modular_form_browsing',
                         level=N,
                         weight=k)
                     if not k in self._table['col_heads']:
                         self._table['col_heads'].append(k)
                     row.append({'N': N, 'k': k, 'url': url, 'dim': d})
                 self._table['rows'].append(row)
     elif character == 'all':
         # make table with all characters.
         self._table['characters'] = dict()
         if level_ll == level_ul:
             N = level_ll
             D = DirichletGroup(N)
             emf_logger.debug("I am here!")
             self._table['rowhead'] = 'Character&nbsp;\&nbspWeight'
             for x in D:
                 xi = D.list().index(x)
                 row = []
                 self._table['row_heads'].append(xi)
                 for k in range(wt_ll, wt_ul + 1):
                     if not k in self._table['col_heads']:
                         self._table['col_heads'].append(k)
                     try:
                         d = dimension_fun(x, k)
                     except Exception as ex:
                         emf_logger.critical(
                             "Exception: {0} \n Could not compute the dimension with function {0}"
                             .format(ex, dimension_fun))
                         d = -1
                     url = url_for('emf.render_elliptic_modular_form_space',
                                   level=N,
                                   weight=k,
                                   character=xi)
                     row.append({
                         'N': N,
                         'k': k,
                         'chi': xi,
                         'url': url,
                         'dim': d
                     })
                 self._table['rows'].append(row)
         else:
             for N in range(level_ll, level_ul + 1):
                 self._table['row_heads'].append(N)
                 self._table['characters'][N] = list()
                 row = []
                 if N == 0: continue
                 D = DirichletGroup(N)
                 for k in range(wt_ll, wt_ul + 1):
                     tbl = []
                     for x in D:
                         xi = D.list().index(x)
                         if not N in self._table['characters'][N]:
                             self._table['characters'][N].append(xi)
                         if x.is_even() and is_odd(k):
                             continue
                         if x.is_odd() and is_even(k):
                             continue
                         try:
                             d = dimension_fun(x, k)
                         except Exception as ex:
                             emf_logger.critical(
                                 "Exception: {0} \n Could not compute the dimension with function {0}"
                                 .format(ex, dimension_fun))
                         url = url_for(
                             'emf.render_elliptic_modular_form_browsing',
                             level=N,
                             weight=k)
                     if not k in self._table['col_heads']:
                         self._table['col_heads'].append(k)
                     tbl.append({
                         'N': N,
                         'k': k,
                         'chi': xi,
                         'url': url,
                         'dim': d
                     })
                     row.append(tbl)
                 self._table['rows'].append(row)