def set_gaga_properties(L): ''' Sets the properties in the properties box in the upper right corner ''' ans = [('Degree', str(L.degree))] ans.append(('Level', str(L.level))) ans.append(('Sign', styleTheSign(L.sign))) if L.selfdual: sd = 'Self-dual' else: sd = 'Not self-dual' ans.append((None, sd)) if L.algebraic: ans.append(('Motivic weight', str(L.motivic_weight))) if L.primitive: prim = 'Primitive' else: prim = 'Not primitive' # ans.append((None, prim)) Disabled until fixed return ans
def set_gaga_properties(L): ''' Sets the properties in the properties box in the upper right corner ''' ans = [('Degree', str(L.degree))] ans.append(('Conductor', str(L.level))) ans.append(('Sign', "$"+styleTheSign(L.sign)+"$")) if L.selfdual: ans.append(('Self-dual', "yes")) else: ans.append(('Self-dual', "no")) if L.algebraic: ans.append(('Motivic weight', str(L.motivic_weight))) # Disable until fixed # prim = 'Primitive' if L.primitive else 'Not primitive' # ans.append((None, prim)) return ans
def general_webpagedata(self): info = {} try: info['support'] = self.support except AttributeError: info['support'] = '' info['Ltype'] = self.Ltype() info['label'] = self.label info['credit'] = self.credit info['degree'] = int(self.degree) info['conductor'] = self.level if not is_prime(int(self.level)): info['conductor_factored'] = latex(factor(int(self.level))) info['sign'] = "$" + styleTheSign(self.sign) + "$" info['algebraic'] = self.algebraic if self.selfdual: info['selfdual'] = 'yes' else: info['selfdual'] = 'no' if self.primitive: info['primitive'] = 'yes' else: info['primitive'] = 'no' info['dirichlet'] = lfuncDShtml(self, "analytic") # Hack, fix this more general? info['dirichlet'] = info['dirichlet'].replace('*I','<em>i</em>') info['eulerproduct'] = lfuncEPtex(self, "abstract") info['functionalequation'] = lfuncFEtex(self, "analytic") info['functionalequationSelberg'] = lfuncFEtex(self, "selberg") if hasattr(self, 'positive_zeros'): info['positive_zeros'] = self.positive_zeros info['negative_zeros'] = self.negative_zeros if hasattr(self, 'plot'): info['plot'] = self.plot if hasattr(self, 'factorization'): info['factorization'] = self.factorization if self.fromDB and self.algebraic: info['dirichlet_arithmetic'] = lfuncDShtml(self, "arithmetic") info['eulerproduct_arithmetic'] = lfuncEPtex(self, "arithmetic") info['functionalequation_arithmetic'] = lfuncFEtex(self, "arithmetic") if self.motivic_weight % 2 == 0: arith_center = "\\frac{" + str(1 + self.motivic_weight) + "}{2}" else: arith_center = str(ZZ(1)/2 + self.motivic_weight/2) svt_crit = specialValueTriple(self, 0.5, '\\frac12',arith_center) info['sv_critical'] = svt_crit[0] + "\\ =\\ " + svt_crit[2] info['sv_critical_analytic'] = [svt_crit[0], svt_crit[2]] info['sv_critical_arithmetic'] = [svt_crit[1], svt_crit[2]] if self.motivic_weight % 2 == 1: arith_edge = "\\frac{" + str(2 + self.motivic_weight) + "}{2}" else: arith_edge = str(ZZ(1) + self.motivic_weight/2) svt_edge = specialValueTriple(self, 1, '1',arith_edge) info['sv_edge'] = svt_edge[0] + "\\ =\\ " + svt_edge[2] info['sv_edge_analytic'] = [svt_edge[0], svt_edge[2]] info['sv_edge_arithmetic'] = [svt_edge[1], svt_edge[2]] info['st_group'] = self.st_group info['st_link'] = self.st_link info['rank'] = self.order_of_vanishing info['motivic_weight'] = self.motivic_weight elif self.Ltype() != "artin" or (self.Ltype() == "artin" and self.sign != 0): try: info['sv_edge'] = specialValueString(self, 1, '1') info['sv_critical'] = specialValueString(self, 0.5, '1/2') except: info['sv_critical'] = "L(1/2): not computed" info['sv_edge'] = "L(1): not computed" return info
def general_webpagedata(self): info = {} try: info['support'] = self.support except AttributeError: info['support'] = '' info['Ltype'] = self.Ltype() try: info['label'] = self.label except AttributeError: info['label'] = "" try: info['credit'] = self.credit except AttributeError: info['credit'] = "" info['degree'] = int(self.degree) info['conductor'] = self.level if not is_prime(int(self.level)): info['conductor_factored'] = latex(factor(int(self.level))) info['sign'] = "$" + styleTheSign(self.sign) + "$" info['algebraic'] = self.algebraic if self.selfdual: info['selfdual'] = 'yes' else: info['selfdual'] = 'no' if self.primitive: info['primitive'] = 'yes' else: info['primitive'] = 'no' info['dirichlet'] = lfuncDShtml(self, "analytic") # Hack, fix this more general? info['dirichlet'] = info['dirichlet'].replace('*I', '<em>i</em>') info['eulerproduct'] = lfuncEPtex(self, "abstract") info['functionalequation'] = lfuncFEtex(self, "analytic") info['functionalequationSelberg'] = lfuncFEtex(self, "selberg") if hasattr(self, 'positive_zeros'): info['positive_zeros'] = self.positive_zeros info['negative_zeros'] = self.negative_zeros if hasattr(self, 'plot'): info['plot'] = self.plot if hasattr(self, 'factorization'): info['factorization'] = self.factorization if self.fromDB and self.algebraic: info['dirichlet_arithmetic'] = lfuncDShtml(self, "arithmetic") info['eulerproduct_arithmetic'] = lfuncEPtex(self, "arithmetic") info['functionalequation_arithmetic'] = lfuncFEtex( self, "arithmetic") if self.motivic_weight % 2 == 0: arith_center = "\\frac{" + str(1 + self.motivic_weight) + "}{2}" else: arith_center = str(ZZ(1) / 2 + self.motivic_weight / 2) svt_crit = specialValueTriple(self, 0.5, '\\frac12', arith_center) info['sv_critical'] = svt_crit[0] + "\\ =\\ " + svt_crit[2] info['sv_critical_analytic'] = [svt_crit[0], svt_crit[2]] info['sv_critical_arithmetic'] = [svt_crit[1], svt_crit[2]] if self.motivic_weight % 2 == 1: arith_edge = "\\frac{" + str(2 + self.motivic_weight) + "}{2}" else: arith_edge = str(ZZ(1) + self.motivic_weight / 2) svt_edge = specialValueTriple(self, 1, '1', arith_edge) info['sv_edge'] = svt_edge[0] + "\\ =\\ " + svt_edge[2] info['sv_edge_analytic'] = [svt_edge[0], svt_edge[2]] info['sv_edge_arithmetic'] = [svt_edge[1], svt_edge[2]] chilatex = "$\chi_{" + str(self.charactermodulus) + "} (" + str( self.characternumber) + ", \cdot )$" info['chi'] = '<a href="' + url_for( 'characters.render_Dirichletwebpage', modulus=self.charactermodulus, number=self.characternumber) info['chi'] += '">' + chilatex + '</a>' info['st_group'] = self.st_group info['st_link'] = self.st_link info['rank'] = self.order_of_vanishing info['motivic_weight'] = self.motivic_weight elif self.Ltype() != "artin" or (self.Ltype() == "artin" and self.sign != 0): try: info['sv_edge'] = specialValueString(self, 1, '1') info['sv_critical'] = specialValueString(self, 0.5, '1/2') except: info['sv_critical'] = "L(1/2): not computed" info['sv_edge'] = "L(1): not computed" return info
def initLfunction(L, args, request): ''' Sets the properties to show on the homepage of an L-function page. ''' info = {'title': L.title} # if 'title_arithmetic' in L: try: info['title_arithmetic'] = L.title_arithmetic info['title_analytic'] = L.title_analytic except AttributeError: pass try: info['citation'] = L.citation except AttributeError: info['citation'] = "" try: info['support'] = L.support except AttributeError: info['support'] = "" info['Ltype'] = L.Ltype() # Here we should decide which values are indeed special values # According to Brian, odd degree has special value at 1, and even # degree has special value at 1/2. # (however, I'm not sure this is true if L is not primitive -- GT) # Now we usually display both if L.Ltype() == "genus2curveQ": if L.motivic_weight % 2 == 0: arith_center = "\\frac{" + str(1 + L.motivic_weight) + "}{2}" else: arith_center = str(ZZ(1)/2 + L.motivic_weight/2) svt_crit = specialValueTriple(L, 0.5, '\\frac12',arith_center) # info['sv_critical'] = specialValueString(L, 0.5, '1/2') # info['sv_critical_arithmetic'] = specialValueString(L, 0.5, str(ZZ(1)/2 + L.motivic_weight/2),'arithmetic') info['sv_critical'] = svt_crit[0] + "\\ =\\ " + svt_crit[2] info['sv_critical_analytic'] = [svt_crit[0], svt_crit[2]] info['sv_critical_arithmetic'] = [svt_crit[1], svt_crit[2]] if L.motivic_weight % 2 == 1: arith_edge = "\\frac{" + str(2 + L.motivic_weight) + "}{2}" else: arith_edge = str(ZZ(1) + L.motivic_weight/2) svt_edge = specialValueTriple(L, 1, '1',arith_edge) info['sv_edge'] = svt_edge[0] + "\\ =\\ " + svt_edge[2] info['sv_edge_analytic'] = [svt_edge[0], svt_edge[2]] info['sv_edge_arithmetic'] = [svt_edge[1], svt_edge[2]] elif L.Ltype() != "artin" or (L.Ltype() == "artin" and L.sign != 0): # if is_even(L.degree) : # info['sv_critical'] = specialValueString(L, 0.5, '1/2') # if is_odd(L.degree): # info['sv_edge'] = specialValueString(L, 1, '1') info['sv_edge'] = specialValueString(L, 1, '1') info['sv_critical'] = specialValueString(L, 0.5, '1/2') info['args'] = args info['credit'] = L.credit #try: # info['citation'] = L.citation #except: # pass try: info['factorization'] = L.factorization except: pass try: info['url'] = L.url except: info['url'] = '' info['degree'] = int(L.degree) info['zeroeslink'] = (request.url.replace('/L/', '/L/Zeros/'). replace('/Lfunction/', '/L/Zeros/'). replace('/L-function/', '/L/Zeros/')) # url_for('zeroesLfunction', **args) info['plotlink'] = (request.url.replace('/L/', '/L/Plot/'). replace('/Lfunction/', '/L/Plot/'). replace('/L-function/', '/L/Plot/')) # info['plotlink'] = url_for('plotLfunction', **args) info['bread'] = [] info['properties2'] = set_gaga_properties(L) # Create friendlink by removing 'L/' and ending '/' friendlink = request.url.replace('/L/', '/').replace('/L-function/', '/').replace('/Lfunction/', '/') splitlink = friendlink.rpartition('/') friendlink = splitlink[0] + splitlink[2] logger.debug(L.Ltype()) if L.Ltype() == 'maass': if L.group == 'GL2': minNumberOfCoefficients = 100 # TODO: Fix this to take level into account if len(L.dirichlet_coefficients) < minNumberOfCoefficients: info['zeroeslink'] = '' info['plotlink'] = '' info['bread'] = get_bread(2, [('Maass Form', url_for('.l_function_maass_browse_page')), ('\(' + L.texname + '\)', request.url)]) info['friends'] = [('Maass Form ', friendlink)] else: info['bread'] = get_bread(L.degree, [('Maass Form', url_for('.l_function_maass_gln_browse_page', degree='degree' + str(L.degree))), (L.dbid, request.url)]) elif L.Ltype() == 'riemann': info['bread'] = get_bread(1, [('Riemann Zeta', request.url)]) info['friends'] = [('\(\mathbb Q\)', url_for('number_fields.by_label', label='1.1.1.1')), ('Dirichlet Character \(\\chi_{1}(1,\\cdot)\)',url_for('characters.render_Dirichletwebpage', modulus=1, number=1))] elif L.Ltype() == 'dirichlet': mod, num = L.charactermodulus, L.characternumber Lpattern = r"\(L(s,\chi_{%s}(%s,·))\)" if mod > 1: pmod,pnum = WebDirichlet.prevprimchar(mod, num) Lprev = (Lpattern%(pmod,pnum),url_for('.l_function_dirichlet_page',modulus=pmod,number=pnum)) else: Lprev = ('','') nmod,nnum = WebDirichlet.nextprimchar(mod, num) Lnext = (Lpattern%(nmod,nnum),url_for('.l_function_dirichlet_page',modulus=nmod,number=nnum)) info['navi'] = (Lprev,Lnext) snum = str(L.characternumber) smod = str(L.charactermodulus) charname = WebDirichlet.char2tex(smod, snum) info['bread'] = get_bread(1, [(charname, request.url)]) info['friends'] = [('Dirichlet Character ' + str(charname), friendlink)] elif L.Ltype() == 'ellipticcurveQ': label = L.label while friendlink[len(friendlink) - 1].isdigit(): # Remove any number at the end to get isogeny class url friendlink = friendlink[0:len(friendlink) - 1] info['friends'] = [('Isogeny class ' + label, friendlink)] for i in range(1, L.nr_of_curves_in_class + 1): info['friends'].append(('Elliptic curve ' + label + str(i), friendlink + str(i))) if L.modform: info['friends'].append(('Modular form ' + label.replace('.', '.2'), url_for("emf.render_elliptic_modular_forms", level=L.modform['level'], weight=2, character=0, label=L.modform['iso']))) info['friends'].append(('L-function ' + label.replace('.', '.2'), url_for('.l_function_emf_page', level=L.modform['level'], weight=2, character=0, label=L.modform['iso'], number=0))) info['friends'].append( ('Symmetric square L-function', url_for(".l_function_ec_sym_page", power='2', label=label))) info['friends'].append( ('Symmetric cube L-function', url_for(".l_function_ec_sym_page", power='3', label=label))) info['bread'] = get_bread(2, [('Elliptic curve', url_for('.l_function_ec_browse_page')), (label, url_for('.l_function_ec_page', label=label))]) elif L.Ltype() == 'ellipticmodularform': friendlink = friendlink.rpartition('/')[0] # Strips off the embedding # number for the L-function if L.character: info['friends'] = [('Modular form ' + str( L.level) + '.' + str(L.weight) + '.' + str(L.character) + str(L.label), friendlink)] else: info['friends'] = [('Modular form ' + str(L.level) + '.' + str(L.weight) + str(L.label), friendlink)] if L.ellipticcurve: info['friends'].append( ('EC isogeny class ' + L.ellipticcurve, url_for("ec.by_ec_label", label=L.ellipticcurve))) info['friends'].append(('L-function ' + str(L.level) + '.' + str(L.label), url_for('.l_function_ec_page', label=L.ellipticcurve))) for i in range(1, L.nr_of_curves_in_class + 1): info['friends'].append(('Elliptic curve ' + L.ellipticcurve + str(i), url_for("ec.by_ec_label", label=L.ellipticcurve + str(i)))) info['friends'].append( ('Symmetric square L-function', url_for(".l_function_ec_sym_page", power='2', label=L.ellipticcurve))) info['friends'].append( ('Symmetric cube L-function', url_for(".l_function_ec_sym_page", power='3', label=L.ellipticcurve))) elif L.Ltype() == 'hilbertmodularform': friendlink = '/'.join(friendlink.split('/')[:-1]) info['friends'] = [('Hilbert Modular Form', friendlink.rpartition('/')[0])] elif L.Ltype() == 'dedekindzeta': info['friends'] = [('Number Field', friendlink)] elif L.Ltype() in ['lcalcurl', 'lcalcfile']: info['bread'] = [('L-functions', url_for('.l_function_top_page'))] elif L.Ltype() == 'SymmetricPower': def ordinal(n): if n == 2: return "Square" elif n == 3: return "Cube" elif 10 <= n % 100 < 20: return str(n) + "th Power" else: return str(n) + {1: 'st', 2: 'nd', 3: 'rd'}.get(n % 10, "th") + " Power" if L.m == 2: info['bread'] = get_bread(3, [("Symmetric square of Elliptic curve", url_for('.l_function_ec_sym2_browse_page')), (L.label, url_for('.l_function_ec_sym_page', label=L.label,power=L.m))]) elif L.m == 3: info['bread'] = get_bread(4, [("Symmetric cube of Elliptic curve", url_for('.l_function_ec_sym3_browse_page')), (L.label, url_for('.l_function_ec_sym_page', label=L.label,power=L.m))]) else: info['bread'] = [('L-functions', url_for('.l_function_top_page')), ('Symmetric %s of Elliptic curve ' % ordinal(L.m) + str(L.label), url_for('.l_function_ec_sym_page', label=L.label,power=L.m))] friendlink = request.url.replace('/L/SymmetricPower/%d/' % L.m, '/') splitlink = friendlink.rpartition('/') friendlink = splitlink[0] + splitlink[2] friendlink2 = request.url.replace('/L/SymmetricPower/%d/' % L.m, '/L/') splitlink = friendlink2.rpartition('/') friendlink2 = splitlink[0] + splitlink[2] info['friends'] = [('Isogeny class ' + L.label, friendlink), ('Symmetric 1st Power', friendlink2)] for j in range(2, L.m + 2): if j != L.m: friendlink3 = request.url.replace('/L/SymmetricPower/%d/' % L.m, '/L/SymmetricPower/%d/' % j) info['friends'].append(('Symmetric %s' % ordinal(j), friendlink3)) elif L.Ltype() == 'siegelnonlift' or L.Ltype() == 'siegeleisenstein' or L.Ltype() == 'siegelklingeneisenstein' or L.Ltype() == 'siegelmaasslift': friendlink = friendlink.rpartition('/')[0] #strip off embedding number for L-function weight = str(L.weight) number = str(L.number) info['friends'] = [('Siegel Modular Form ' + weight + '_' + L.orbit, friendlink)] elif L.Ltype() == "artin": # info['zeroeslink'] = '' # info['plotlink'] = '' info['friends'] = [('Artin representation', L.artin.url_for())] if L.sign == 0: # The root number is now unknown info['zeroeslink'] = '' info['plotlink'] = '' elif L.Ltype() == "hgmQ": # undo the splitting above newlink = friendlink.rpartition('t') friendlink = newlink[0]+'/t'+newlink[2] #info['friends'] = [('Hypergeometric motive ', friendlink.replace("t","/t"))] # The /L/ trick breaks down for motives, because we have a scheme for the L-functions themselves info['friends'] = [('Hypergeometric motive ', friendlink)] # The /L/ trick breaks down for motives, because we have a scheme for the L-functions themselves # the code below should be in Lfunction.py info['conductor'] = L.level if not is_prime(L.level): info['conductor_factored'] = latex(factor(L.level)) info['degree'] = L.degree info['sign'] = "$"+styleTheSign(L.sign)+"$" if L.selfdual: info['selfdual'] = 'yes' else: info['selfdual'] = 'no' if L.primitive: info['primitive'] = 'yes' else: info['primitive'] = 'no' info['dirichlet'] = lfuncDShtml(L, "analytic") info['eulerproduct'] = lfuncEPtex(L, "abstract") info['functionalequation'] = lfuncFEtex(L, "analytic") info['functionalequationSelberg'] = lfuncFEtex(L, "selberg") if L.Ltype() == "genus2curveQ": info['dirichlet_arithmetic'] = lfuncDShtml(L, "arithmetic") info['eulerproduct_arithmetic'] = lfuncEPtex(L, "arithmetic") info['functionalequation_arithmetic'] = lfuncFEtex(L, "arithmetic") if len(request.args) == 0: lcalcUrl = request.url + '?download=lcalcfile' else: lcalcUrl = request.url + '&download=lcalcfile' info['downloads'] = [('Lcalcfile', lcalcUrl)] return info
def general_webpagedata(self): info = {} try: info['support'] = self.support except AttributeError: info['support'] = '' info['Ltype'] = self.Ltype() try: info['label'] = self.label except AttributeError: info['label'] = "" try: info['credit'] = self.credit except AttributeError: info['credit'] = "" info['degree'] = int(self.degree) info['conductor'] = self.level if not is_prime(int(self.level)): if self.level >= 10**8: info['conductor'] = latex(self.level_factored) else: info['conductor_factored'] = latex(self.level_factored) info['sign'] = "$" + styleTheSign(self.sign) + "$" info['algebraic'] = self.algebraic if self.selfdual: info['selfdual'] = 'yes' else: info['selfdual'] = 'no' if self.primitive: info['primitive'] = 'yes' else: info['primitive'] = 'no' info['dirichlet'] = lfuncDShtml(self, "analytic") # Hack, fix this more general? info['dirichlet'] = info['dirichlet'].replace('*I','<em>i</em>') info['eulerproduct'] = lfuncEPtex(self, "abstract") info['functionalequation'] = lfuncFEtex(self, "analytic") info['functionalequationSelberg'] = lfuncFEtex(self, "selberg") if hasattr(self, 'positive_zeros'): info['positive_zeros'] = self.positive_zeros info['negative_zeros'] = self.negative_zeros if hasattr(self, 'plot'): info['plot'] = self.plot if hasattr(self, 'factorization'): info['factorization'] = self.factorization if self.fromDB and self.algebraic: info['dirichlet_arithmetic'] = lfuncDShtml(self, "arithmetic") info['eulerproduct_arithmetic'] = lfuncEPtex(self, "arithmetic") info['functionalequation_arithmetic'] = lfuncFEtex(self, "arithmetic") if self.motivic_weight % 2 == 0: arith_center = "\\frac{" + str(1 + self.motivic_weight) + "}{2}" else: arith_center = str(ZZ(1)/2 + self.motivic_weight/2) svt_crit = specialValueTriple(self, 0.5, '\\frac12',arith_center) info['sv_critical'] = svt_crit[0] + "\\ =\\ " + svt_crit[2] info['sv_critical_analytic'] = [svt_crit[0], svt_crit[2]] info['sv_critical_arithmetic'] = [svt_crit[1], svt_crit[2]] if self.motivic_weight % 2 == 1: arith_edge = "\\frac{" + str(2 + self.motivic_weight) + "}{2}" else: arith_edge = str(ZZ(1) + self.motivic_weight/2) svt_edge = specialValueTriple(self, 1, '1',arith_edge) info['sv_edge'] = svt_edge[0] + "\\ =\\ " + svt_edge[2] info['sv_edge_analytic'] = [svt_edge[0], svt_edge[2]] info['sv_edge_arithmetic'] = [svt_edge[1], svt_edge[2]] chilatex = "$\chi_{" + str(self.charactermodulus) + "} (" + str(self.characternumber) +", \cdot )$" info['chi'] = '' if self.charactermodulus != self.level: info['chi'] += "induced by " info['chi'] += '<a href="' + url_for('characters.render_Dirichletwebpage', modulus=self.charactermodulus, number=self.characternumber) info['chi'] += '">' + chilatex + '</a>' info['st_group'] = self.st_group info['st_link'] = self.st_link info['rank'] = self.order_of_vanishing info['motivic_weight'] = r'\(%d\)' % self.motivic_weight elif self.Ltype() == "riemann": info['sv_edge'] = r"\[\zeta(1) \approx $\infty$\]" info['sv_critical'] = r"\[\zeta(1/2) \approx -1.460354508\]" elif self.Ltype() != "artin" or (self.Ltype() == "artin" and self.sign != 0): try: info['sv_edge'] = specialValueString(self, 1, '1') info['sv_critical'] = specialValueString(self, 0.5, '1/2') except: info['sv_critical'] = "L(1/2): not computed" info['sv_edge'] = "L(1): not computed" return info