예제 #1
0
 def add_row(self, nflabel):
     nf = WebNumberField(nflabel)
     #nflink = (nflabel, url_for('number_fields.by_label',label=nflabel))
     nflink = (nflabel,
               url_for('characters.render_Heckewebpage',
                       number_field=nflabel))
     F = WebHeckeFamily(number_field=nflabel)
     self._contents.append((nflink, nf.signature(), nf.web_poly()))
예제 #2
0
 def vflabel(self):
   order2 = self.order if self.order % 4 != 2 else self.order / 2
   if order2 == 1:
       return '1.1.1.1'
   elif order2 == 4:
       return '2.0.4.1'
   valuewnf =  WebNumberField.from_cyclo(order2)
   if not valuewnf.is_null():
       return valuewnf.label
   else:
       return ''
예제 #3
0
 def label(self):
     if "label" in self._data.keys():
         return self._data["label"]
     else:
         # from number_fields.number_field import poly_to_field_label
         # pol = PolynomialRing(QQ, 'x')(map(str,self.polynomial()))
         # label = poly_to_field_label(pol)
         label = WebNumberField.from_coeffs(self._data["Polynomial"]).get_label()
         if label:
             self._data["label"] = label
         return label
예제 #4
0
 def vflabel(self):
   order2 = self.order if self.order % 4 != 2 else self.order / 2
   if order2 == 1:
       return '1.1.1.1'
   elif order2 == 4:
       return '2.0.4.1'
   valuewnf =  WebNumberField.from_cyclo(order2)
   if not valuewnf.is_null():
       return valuewnf.label
   else:
       return ''
예제 #5
0
 def vflabel(self):
   _ = self.valuefield # make sure valuefield was computed
   order2 = self._order2
   if order2 == 1:
       return '1.1.1.1'
   elif order2 == 4:
       return '2.0.4.1'
   valuewnf =  WebNumberField.from_cyclo(order2)
   if not valuewnf.is_null():
       return valuewnf.label
   else:
       return ''
예제 #6
0
 def label(self):
     if "label" in self._data.keys():
         return self._data["label"]
     else:
         #from number_fields.number_field import poly_to_field_label
         #pol = PolynomialRing(QQ, 'x')(map(str,self.polynomial()))
         #label = poly_to_field_label(pol)
         label = WebNumberField.from_coeffs(
             self._data["Polynomial"]).get_label()
         if label:
             self._data["label"] = label
         return label
예제 #7
0
 def G_name(self):
     """
     More-or-less standardized name of the abstract group
     """
     from WebNumberField import WebNumberField
     import re
     wnf = WebNumberField.from_polredabs(self.polredabs())
     if not wnf.is_null():
         mygalstring = wnf.galois_string()
         if re.search('Trivial', mygalstring) is not None:
             return '$C_1$'
         # Have to remove dollar signs
         return mygalstring
     if self.polredabs().degree() < 12:
         # Let pari compute it for us now
         from sage.all import pari
         galt = int(list(pari('polgalois(' + str(self.polredabs()) + ')'))[2])
         from transitive_group import WebGaloisGroup
         tg = WebGaloisGroup.from_nt(self.polredabs().degree(), galt)
         return tg.display_short()
     return self._data["G-Name"]
예제 #8
0
 def G_name(self):
     """
     More-or-less standardized name of the abstract group
     """
     from WebNumberField import WebNumberField
     import re
     wnf = WebNumberField.from_polredabs(self.polredabs())
     if not wnf.is_null():
         mygalstring = wnf.galois_string()
         if re.search('Trivial', mygalstring) is not None:
             return '$C_1$'
         # Have to remove dollar signs
         return mygalstring
     if self.polredabs().degree() < 12:
         # Let pari compute it for us now
         from sage.all import pari
         galt = int(list(pari('polgalois(' + str(self.polredabs()) + ')'))[2])
         from transitive_group import WebGaloisGroup
         tg = WebGaloisGroup.from_nt(self.polredabs().degree(), galt)
         return tg.display_short()
     return self._data["G-Name"]
예제 #9
0
 def add_row(self, nflabel):
     nf = WebNumberField(nflabel)
     #nflink = (nflabel, url_for('number_fields.by_label',label=nflabel))
     nflink = (nflabel, url_for('characters.render_Heckewebpage',number_field=nflabel))
     #F = WebHeckeFamily(number_field=nflabel)
     self._contents.append( (nflink, nf.signature(), nf.web_poly() ) )
예제 #10
0
    def dirichletcharacter(self):

        #######################################################################################
        ##  Conrey's naming convention for Dirichlet Characters
        #######################################################################################

        G = DirichletGroup_conrey(self.modulus)
        G_sage = G.standard_dirichlet_group()
        self.level = self.modulus
        if self.modulus == 1 or self.number % self.modulus != 0:
            chi = G[self.number]
            chi_sage = chi.sage_character()
            self.chi_sage = chi_sage
            self.zetaorder = G_sage.zeta_order()
            # if len(chi_sage.values_on_gens()) == 1:
            ###    self.genvaluestex = latex(chi_sage.values_on_gens()[0])
            # else:
            ###    self.genvaluestex = latex(chi_sage.values_on_gens())
            # chizero = G_sage[0]
            self.char = str(chi)
            if chi.is_primitive():
                self.primitive = "True"
            else:
                self.primitive = "False"
            self.conductor = chi.conductor()
            self.order = chi.multiplicative_order()
            self.vals = chi.values()
            self.logvals = log_value(self.modulus, self.number)
            # self.logvals = map(chi.logvalue, range(1,self.modulus+1))
            # self.logvals = [latex_char_logvalue(k,True) for k in self.logvals]
            Gunits = G_sage.unit_gens()
            if self.modulus == 2:
                Gunits = [1]
            self.unitgens = latex_tuple(map(str, Gunits))
            self.genvalues = chi_sage.values_on_gens()  # what is the use ?
            self.genlogvalues = [chi.logvalue(k) for k in Gunits]
            self.genvaluestex = latex_tuple(map(latex_char_logvalue, self.genlogvalues))
            self.bound = 5 * 1024
            if chi.is_even():
                self.parity = 'Even'
            else:
                self.parity = 'Odd'
            if self.primitive == "False":
                self.inducedchar = chi.primitive_character()
                self.inducedchar_isprim = self.inducedchar.is_primitive()
                self.inducedchar_modulus = self.inducedchar.modulus()
                self.inducedchar_conductor = self.inducedchar.conductor()
                F = DirichletGroup_conrey(self.inducedchar_modulus)
                if self.number == 1:
                    self.inducedchar_number = 1
                else:
                    for chi in F:
                        j = chi.number()
                        if chi == self.inducedchar:
                            self.inducedchar_number = j
                            break
                self.inducedchar_tex = r"\(\chi_{%s}(%s,\cdot)\)" % (
                    self.inducedchar_modulus, self.inducedchar_number)
       # if self.primitive == 'True':
       #     self.primtf = True
       # else:
       #     self.primtf = False
            # Set data for related number fields
            order2 = int(self.order)
            if order2 % 4 == 2:
                order2 = order2 / 2
            self.valuefield = r'\(\mathbb{Q}(\zeta_{%d})\)' % order2
            if order2 == 1:
                self.valuefield = r'\(\mathbb{Q}\)'
            if order2 == 4:
                self.valuefield = r'\(\mathbb{Q}(i)\)'
            valuewnf = WebNumberField.from_cyclo(order2)
            if not valuewnf.is_null():
                self.valuefield_label = valuewnf.label
            else:
                self.valuefield_label = ''
            self.texname = r'\chi_{%d}(%d, \cdot)' % (self.modulus, self.number)
            self.kername = r'\(\mathbb{Q}(\zeta_{%d})^{\ker %s}\)' % (self.modulus, self.texname)

            if self.order < 16:
                pol = str(gp.galoissubcyclo(self.modulus, self.chi_sage.kernel()))
                sagepol = PolynomialRing(QQ, 'x')(pol)
                R = sagepol.parent()
                nf_pol = R(pari(sagepol).polredabs())
                self.nf_pol = "\( %s \)" % latex(nf_pol)
                wnf = WebNumberField.from_coeffs([int(c) for c in nf_pol.coeffs()])
                if wnf.is_null():
                    self.nf_friend = ''
                else:
                    self.nf_friend = '/NumberField/' + str(wnf.label)
                    self.nf_label = wnf.label
            else:
                self.nf_pol = ''
                self.nf_friend = ''

            if self.order == 2:
                if self.conductor % 2 == 1:
                    self.kronsymbol = r"\begin{equation} \chi_{%s}(a) = " % (self.number)
                    self.kronsymbol += r"\left(\frac{a}{%s}\right)" % (self.conductor)
                    self.kronsymbol += r"\end{equation}"
                else:
                    if chi.is_even():
                        self.kronsymbol = r"\begin{equation}  \chi_{%s}(a) = " % (self.number)
                        self.kronsymbol += r"\left(\frac{a}{%s}\right)" % (self.conductor)
                        self.kronsymbol += r"\end{equation}"
                    else:
                        self.kronsymbol = r"\begin{equation}  \chi_{%s}(a) = " % (self.number)
                        self.kronsymbol += r"\left(\frac{a}{%s}\right)" % (self.conductor)
                        self.kronsymbol += r"\end{equation}"

        self.credit = "Sage"
        self.title = r"Dirichlet Character: \(\chi_{%s}(%s,\cdot)\)" % (self.modulus, self.number)

        return chi
예제 #11
0
 def label2nf(label):
     return WebNumberField(label).K()
예제 #12
0
    def dirichletcharacter(self):

        #######################################################################################
        ##  Conrey's naming convention for Dirichlet Characters
        #######################################################################################

        G = DirichletGroup_conrey(self.modulus)
        G_sage = G.standard_dirichlet_group()
        self.level = self.modulus
        if self.modulus == 1 or self.number % self.modulus != 0:
            chi = G[self.number]
            chi_sage = chi.sage_character()
            self.chi_sage = chi_sage
            self.zetaorder = G_sage.zeta_order()
            # if len(chi_sage.values_on_gens()) == 1:
            ###    self.genvaluestex = latex(chi_sage.values_on_gens()[0])
            # else:
            ###    self.genvaluestex = latex(chi_sage.values_on_gens())
            # chizero = G_sage[0]
            self.char = str(chi)
            if chi.is_primitive():
                self.primitive = "True"
            else:
                self.primitive = "False"
            self.conductor = chi.conductor()
            self.order = chi.multiplicative_order()
            self.galoisorbit = [
                power_mod(self.number, k, self.modulus)
                for k in xrange(1, self.order) if gcd(k, self.order) == 1
            ]
            self.vals = chi.values()
            self.logvals = log_value(self.modulus, self.number)
            # self.logvals = map(chi.logvalue, range(1,self.modulus+1))
            # self.logvals = [latex_char_logvalue(k,True) for k in self.logvals]
            Gunits = G_sage.unit_gens()
            if self.modulus == 2:
                Gunits = [1]
            self.unitgens = latex_tuple(map(str, Gunits))
            self.genvalues = chi_sage.values_on_gens()  # what is the use ?
            self.genlogvalues = [chi.logvalue(k) for k in Gunits]
            self.genvaluestex = latex_tuple(
                map(latex_char_logvalue, self.genlogvalues))
            self.bound = 5 * 1024
            if chi.is_even():
                self.parity = 'Even'
            else:
                self.parity = 'Odd'
            if self.primitive == "False":
                self.inducedchar = chi.primitive_character()
                self.inducedchar_isprim = self.inducedchar.is_primitive()
                self.inducedchar_modulus = self.inducedchar.modulus()
                self.inducedchar_conductor = self.inducedchar.conductor()
                F = DirichletGroup_conrey(self.inducedchar_modulus)
                if self.number == 1:
                    self.inducedchar_number = 1
                else:
                    for chi in F:
                        j = chi.number()
                        if chi == self.inducedchar:
                            self.inducedchar_number = j
                            break
                self.inducedchar_tex = r"\(\chi_{%s}(%s,\cdot)\)" % (
                    self.inducedchar_modulus, self.inducedchar_number)

    # if self.primitive == 'True':
    #     self.primtf = True
    # else:
    #     self.primtf = False
    # Set data for related number fields
            order2 = int(self.order)
            if order2 % 4 == 2:
                order2 = order2 / 2
            self.valuefield = r'\(\mathbb{Q}(\zeta_{%d})\)' % order2
            if order2 == 1:
                self.valuefield = r'\(\mathbb{Q}\)'
            if order2 == 4:
                self.valuefield = r'\(\mathbb{Q}(i)\)'
            valuewnf = WebNumberField.from_cyclo(order2)
            if not valuewnf.is_null():
                self.valuefield_label = valuewnf.label
            else:
                self.valuefield_label = ''
            self.texname = r'\chi_{%d}(%d, \cdot)' % (self.modulus,
                                                      self.number)
            self.kername = r'\(\mathbb{Q}(\zeta_{%d})^{\ker %s}\)' % (
                self.modulus, self.texname)

            if self.order < 16:
                pol = str(
                    gp.galoissubcyclo(self.modulus, self.chi_sage.kernel()))
                sagepol = PolynomialRing(QQ, 'x')(pol)
                R = sagepol.parent()
                nf_pol = R(pari(sagepol).polredabs())
                self.nf_pol = "\( %s \)" % latex(nf_pol)
                wnf = WebNumberField.from_coeffs(
                    [int(c) for c in nf_pol.coeffs()])
                if wnf.is_null():
                    self.nf_friend = ''
                else:
                    self.nf_friend = '/NumberField/' + str(wnf.label)
                    self.nf_label = wnf.label
            else:
                self.nf_pol = ''
                self.nf_friend = ''

            if self.order == 2:
                if self.conductor % 2 == 1:
                    self.kronsymbol = r"\begin{equation} \chi_{%s}(a) = " % (
                        self.number)
                    self.kronsymbol += r"\left(\frac{a}{%s}\right)" % (
                        self.conductor)
                    self.kronsymbol += r"\end{equation}"
                else:
                    if chi.is_even():
                        self.kronsymbol = r"\begin{equation}  \chi_{%s}(a) = " % (
                            self.number)
                        self.kronsymbol += r"\left(\frac{a}{%s}\right)" % (
                            self.conductor)
                        self.kronsymbol += r"\end{equation}"
                    else:
                        self.kronsymbol = r"\begin{equation}  \chi_{%s}(a) = " % (
                            self.number)
                        self.kronsymbol += r"\left(\frac{a}{%s}\right)" % (
                            self.conductor)
                        self.kronsymbol += r"\end{equation}"

        self.credit = "Sage"
        self.title = r"Dirichlet Character: \(\chi_{%s}(%s,\cdot)\)" % (
            self.modulus, self.number)

        return chi