Пример #1
0
 def __init__(self, fund_group):
     self.domain_gens = fund_group.generators()
     ab_words = [
         abelianize_word(R, self.domain_gens)
         for R in fund_group.relators()
     ]
     R = matrix(ZZ, ab_words).transpose()
     D, U, V = R.smith_form()
     m = U.nrows()
     assert m == D.nrows()
     d = min(D.nrows(), D.ncols())
     diag = D.diagonal()
     num_ones = diag.count(1)
     self.elementary_divisors = diag[num_ones:] + [
         0,
     ] * (m - d)
     self.U = U[num_ones:]
     tor = [d for d in self.elementary_divisors if d != 0]
     free = [d for d in self.elementary_divisors if d == 0]
     names = []
     if len(tor) == 1:
         names.append('u')
     else:
         names += ['u%d' % i for i in range(len(tor))]
     if len(free) == 1:
         names.append('t')
     else:
         names += ['t%d' % i for i in range(len(free))]
     self._range = AbelianGroup(self.elementary_divisors, names=names)
Пример #2
0
def generators_of_subgroups_of_unit_group(R):
    """
    INPUT:
    
    - R - a commutative ring whose unit group is finite
    
    OUTPUT:
    
    - An iterator which yields a set of generators for each subgroup of R^*
    
    EXAMPLES::

        sage: from mdsage import *
        sage: list(generators_of_subgroups_of_unit_group(Integers(28)))
        [[15, 17], [11], [3], [13, 15], [15], [27], [17], [9], [13], []]
    
    """
    gens = R.unit_gens()
    invariants = [g.multiplicative_order() for g in gens]
    assert all(i!=0 for i in invariants)
    A=AbelianGroup(invariants)
    for G in A.subgroups():
        yield [prod(f**e for f,e in zip(gens,g.exponents())) for g in G.gens()]
Пример #3
0
def generators_of_subgroups_of_unit_group(R):
    """
    INPUT:
    
    - R - a commutative ring whose unit group is finite
    
    OUTPUT:
    
    - An iterator which yields a set of generators for each subgroup of R^*
    
    EXAMPLES::

        sage: from mdsage import *
        sage: list(generators_of_subgroups_of_unit_group(Integers(28)))
        [[15, 17], [11], [3], [13, 15], [15], [27], [17], [9], [13], []]
    
    """
    gens = R.unit_gens()
    invariants = [g.multiplicative_order() for g in gens]
    assert all(i!=0 for i in invariants)
    A=AbelianGroup(invariants)
    for G in A.subgroups():
        yield [prod(f**e for f,e in zip(gens,g.exponents())) for g in G.gens()]
Пример #4
0
def render_field_webpage(args):
    data = None
    if 'label' in args:
        label = str(args['label'])
        import base
        C = base.getDBConnection()
        data = C.numberfields.fields.find_one({'label': label})
    if data is None:
        return "No such field: " + label + " in the database"
    info = {}

    try:
        info['count'] = args['count']
    except KeyError:
        info['count'] = 10
    K = coeff_to_nf(data['coefficients'])
    D = data['discriminant']
    h = data['class_number']
    data['galois_group'] = str(data['galois_group'][3])
    data['class_group_invs'] = data['class_group']
    if data['class_group_invs'] == []:
        data['class_group_invs'] = 'Trivial'
    data['class_group'] = str(AbelianGroup(data['class_group']))
    sig = data['signature']
    D = ZZ(data['discriminant'])
    ram_primes = D.prime_factors()
    npr = len(ram_primes)
    ram_primes = str(ram_primes)[1:-1]
    Gorder, Gsign, Gab = GG_data(data['galois_group'])
    if Gab:
        Gab = 'abelian'
    else:
        Gab = 'non-abelian'
    unit_rank = sig[0] + sig[1] - 1
    if unit_rank == 0:
        reg = 1
    else:
        reg = K.regulator()
    UK = K.unit_group()

    info.update(data)
    info.update({
        'label':
        field_pretty(label),
        'polynomial':
        web_latex(K.defining_polynomial()),
        'ram_primes':
        ram_primes,
        'integral_basis':
        web_latex(K.integral_basis()),
        'regulator':
        web_latex(reg),
        'unit_rank':
        unit_rank,
        'root_of_unity':
        web_latex(UK.torsion_generator()),
        'fund_units':
        ',  '.join([web_latex(u) for u in UK.fundamental_units()]),
        'Gorder':
        Gorder,
        'Gsign':
        Gsign,
        'Gab':
        Gab
    })
    info['downloads_visible'] = True
    info['downloads'] = [('worksheet', '/')]
    #    info['friends'] = [('L-function', '/')]
    info['friends'] = [('L-function', "/L/NumberField/%s" % label)]
    info['learnmore'] = [
        ('Number Field labels', url_for("render_labels_page")),
        ('Galois group labels', url_for("render_groups_page")),
        ('Discriminant ranges', url_for("render_discriminants_page"))
    ]
    bread = [('Number Fields', url_for("number_field_render_webpage")),
             ('%s' % info['label'], ' ')]
    t = "Number Field %s" % info['label']

    properties = ['<br>']
    properties.extend('<table>')
    properties.extend(
        '<tr><td align=left><b>Degree:</b><td align=left> %s</td>' %
        data['degree'])
    properties.extend(
        '<tr><td align=left><b>Signature:</b><td align=left>%s</td>' %
        data['signature'])
    properties.extend(
        '<tr><td align=left><b>Discriminant:</b><td align=left>%s</td>' %
        data['discriminant'])
    if npr == 1:
        properties.extend(
            '<tr><td align=left><b>Ramified prime:</b><td align=left>%s</td>' %
            ram_primes)
    else:
        if npr == 0:
            properties.extend(
                '<tr><td align=left><b>Ramified primes:</b><td align=left>%s</td>'
                % "None")
        else:
            properties.extend(
                '<tr><td align=left><b>Ramified primes:</b><td align=left>%s</td>'
                % ram_primes)
    properties.extend(
        '<tr><td align=left><b>Class number:</b><td align=left>%s</td>' %
        data['class_number'])
    properties.extend(
        '<tr><td align=left><b>Class group:</b><td align=left>%s</td>' %
        data['class_group_invs'])
    properties.extend(
        '<tr><td align=left><b>Galois group:</b><td align=left>%s</td>' %
        data['galois_group'])
    properties.extend('</table>')
    del info['_id']
    return render_template("number_field/number_field.html",
                           properties=properties,
                           credit=NF_credit,
                           title=t,
                           bread=bread,
                           friends=info.pop('friends'),
                           info=info)
Пример #5
0
 def class_group(self):
     if self.haskey('class_group'):
         cg_list = self._data['class_group']
         return str(AbelianGroup(
             cg_list)) + ', order ' + self.class_number_latex()
     return na_text()
Пример #6
0
 def class_group(self):
     if self.haskey('class_group'):
         cg_list = string2list(self._data['class_group'])
         return str(AbelianGroup(cg_list)) + ', order ' + str(self._data['class_number'])
     return na_text()