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)
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()]
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)
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()
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()