def test_Submodule_represent(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) B = A.submodule_from_matrix(2 * DomainMatrix.eye(4, ZZ)) C = B.submodule_from_matrix(3 * DomainMatrix.eye(4, ZZ)) a0 = A(to_col([6, 12, 18, 24])) a1 = A(to_col([2, 4, 6, 8])) a2 = A(to_col([1, 3, 5, 7])) b1 = B.represent(a1) assert b1.flat() == [1, 2, 3, 4] c0 = C.represent(a0) assert c0.flat() == [1, 2, 3, 4] Y = A.submodule_from_matrix( DomainMatrix([ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], ], (3, 4), ZZ).transpose()) U = Poly(cyclotomic_poly(7, x)) Z = PowerBasis(U) z0 = Z(to_col([1, 2, 3, 4, 5, 6])) raises(ClosureFailure, lambda: Y.represent(A(3))) raises(ClosureFailure, lambda: B.represent(a2)) raises(ClosureFailure, lambda: B.represent(z0))
def test_Submodule_add(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) B = A.submodule_from_matrix(DomainMatrix([ [4, 0, 0, 0], [0, 4, 0, 0], ], (2, 4), ZZ).transpose(), denom=6) C = A.submodule_from_matrix(DomainMatrix([ [0, 10, 0, 0], [0, 0, 7, 0], ], (2, 4), ZZ).transpose(), denom=15) D = A.submodule_from_matrix(DomainMatrix([ [20, 0, 0, 0], [0, 20, 0, 0], [0, 0, 14, 0], ], (3, 4), ZZ).transpose(), denom=30) assert B + C == D U = Poly(cyclotomic_poly(7, x)) Z = PowerBasis(U) Y = Z.submodule_from_gens([Z(0), Z(1)]) raises(TypeError, lambda: B + Y)
def test_round_two(): # Poly must be monic, irreducible, and over ZZ: raises(ValueError, lambda: round_two(Poly(3 * x ** 2 + 1))) raises(ValueError, lambda: round_two(Poly(x ** 2 - 1))) raises(ValueError, lambda: round_two(Poly(x ** 2 + QQ(1, 2)))) # Test on many fields: cases = ( # A couple of cyclotomic fields: (cyclotomic_poly(5), DomainMatrix.eye(4, QQ), 125), (cyclotomic_poly(7), DomainMatrix.eye(6, QQ), -16807), # A couple of quadratic fields (one 1 mod 4, one 3 mod 4): (x ** 2 - 5, DM([[1, (1, 2)], [0, (1, 2)]], QQ), 5), (x ** 2 - 7, DM([[1, 0], [0, 1]], QQ), 28), # Dedekind's example of a field with 2 as essential disc divisor: (x ** 3 + x ** 2 - 2 * x + 8, DM([[1, 0, 0], [0, 1, 0], [0, (1, 2), (1, 2)]], QQ).transpose(), -503), # A bunch of cubics with various forms for F -- all of these require # second or third enlargements. (Five of them require a third, while the rest require just a second.) # F = 2^2 (x**3 + 3 * x**2 - 4 * x + 4, DM([((1, 2), (1, 4), (1, 4)), (0, (1, 2), (1, 2)), (0, 0, 1)], QQ).transpose(), -83), # F = 2^2 * 3 (x**3 + 3 * x**2 + 3 * x - 3, DM([((1, 2), 0, (1, 2)), (0, 1, 0), (0, 0, 1)], QQ).transpose(), -108), # F = 2^3 (x**3 + 5 * x**2 - x + 3, DM([((1, 4), 0, (3, 4)), (0, (1, 2), (1, 2)), (0, 0, 1)], QQ).transpose(), -31), # F = 2^2 * 5 (x**3 + 5 * x**2 - 5 * x - 5, DM([((1, 2), 0, (1, 2)), (0, 1, 0), (0, 0, 1)], QQ).transpose(), 1300), # F = 3^2 (x**3 + 3 * x**2 + 5, DM([((1, 3), (1, 3), (1, 3)), (0, 1, 0), (0, 0, 1)], QQ).transpose(), -135), # F = 3^3 (x**3 + 6 * x**2 + 3 * x - 1, DM([((1, 3), (1, 3), (1, 3)), (0, 1, 0), (0, 0, 1)], QQ).transpose(), 81), # F = 2^2 * 3^2 (x**3 + 6 * x**2 + 4, DM([((1, 3), (2, 3), (1, 3)), (0, 1, 0), (0, 0, (1, 2))], QQ).transpose(), -108), # F = 2^3 * 7 (x**3 + 7 * x**2 + 7 * x - 7, DM([((1, 4), 0, (3, 4)), (0, (1, 2), (1, 2)), (0, 0, 1)], QQ).transpose(), 49), # F = 2^2 * 13 (x**3 + 7 * x**2 - x + 5, DM([((1, 2), 0, (1, 2)), (0, 1, 0), (0, 0, 1)], QQ).transpose(), -2028), # F = 2^4 (x**3 + 7 * x**2 - 5 * x + 5, DM([((1, 4), 0, (3, 4)), (0, (1, 2), (1, 2)), (0, 0, 1)], QQ).transpose(), -140), # F = 5^2 (x**3 + 4 * x**2 - 3 * x + 7, DM([((1, 5), (4, 5), (4, 5)), (0, 1, 0), (0, 0, 1)], QQ).transpose(), -175), # F = 7^2 (x**3 + 8 * x**2 + 5 * x - 1, DM([((1, 7), (6, 7), (2, 7)), (0, 1, 0), (0, 0, 1)], QQ).transpose(), 49), # F = 2 * 5 * 7 (x**3 + 8 * x**2 - 2 * x + 6, DM([(1, 0, 0), (0, 1, 0), (0, 0, 1)], QQ).transpose(), -14700), # F = 2^2 * 3 * 5 (x**3 + 6 * x**2 - 3 * x + 8, DM([(1, 0, 0), (0, (1, 4), (1, 4)), (0, 0, 1)], QQ).transpose(), -675), # F = 2 * 3^2 * 7 (x**3 + 9 * x**2 + 6 * x - 8, DM([(1, 0, 0), (0, (1, 2), (1, 2)), (0, 0, 1)], QQ).transpose(), 3969), # F = 2^2 * 3^2 * 7 (x**3 + 15 * x**2 - 9 * x + 13, DM([((1, 6), (1, 3), (1, 6)), (0, 1, 0), (0, 0, 1)], QQ).transpose(), -5292), ) for f, B_exp, d_exp in cases: K = QQ.alg_field_from_poly(f) B = K.maximal_order().QQ_matrix d = K.discriminant() assert d == d_exp # The computed basis need not equal the expected one, but their quotient # must be unimodular: assert (B.inv()*B_exp).det()**2 == 1
def test_ModuleElement_eq(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) e = A(to_col([1, 2, 3, 4]), denom=1) f = A(to_col([3, 6, 9, 12]), denom=3) assert e == f U = Poly(cyclotomic_poly(7, x)) Z = PowerBasis(U) assert e != Z(0) assert e != 3.14
def test_Submodule_mul(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) C = A.submodule_from_matrix(DomainMatrix([ [0, 10, 0, 0], [0, 0, 7, 0], ], (2, 4), ZZ).transpose(), denom=15) C1 = A.submodule_from_matrix(DomainMatrix([ [0, 20, 0, 0], [0, 0, 14, 0], ], (2, 4), ZZ).transpose(), denom=3) C2 = A.submodule_from_matrix(DomainMatrix([ [0, 0, 10, 0], [0, 0, 0, 7], ], (2, 4), ZZ).transpose(), denom=15) C3_unred = A.submodule_from_matrix(DomainMatrix( [[0, 0, 100, 0], [0, 0, 0, 70], [0, 0, 0, 70], [-49, -49, -49, -49]], (4, 4), ZZ).transpose(), denom=225) C3 = A.submodule_from_matrix(DomainMatrix( [[4900, 4900, 0, 0], [4410, 4410, 10, 0], [2107, 2107, 7, 7]], (3, 4), ZZ).transpose(), denom=225) assert C * 1 == C assert C**1 == C assert C * 10 == C1 assert C * A(1) == C2 assert C.mul(C, hnf=False) == C3_unred assert C * C == C3 assert C**2 == C3
def test_Submodule_reduced(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) B = A.submodule_from_matrix(2 * DomainMatrix.eye(4, ZZ)) C = A.submodule_from_matrix(6 * DomainMatrix.eye(4, ZZ), denom=3) D = C.reduced() assert D.denom == 1 and D == C == B
def test_Submodule_repr(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) B = A.submodule_from_matrix(2 * DomainMatrix.eye(4, ZZ), denom=3) assert repr( B ) == 'Submodule[[2, 0, 0, 0], [0, 2, 0, 0], [0, 0, 2, 0], [0, 0, 0, 2]]/3'
def test_PowerBasis_mult_tab(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) M = A.mult_tab() exp = { 0: { 0: [1, 0, 0, 0], 1: [0, 1, 0, 0], 2: [0, 0, 1, 0], 3: [0, 0, 0, 1] }, 1: { 1: [0, 0, 1, 0], 2: [0, 0, 0, 1], 3: [-1, -1, -1, -1] }, 2: { 2: [-1, -1, -1, -1], 3: [1, 0, 0, 0] }, 3: { 3: [0, 1, 0, 0] } } # We get the table we expect: assert M == exp # And all entries are of expected type: assert all(is_int(c) for u in M for v in M[u] for c in M[u][v])
def test_PowerBasisElement_polys(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) e = A(to_col([1, 15, 8, 0]), denom=2) assert e.numerator(x=zeta) == Poly(8 * zeta**2 + 15 * zeta + 1, domain=ZZ) assert e.poly(x=zeta) == Poly(4 * zeta**2 + QQ(15, 2) * zeta + QQ(1, 2), domain=QQ)
def test_Submodule_reduce_element(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) B = A.whole_submodule() b = B(to_col([90, 84, 80, 75]), denom=120) C = B.submodule_from_matrix(DomainMatrix.eye(4, ZZ), denom=2) b_bar_expected = B(to_col([30, 24, 20, 15]), denom=120) b_bar = C.reduce_element(b) assert b_bar == b_bar_expected C = B.submodule_from_matrix(DomainMatrix.eye(4, ZZ), denom=4) b_bar_expected = B(to_col([0, 24, 20, 15]), denom=120) b_bar = C.reduce_element(b) assert b_bar == b_bar_expected C = B.submodule_from_matrix(DomainMatrix.eye(4, ZZ), denom=8) b_bar_expected = B(to_col([0, 9, 5, 0]), denom=120) b_bar = C.reduce_element(b) assert b_bar == b_bar_expected a = A(to_col([1, 2, 3, 4])) raises(NotImplementedError, lambda: C.reduce_element(a)) C = B.submodule_from_matrix( DomainMatrix( [[5, 4, 3, 2], [0, 8, 7, 6], [0, 0, 11, 12], [0, 0, 0, 1]], (4, 4), ZZ).transpose()) raises(StructureError, lambda: C.reduce_element(b))
def test_PowerBasis_represent(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) col = to_col([1, 2, 3, 4]) a = A(col) assert A.represent(a) == col b = A(col, denom=2) raises(ClosureFailure, lambda: A.represent(b))
def test_PrimeIdeal_eq(): # `==` should fail on objects of different types, so even a completely # inert PrimeIdeal should test unequal to the rational prime it divides. T = Poly(cyclotomic_poly(7)) P0 = prime_decomp(5, T)[0] assert P0.f == 6 assert P0.as_submodule() == 5 * P0.ZK assert P0 != 5
def test_ModuleHomomorphism_matrix(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) phi = ModuleEndomorphism(A, lambda a: a**2) M = phi.matrix() assert M == DomainMatrix( [[1, 0, -1, 0], [0, 0, -1, 1], [0, 1, -1, 0], [0, 0, -1, 0]], (4, 4), ZZ)
def test_Module_call(): T = Poly(cyclotomic_poly(5, x)) B = PowerBasis(T) assert B(0).col.flat() == [1, 0, 0, 0] assert B(1).col.flat() == [0, 1, 0, 0] col = DomainMatrix.eye(4, ZZ)[:, 2] assert B(col).col == col raises(ValueError, lambda: B(-1))
def test_Module_one(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) B = A.submodule_from_matrix(2 * DomainMatrix.eye(4, ZZ)) assert A.one().col.flat() == [1, 0, 0, 0] assert A.one().module == A assert B.one().col.flat() == [1, 0, 0, 0] assert B.one().module == A
def test_ModuleElement_add(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) C = A.submodule_from_matrix(3 * DomainMatrix.eye(4, ZZ)) e = A(to_col([1, 2, 3, 4]), denom=6) f = A(to_col([5, 6, 7, 8]), denom=10) g = C(to_col([1, 1, 1, 1]), denom=2) assert e + f == A(to_col([10, 14, 18, 22]), denom=15) assert e - f == A(to_col([-5, -4, -3, -2]), denom=15) assert e + g == A(to_col([10, 11, 12, 13]), denom=6) assert e + QQ(7, 10) == A(to_col([26, 10, 15, 20]), denom=30) assert g + QQ(7, 10) == A(to_col([22, 15, 15, 15]), denom=10) U = Poly(cyclotomic_poly(7, x)) Z = PowerBasis(U) raises(TypeError, lambda: e + Z(0)) raises(TypeError, lambda: e + 3.14)
def test_ModuleElement_column(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) e = A(0) col1 = e.column() assert col1 == e.col and col1 is not e.col col2 = e.column(domain=FF(5)) assert col2.domain.is_FF
def test_PowerBasis_element_from_poly(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) f = Poly(1 + 2 * x) g = Poly(x**4) h = Poly(0, x) assert A.element_from_poly(f).coeffs == [1, 2, 0, 0] assert A.element_from_poly(g).coeffs == [-1, -1, -1, -1] assert A.element_from_poly(h).coeffs == [0, 0, 0, 0]
def test_ModuleElement_equiv(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) e = A(to_col([1, 2, 3, 4]), denom=1) f = A(to_col([3, 6, 9, 12]), denom=3) assert e.equiv(f) C = A.submodule_from_matrix(3 * DomainMatrix.eye(4, ZZ)) g = C(to_col([1, 2, 3, 4]), denom=1) h = A(to_col([3, 6, 9, 12]), denom=1) assert g.equiv(h) assert C(to_col([5, 0, 0, 0]), denom=7).equiv(QQ(15, 7)) U = Poly(cyclotomic_poly(7, x)) Z = PowerBasis(U) raises(UnificationFailed, lambda: e.equiv(Z(0))) assert e.equiv(3.14) is False
def test_ModuleElement_compatibility(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) B = A.submodule_from_matrix(2 * DomainMatrix.eye(4, ZZ)) C = B.submodule_from_matrix(3 * DomainMatrix.eye(4, ZZ)) D = B.submodule_from_matrix(5 * DomainMatrix.eye(4, ZZ)) assert C(0).is_compat(C(1)) is True assert C(0).is_compat(D(0)) is False u, v = C(0).unify(D(0)) assert u.module is B and v.module is B assert C(C.represent(u)) == C(0) and D(D.represent(v)) == D(0) u, v = C(0).unify(C(1)) assert u == C(0) and v == C(1) U = Poly(cyclotomic_poly(7, x)) Z = PowerBasis(U) raises(UnificationFailed, lambda: C(0).unify(Z(1)))
def test_make_mod_elt(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) B = A.submodule_from_matrix(2 * DomainMatrix.eye(4, ZZ)) col = to_col([1, 2, 3, 4]) eA = make_mod_elt(A, col) eB = make_mod_elt(B, col) assert isinstance(eA, PowerBasisElement) assert not isinstance(eB, PowerBasisElement)
def test_Submodule_is_compat_submodule(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) B = A.submodule_from_matrix(2 * DomainMatrix.eye(4, ZZ)) C = A.submodule_from_matrix(3 * DomainMatrix.eye(4, ZZ)) D = C.submodule_from_matrix(5 * DomainMatrix.eye(4, ZZ)) assert B.is_compat_submodule(C) is True assert B.is_compat_submodule(A) is False assert B.is_compat_submodule(D) is False
def test_Module_whole_submodule(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) B = A.whole_submodule() e = B(to_col([1, 2, 3, 4])) f = e.to_parent() assert f.col.flat() == [1, 2, 3, 4] e0, e1, e2, e3 = B(0), B(1), B(2), B(3) assert e2 * e3 == e0 assert e3**2 == e1
def test_ModuleElement_div(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) C = A.submodule_from_matrix(3 * DomainMatrix.eye(4, ZZ)) e = A(to_col([0, 2, 0, 0]), denom=3) f = A(to_col([0, 0, 0, 7]), denom=5) g = C(to_col([1, 1, 1, 1])) assert e // f == 10 * A(3) // 21 assert e // g == -2 * A(2) // 9 assert 3 // g == -A(1)
def test_Submodule_discard_before(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) B = A.submodule_from_matrix(2 * DomainMatrix.eye(4, ZZ)) B.compute_mult_tab() C = B.discard_before(2) assert C.parent == B.parent assert B.is_sq_maxrank_HNF() and not C.is_sq_maxrank_HNF() assert C.matrix == B.matrix[:, 2:] assert C.mult_tab() == {0: {0: [-2, -2], 1: [0, 0]}, 1: {1: [0, 0]}}
def test_Module_compat_col(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) col = to_col([1, 2, 3, 4]) row = col.transpose() assert A.is_compat_col(col) is True assert A.is_compat_col(row) is False assert A.is_compat_col(1) is False assert A.is_compat_col(DomainMatrix.eye(3, ZZ)[:, 0]) is False assert A.is_compat_col(DomainMatrix.eye(4, QQ)[:, 0]) is False assert A.is_compat_col(DomainMatrix.eye(4, ZZ)[:, 0]) is True
def test_valuation_at_prime_ideal(): p = 7 T = Poly(cyclotomic_poly(p)) ZK, dK = round_two(T) P = prime_decomp(p, T, dK=dK, ZK=ZK) assert len(P) == 1 P0 = P[0] v = P0.valuation(p * ZK) assert v == P0.e # Test easy 0 case: assert P0.valuation(5 * ZK) == 0
def test_AlgIntPowers_01(): T = Poly(cyclotomic_poly(5)) zeta_pow = AlgIntPowers(T) raises(ValueError, lambda: zeta_pow[-1]) for e in range(10): a = e % 5 if a < 4: c = zeta_pow[e] assert c[a] == 1 and all(c[i] == 0 for i in range(4) if i != a) else: assert zeta_pow[e] == [-1] * 4
def test_ModuleElement_pow(): T = Poly(cyclotomic_poly(5, x)) A = PowerBasis(T) C = A.submodule_from_matrix(3 * DomainMatrix.eye(4, ZZ)) e = A(to_col([0, 2, 0, 0]), denom=3) g = C(to_col([0, 0, 0, 1]), denom=2) assert e**3 == A(to_col([0, 0, 0, 8]), denom=27) assert g**2 == C(to_col([0, 3, 0, 0]), denom=4) assert e**0 == A(to_col([1, 0, 0, 0])) assert g**0 == A(to_col([1, 0, 0, 0])) assert e**1 == e assert g**1 == g
def test_decomp_2(): # More easy cyclotomic cases, but here we check unramified primes. ell = 7 T = Poly(cyclotomic_poly(ell)) for p in [29, 13, 11, 5]: f_exp = n_order(p, ell) g_exp = (ell - 1) // f_exp P = prime_decomp(p, T) assert len(P) == g_exp for Pi in P: assert Pi.e == 1 assert Pi.f == f_exp
def test_roots_cyclotomic(): assert roots_cyclotomic(cyclotomic_poly(1, x, polys=True)) == [1] assert roots_cyclotomic(cyclotomic_poly(2, x, polys=True)) == [-1] assert roots_cyclotomic(cyclotomic_poly( 3, x, polys=True)) == [-S(1)/2 - I*sqrt(3)/2, -S(1)/2 + I*sqrt(3)/2] assert roots_cyclotomic(cyclotomic_poly(4, x, polys=True)) == [-I, I] assert roots_cyclotomic(cyclotomic_poly( 6, x, polys=True)) == [S(1)/2 - I*sqrt(3)/2, S(1)/2 + I*sqrt(3)/2] assert roots_cyclotomic(cyclotomic_poly(7, x, polys=True)) == [ -cos(pi/7) - I*sin(pi/7), -cos(pi/7) + I*sin(pi/7), -cos(3*pi/7) - I*sin(3*pi/7), -cos(3*pi/7) + I*sin(3*pi/7), cos(2*pi/7) - I*sin(2*pi/7), cos(2*pi/7) + I*sin(2*pi/7), ] assert roots_cyclotomic(cyclotomic_poly(8, x, polys=True)) == [ -sqrt(2)/2 - I*sqrt(2)/2, -sqrt(2)/2 + I*sqrt(2)/2, sqrt(2)/2 - I*sqrt(2)/2, sqrt(2)/2 + I*sqrt(2)/2, ] assert roots_cyclotomic(cyclotomic_poly(12, x, polys=True)) == [ -sqrt(3)/2 - I/2, -sqrt(3)/2 + I/2, sqrt(3)/2 - I/2, sqrt(3)/2 + I/2, ] assert roots_cyclotomic( cyclotomic_poly(1, x, polys=True), factor=True) == [1] assert roots_cyclotomic( cyclotomic_poly(2, x, polys=True), factor=True) == [-1] assert roots_cyclotomic(cyclotomic_poly(3, x, polys=True), factor=True) == \ [-root(-1, 3), -1 + root(-1, 3)] assert roots_cyclotomic(cyclotomic_poly(4, x, polys=True), factor=True) == \ [-I, I] assert roots_cyclotomic(cyclotomic_poly(5, x, polys=True), factor=True) == \ [-root(-1, 5), -root(-1, 5)**3, root(-1, 5)**2, -1 - root(-1, 5)**2 + root(-1, 5) + root(-1, 5)**3] assert roots_cyclotomic(cyclotomic_poly(6, x, polys=True), factor=True) == \ [1 - root(-1, 3), root(-1, 3)]
def test_roots_cyclotomic(): assert roots_cyclotomic(cyclotomic_poly(1, x, polys=True)) == [1] assert roots_cyclotomic(cyclotomic_poly(2, x, polys=True)) == [-1] assert roots_cyclotomic(cyclotomic_poly(3, x, polys=True)) == [-S(1)/2 - I*3**(S(1)/2)/2, -S(1)/2 + I*3**(S(1)/2)/2] assert roots_cyclotomic(cyclotomic_poly(4, x, polys=True)) == [-I, I] assert roots_cyclotomic(cyclotomic_poly(6, x, polys=True)) == [S(1)/2 - I*3**(S(1)/2)/2, S(1)/2 + I*3**(S(1)/2)/2] assert roots_cyclotomic(cyclotomic_poly(7, x, polys=True)) == [ -cos(pi/7) - I*sin(pi/7), -cos(pi/7) + I*sin(pi/7), cos(2*pi/7) - I*sin(2*pi/7), cos(2*pi/7) + I*sin(2*pi/7), -cos(3*pi/7) - I*sin(3*pi/7), -cos(3*pi/7) + I*sin(3*pi/7), ] assert roots_cyclotomic(cyclotomic_poly(8, x, polys=True)) == [ -2**(S(1)/2)/2 - I*2**(S(1)/2)/2, -2**(S(1)/2)/2 + I*2**(S(1)/2)/2, 2**(S(1)/2)/2 - I*2**(S(1)/2)/2, 2**(S(1)/2)/2 + I*2**(S(1)/2)/2, ] assert roots_cyclotomic(cyclotomic_poly(12, x, polys=True)) == [ -3**(S(1)/2)/2 - I/2, -3**(S(1)/2)/2 + I/2, 3**(S(1)/2)/2 - I/2, 3**(S(1)/2)/2 + I/2, ] assert roots_cyclotomic(cyclotomic_poly(1, x, polys=True), factor=True) == [1] assert roots_cyclotomic(cyclotomic_poly(2, x, polys=True), factor=True) == [-1] assert roots_cyclotomic(cyclotomic_poly(3, x, polys=True), factor=True) == \ [-(-1)**(S(1)/3), -1 + (-1)**(S(1)/3)] assert roots_cyclotomic(cyclotomic_poly(4, x, polys=True), factor=True) == \ [-I, I] assert roots_cyclotomic(cyclotomic_poly(5, x, polys=True), factor=True) == \ [-(-1)**(S(1)/5), (-1)**(S(2)/5), -(-1)**(S(3)/5), -1 + (-1)**(S(1)/5) - (-1)**(S(2)/5) + (-1)**(S(3)/5)] assert roots_cyclotomic(cyclotomic_poly(6, x, polys=True), factor=True) == \ [(-1)**(S(1)/3), 1 - (-1)**(S(1)/3)]