Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 144
def degree(elt, ring=None): if ring is None: return elt.polynomial().degree() if ring is not None: try: elt = elt.base_extend(ring) except TypeError as err: print(err) print("Define a coercion homomorphism from " + str(elt.parent()) + " to " + str(ring)) else: return elt.polynomial().degree() K.<t> = CyclotomicField(23) assert degree(t^13 + 11*t) == 13, "13" assert degree(3/4*t^6 + 12*t^8+3*t * t^9) == 10, "10" assert degree(K(1/3)) == 0, "0" degree(sqrt(2), ring=K)
no base extension defined Define a coercion homomorphism from Symbolic Ring to Cyclotomic Field of order 23 and degree 22
def coefficient(elt,basis_vector): higher_powers = elt.list()[degree(basis_vector)+1:] if sum([abs(x) for x in higher_powers]): raise Exception("Possible non-unique decomposition! "+ str(higher_powers)) if elt.list()[degree(basis_vector)] == 0: return 0 coeff_elt = elt.list()[degree(basis_vector)] highest_coeff_basis_vect = basis_vector.list()[degree(basis_vector)] coeff = coeff_elt/highest_coeff_basis_vect return coeff K.<t> = CyclotomicField(5) basis = [t^2 + 1, t^4 + 2, t^3 + t + 2] elt = basis[0] + 3/4*basis[1] assert coefficient(elt, basis[1]) == 3/4, "3/4" elt = elt - coefficient(elt, basis[1])*basis[1] assert coefficient(elt, basis[0]) == 1, "1" assert coefficient(elt, basis[2]) == 0, "0"
def decompose(elt, basis, integer=True): decomposition_vector = [0 for _ in basis] while elt != 0: for index, basis_elt in enumerate(basis): if degree(basis_elt) == degree(elt): break else: raise Exception("Cannot decompose " + str(elt) + ": no polynomial of matching degree in basis!\n" + str(basis)) coeff = coefficient(elt, basis_elt) if integer: assert coeff.is_integer(), str(elt) + " is NOT decomposable over integers!" assert decomposition_vector[index] == 0, "Non-unique decomposition!" decomposition_vector[index] = coeff # print(elt, coeff,basis_elt) elt -= coeff*basis_elt # print(decomposition_vector) return decomposition_vector K.<t> = NumberField(cyclotomic_polynomial(23)) basis = [t^5 + 2, 13*t -5, 6*t^2+ 2*t + 3] elt_coords = [-2,3,1] dot = lambda a,b : sum([x[0]*x[1] for x in zip(a,b)]) elt = dot(basis,elt_coords) assert decompose(elt, basis) == elt_coords, str(basis) assert decompose(t^13+11*t, K.ideal((47, t + 20)).integral_basis()) == [-5, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "t^13 + 11*t" try: decompose(1/3*t^5 + 5*t^8, K.ideal((47, t + 20)).integral_basis()) except AssertionError as err: print(err) try: decompose(3*basis[0] -2*basis[2] - t^4, basis) except Exception as exc: print(exc) decompose(3*basis[0] -2*basis[2] + basis[1], basis)
1/3*t^5 - 220 is NOT decomposable over integers! Cannot decompose -t^4 - 12*t^2 - 4*t - 6: no polynomial of matching degree in basis! [t^5 + 2, 13*t - 5, 6*t^2 + 2*t + 3] [3, 1, -2]
def matrix_from_ideal(ideal): basis = ideal.integral_basis() t = ideal.ring().gen() shifted_basis = [t*v for v in basis] m = matrix([decompose(elt, basis) for elt in shifted_basis]) return m K.<t> = CyclotomicField(11) I = K.ideal(1) I.gens() matrix_from_ideal(I)
(1,) [ 0 1 0 0 0 0 0 0 0 0] [ 0 0 1 0 0 0 0 0 0 0] [ 0 0 0 1 0 0 0 0 0 0] [ 0 0 0 0 1 0 0 0 0 0] [ 0 0 0 0 0 1 0 0 0 0] [ 0 0 0 0 0 0 1 0 0 0] [ 0 0 0 0 0 0 0 1 0 0] [ 0 0 0 0 0 0 0 0 1 0] [ 0 0 0 0 0 0 0 0 0 1] [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1]
show(cyclotomic_polynomial(23)) K.<t> = CyclotomicField(23) K_IdealClassGrp = K.class_group(proof=False); ## takes ~ 1.5h to compute with proof=True (default) # K_IdealClassGrp = K.class_group(); I = K_IdealClassGrp.gen(); show(I.gens()) m = matrix_from_ideal((I^1).ideal()) assert m^23 == matrix.identity(22) assert [QQ(round(x^23,6)) for x in m.eigenvalues()] == 22*[1]
x22+x21+x20+x19+x18+x17+x16+x15+x14+x13+x12+x11+x10+x9+x8+x7+x6+x5+x4+x3+x2+x+1\displaystyle x^{22} + x^{21} + x^{20} + x^{19} + x^{18} + x^{17} + x^{16} + x^{15} + x^{14} + x^{13} + x^{12} + x^{11} + x^{10} + x^{9} + x^{8} + x^{7} + x^{6} + x^{5} + x^{4} + x^{3} + x^{2} + x + 1
(47\displaystyle 47, t+30\displaystyle t + 30, t2+40\displaystyle t^{2} + 40, t3+22\displaystyle t^{3} + 22, t4+45\displaystyle t^{4} + 45, t5+13\displaystyle t^{5} + 13, t6+33\displaystyle t^{6} + 33, t7+44\displaystyle t^{7} + 44, t8+43\displaystyle t^{8} + 43, t9+26\displaystyle t^{9} + 26, t10+19\displaystyle t^{10} + 19, t11+41\displaystyle t^{11} + 41, t12+39\displaystyle t^{12} + 39, t13+5\displaystyle t^{13} + 5, t14+38\displaystyle t^{14} + 38, t15+35\displaystyle t^{15} + 35, t16+31\displaystyle t^{16} + 31, t17+10\displaystyle t^{17} + 10, t18+29\displaystyle t^{18} + 29, t19+23\displaystyle t^{19} + 23, t20+15\displaystyle t^{20} + 15, t21+20\displaystyle t^{21} + 20)
(I^1).ideal().integral_basis() (I^2).ideal().integral_basis() (I^3).ideal().integral_basis()
[47, t + 30, t^2 + 40, t^3 + 22, t^4 + 45, t^5 + 13, t^6 + 33, t^7 + 44, t^8 + 43, t^9 + 26, t^10 + 19, t^11 + 41, t^12 + 39, t^13 + 5, t^14 + 38, t^15 + 35, t^16 + 31, t^17 + 10, t^18 + 29, t^19 + 23, t^20 + 15, t^21 + 20] [47, t + 44, t^2 + 38, t^3 + 20, t^4 + 13, t^5 + 39, t^6 + 23, t^7 + 22, t^8 + 19, t^9 + 10, t^10 + 30, t^11 + 43, t^12 + 35, t^13 + 11, t^14 + 33, t^15 + 5, t^16 + 15, t^17 + 45, t^18 + 41, t^19 + 29, t^20 + 40, t^21 + 26] [1, t, t^2, t^3, t^4, t^5, t^6, t^7, t^8, t^9, t^10, t^11, t^12, t^13, t^14, t^15, t^16, t^17, t^18, t^19, t^20, t^21]
show(m)
(3047000000000000000000002030100000000000000000002640010000000000000000001522001000000000000000002945000100000000000000009130000100000000000000022330000010000000000000029440000001000000000000028430000000100000000000017260000000010000000000013190000000001000000000027410000000000100000000025390000000000010000000045000000000000100000002538000000000000010000002335000000000000001000002031000000000000000100007100000000000000000100019290000000000000000010015230000000000000000001010150000000000000000000101911111111111111111111)\displaystyle \left(\begin{array}{rrrrrrrrrrrrrrrrrrrrrr} -30 & 47 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -20 & 30 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -26 & 40 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -15 & 22 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -29 & 45 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -9 & 13 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -22 & 33 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -29 & 44 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -28 & 43 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -17 & 26 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -13 & 19 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -27 & 41 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -25 & 39 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -4 & 5 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -25 & 38 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ -23 & 35 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ -20 & 31 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ -7 & 10 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ -19 & 29 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ -15 & 23 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ -10 & 15 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 19 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 \end{array}\right)
L.<t> = CyclotomicField(29) L_class_g = L.class_group(proof=False); L_class_g L_class_g.gens()
Class group of order 8 with structure C2 x C2 x C2 of Cyclotomic Field of order 29 and degree 28 (Fractional ideal class (59, t - 26), Fractional ideal class (59, t - 20), Fractional ideal class (59, t - 7))
m = matrix_from_ideal(L_class_g.1.ideal())
show(m)
(395900000000000000000000000000263910000000000000000000000000913010000000000000000000000001624001000000000000000000000006800010000000000000000000000284200001000000000000000000000101400000100000000000000000000304400000010000000000000000000365400000001000000000000000000121800000000100000000000000000460000000001000000000000000022000000000010000000000000002740000000000001000000000000002233000000000000100000000000008110000000000000100000000000029430000000000000010000000000023340000000000000001000000000021310000000000000000100000000020300000000000000000010000000071000000000000000000010000000162300000000000000000001000000324700000000000000000000100000375500000000000000000000010000263800000000000000000000001000355200000000000000000000000100253700000000000000000000000010223200000000000000000000000001194911111111111111111111111111)\displaystyle \left(\begin{array}{rrrrrrrrrrrrrrrrrrrrrrrrrrrr} -39 & 59 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -26 & 39 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -9 & 13 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -16 & 24 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -6 & 8 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -28 & 42 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -10 & 14 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -30 & 44 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -36 & 54 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -12 & 18 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -4 & 6 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -2 & 2 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -27 & 40 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -22 & 33 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -8 & 11 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -29 & 43 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -23 & 34 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -21 & 31 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -20 & 30 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -7 & 10 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ -16 & 23 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ -32 & 47 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ -37 & 55 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ -26 & 38 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ -35 & 52 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ -25 & 37 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ -22 & 32 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ -19 & 49 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 & -1 \end{array}\right)