def is_cyclotomic(f): """Returns ``True`` if ``f`` is a cyclotomic polynomial. """ if not f.lev: return dup_cyclotomic_p(f.rep, f.dom) else: return False
def test_dup_cyclotomic_p(): assert dup_cyclotomic_p([1,-1], ZZ) == True assert dup_cyclotomic_p([1,1], ZZ) == True assert dup_cyclotomic_p([1,1,1], ZZ) == True assert dup_cyclotomic_p([1,0,1], ZZ) == True assert dup_cyclotomic_p([1,1,1,1,1], ZZ) == True assert dup_cyclotomic_p([1,-1,1], ZZ) == True assert dup_cyclotomic_p([1,1,1,1,1,1,1], ZZ) == True assert dup_cyclotomic_p([1,0,0,0,1], ZZ) == True assert dup_cyclotomic_p([1,0,0,1,0,0,1], ZZ) == True assert dup_cyclotomic_p([], ZZ) == False assert dup_cyclotomic_p([1], ZZ) == False assert dup_cyclotomic_p([1, 0], ZZ) == False assert dup_cyclotomic_p([1, 2], ZZ) == False assert dup_cyclotomic_p([3, 1], ZZ) == False assert dup_cyclotomic_p([1, 0, -1], ZZ) == False f = [1, 0, 1, 0, 0, 0,-1, 0, 1, 0,-1, 0, 0, 0, 1, 0, 1] assert dup_cyclotomic_p(f, ZZ) == False g = [1, 0, 1, 0, 0, 0,-1, 0,-1, 0,-1, 0, 0, 0, 1, 0, 1] assert dup_cyclotomic_p(g, ZZ) == True assert dup_cyclotomic_p([QQ(1),QQ(1),QQ(1)], QQ) == True assert dup_cyclotomic_p([QQ(1,2),QQ(1),QQ(1)], QQ) == False K = ZZ['y'] assert dup_cyclotomic_p([K([ZZ(1)]),K([ZZ(1)]),K([ZZ(1)])], K) == False
def test_dup_cyclotomic_p(): assert dup_cyclotomic_p([1, -1], ZZ) == True assert dup_cyclotomic_p([1, 1], ZZ) == True assert dup_cyclotomic_p([1, 1, 1], ZZ) == True assert dup_cyclotomic_p([1, 0, 1], ZZ) == True assert dup_cyclotomic_p([1, 1, 1, 1, 1], ZZ) == True assert dup_cyclotomic_p([1, -1, 1], ZZ) == True assert dup_cyclotomic_p([1, 1, 1, 1, 1, 1, 1], ZZ) == True assert dup_cyclotomic_p([1, 0, 0, 0, 1], ZZ) == True assert dup_cyclotomic_p([1, 0, 0, 1, 0, 0, 1], ZZ) == True assert dup_cyclotomic_p([], ZZ) == False assert dup_cyclotomic_p([1], ZZ) == False assert dup_cyclotomic_p([1, 0], ZZ) == False assert dup_cyclotomic_p([1, 2], ZZ) == False assert dup_cyclotomic_p([3, 1], ZZ) == False assert dup_cyclotomic_p([1, 0, -1], ZZ) == False f = [1, 0, 1, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 1, 0, 1] assert dup_cyclotomic_p(f, ZZ) == False g = [1, 0, 1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 1, 0, 1] assert dup_cyclotomic_p(g, ZZ) == True assert dup_cyclotomic_p([QQ(1), QQ(1), QQ(1)], QQ) == True assert dup_cyclotomic_p([QQ(1, 2), QQ(1), QQ(1)], QQ) == False K = ZZ['y'] assert dup_cyclotomic_p([K([ZZ(1)]), K([ZZ(1)]), K([ZZ(1)])], K) == False
def test_dup_cyclotomic_p(): assert dup_cyclotomic_p(ZZ.map([1, -1]), ZZ) is True assert dup_cyclotomic_p(ZZ.map([1, 1]), ZZ) is True assert dup_cyclotomic_p(ZZ.map([1, 1, 1]), ZZ) is True assert dup_cyclotomic_p(ZZ.map([1, 0, 1]), ZZ) is True assert dup_cyclotomic_p(ZZ.map([1, 1, 1, 1, 1]), ZZ) is True assert dup_cyclotomic_p(ZZ.map([1, -1, 1]), ZZ) is True assert dup_cyclotomic_p(ZZ.map([1, 1, 1, 1, 1, 1, 1]), ZZ) is True assert dup_cyclotomic_p(ZZ.map([1, 0, 0, 0, 1]), ZZ) is True assert dup_cyclotomic_p(ZZ.map([1, 0, 0, 1, 0, 0, 1]), ZZ) is True assert dup_cyclotomic_p(ZZ.map([]), ZZ) is False assert dup_cyclotomic_p(ZZ.map([1]), ZZ) is False assert dup_cyclotomic_p(ZZ.map([1, 0]), ZZ) is False assert dup_cyclotomic_p(ZZ.map([1, 2]), ZZ) is False assert dup_cyclotomic_p(ZZ.map([3, 1]), ZZ) is False assert dup_cyclotomic_p(ZZ.map([1, 0, -1]), ZZ) is False f = ZZ.map([1, 0, 1, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 1, 0, 1]) assert dup_cyclotomic_p(f, ZZ) is False g = ZZ.map([1, 0, 1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 1, 0, 1]) assert dup_cyclotomic_p(g, ZZ) is True assert dup_cyclotomic_p([QQ(1), QQ(1), QQ(1)], QQ) is True assert dup_cyclotomic_p([QQ(1, 2), QQ(1), QQ(1)], QQ) is False K = ZZ['y'] assert dup_cyclotomic_p([K([ZZ(1)]), K([ZZ(1)]), K([ZZ(1)])], K) is False