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
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 \ Weight' 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)
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 \ Weight' 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)