def test_dmp_rr_div(): pytest.raises(ZeroDivisionError, lambda: dmp_rr_div([[1, 2], [3]], [[]], 1, ZZ)) f = dmp_normal([[1], [], [1, 0, 0]], 1, ZZ) g = dmp_normal([[1], [-1, 0]], 1, ZZ) q = dmp_normal([[1], [1, 0]], 1, ZZ) r = dmp_normal([[2, 0, 0]], 1, ZZ) assert dmp_rr_div(f, g, 1, ZZ) == (q, r) f = dmp_normal([[1], [], [1, 0, 0]], 1, ZZ) g = dmp_normal([[-1], [1, 0]], 1, ZZ) q = dmp_normal([[-1], [-1, 0]], 1, ZZ) r = dmp_normal([[2, 0, 0]], 1, ZZ) assert dmp_rr_div(f, g, 1, ZZ) == (q, r) f = dmp_normal([[1], [], [1, 0, 0]], 1, ZZ) g = dmp_normal([[2], [-2, 0]], 1, ZZ) q, r = [[]], f assert dmp_rr_div(f, g, 1, ZZ) == (q, r)
def test_dup_diff(): assert dup_diff([], 1, ZZ) == [] assert dup_diff([7], 1, ZZ) == [] assert dup_diff([2, 7], 1, ZZ) == [2] assert dup_diff([1, 2, 1], 1, ZZ) == [2, 2] assert dup_diff([1, 2, 3, 4], 1, ZZ) == [3, 4, 3] assert dup_diff([1, -1, 0, 0, 2], 1, ZZ) == [4, -3, 0, 0] f = dmp_normal([17, 34, 56, -345, 23, 76, 0, 0, 12, 3, 7], 0, ZZ) assert dup_diff(f, 0, ZZ) == f assert dup_diff(f, 1, ZZ) == dup_diff(f, 1, ZZ) assert dup_diff(f, 2, ZZ) == dup_diff(dup_diff(f, 1, ZZ), 1, ZZ) assert dup_diff( f, 3, ZZ) == dup_diff(dup_diff(dup_diff(f, 1, ZZ), 1, ZZ), 1, ZZ) K = FF(3) f = dmp_normal([17, 34, 56, -345, 23, 76, 0, 0, 12, 3, 7], 0, K) assert dup_diff(f, 1, K) == dmp_normal([2, 0, 1, 0, 0, 2, 0, 0, 0, 0], 0, K) assert dup_diff(f, 2, K) == dmp_normal([1, 0, 0, 2, 0, 0, 0], 0, K) assert dup_diff(f, 3, K) == dmp_normal([], 0, K) assert dup_diff(f, 0, K) == f assert dup_diff(f, 1, K) == dup_diff(f, 1, K) assert dup_diff(f, 2, K) == dup_diff(dup_diff(f, 1, K), 1, K) assert dup_diff( f, 3, K) == dup_diff(dup_diff(dup_diff(f, 1, K), 1, K), 1, K)
def test_dmp_permute(): f = dmp_normal([[1, 0, 0], [], [1, 0], [], [1]], 1, ZZ) g = dmp_normal([[1, 0, 0, 0, 0], [1, 0, 0], [1]], 1, ZZ) assert dmp_permute(f, [0, 1], 1, ZZ) == f assert dmp_permute(g, [0, 1], 1, ZZ) == g assert dmp_permute(f, [1, 0], 1, ZZ) == g assert dmp_permute(g, [1, 0], 1, ZZ) == f
def test_dmp_quo_ground(): f = dmp_normal([[6], [2], [8]], 1, ZZ) assert dmp_quo_ground(f, ZZ(1), 1, ZZ) == f assert dmp_quo_ground(f, ZZ(2), 1, ZZ) == dmp_normal([[3], [1], [4]], 1, ZZ) assert dmp_normal(dmp_quo_ground(f, ZZ(3), 1, ZZ), 1, ZZ) == dmp_normal([[2], [], [2]], 1, ZZ)
def test_dmp_ground_extract(): f = dmp_normal([[2930944], [], [2198208], [], [549552], [], [45796]], 1, ZZ) g = dmp_normal([[17585664], [], [8792832], [], [1099104], []], 1, ZZ) F = dmp_normal([[64], [], [48], [], [12], [], [1]], 1, ZZ) G = dmp_normal([[384], [], [192], [], [24], []], 1, ZZ) assert dmp_ground_extract(f, g, 1, ZZ) == (45796, F, G)
def test_dmp_swap(): f = dmp_normal([[1, 0, 0], [], [1, 0], [], [1]], 1, ZZ) g = dmp_normal([[1, 0, 0, 0, 0], [1, 0, 0], [1]], 1, ZZ) assert dmp_swap(f, 1, 1, 1, ZZ) == f assert dmp_swap(f, 0, 1, 1, ZZ) == g assert dmp_swap(g, 0, 1, 1, ZZ) == f pytest.raises(IndexError, lambda: dmp_swap(f, -1, -7, 1, ZZ))
def test_dmp_normal(): assert dmp_normal([0, 1.5, 2, 3], 0, ZZ) == [ZZ(1), ZZ(2), ZZ(3)] assert (dmp_normal([0, 0, 2, 1, 0, 11, 0], 0, ZZ) == [ZZ(2), ZZ(1), ZZ(0), ZZ(11), ZZ(0)]) assert (dmp_normal([[0], [], [0, 2, 1], [0], [11], []], 1, ZZ) == [[ZZ(2), ZZ(1)], [], [ZZ(11)], []]) F5 = FF(5) assert dmp_normal([5, 10, 21, -3], 0, F5) == [F5(1), F5(2)] F11 = FF(11) assert dmp_normal([11, 22, 17, 1, 0], 0, F11) == [F11(6), F11(1), F11(0)]
def test_dmp_diff(): assert dmp_diff([], 1, 0, ZZ) == [] assert dmp_diff([[]], 1, 1, ZZ) == [[]] assert dmp_diff([[[]]], 1, 2, ZZ) == [[[]]] assert dmp_diff([[[1], [2]]], 1, 2, ZZ) == [[[]]] assert dmp_diff([[[1]], [[]]], 1, 2, ZZ) == [[[1]]] assert dmp_diff([[[3]], [[1]], [[]]], 1, 2, ZZ) == [[[6]], [[1]]] assert dmp_diff([1, -1, 0, 0, 2], 1, 0, ZZ) == \ dup_diff([1, -1, 0, 0, 2], 1, ZZ) assert dmp_diff(f_6, 0, 3, ZZ) == f_6 assert dmp_diff(f_6, 1, 3, ZZ) == dmp_diff(f_6, 1, 3, ZZ) assert dmp_diff( f_6, 2, 3, ZZ) == dmp_diff(dmp_diff(f_6, 1, 3, ZZ), 1, 3, ZZ) assert dmp_diff(f_6, 3, 3, ZZ) == dmp_diff( dmp_diff(dmp_diff(f_6, 1, 3, ZZ), 1, 3, ZZ), 1, 3, ZZ) K = FF(23) F_6 = dmp_normal(f_6, 3, K) assert dmp_diff(F_6, 0, 3, K) == F_6 assert dmp_diff(F_6, 1, 3, K) == dmp_diff(F_6, 1, 3, K) assert dmp_diff(F_6, 2, 3, K) == dmp_diff(dmp_diff(F_6, 1, 3, K), 1, 3, K) assert dmp_diff(F_6, 3, 3, K) == dmp_diff( dmp_diff(dmp_diff(F_6, 1, 3, K), 1, 3, K), 1, 3, K)
def test_dmp_ff_div(): pytest.raises(ZeroDivisionError, lambda: dmp_ff_div([[1, 2], [3]], [[]], 1, QQ)) f = dmp_normal([[1], [], [1, 0, 0]], 1, QQ) g = dmp_normal([[1], [-1, 0]], 1, QQ) q = [[QQ(1, 1)], [QQ(1, 1), QQ(0, 1)]] r = [[QQ(2, 1), QQ(0, 1), QQ(0, 1)]] assert dmp_ff_div(f, g, 1, QQ) == (q, r) f = dmp_normal([[1], [], [1, 0, 0]], 1, QQ) g = dmp_normal([[-1], [1, 0]], 1, QQ) q = [[QQ(-1, 1)], [QQ(-1, 1), QQ(0, 1)]] r = [[QQ(2, 1), QQ(0, 1), QQ(0, 1)]] assert dmp_ff_div(f, g, 1, QQ) == (q, r) f = dmp_normal([[1], [], [1, 0, 0]], 1, QQ) g = dmp_normal([[2], [-2, 0]], 1, QQ) q = [[QQ(1, 2)], [QQ(1, 2), QQ(0, 1)]] r = [[QQ(2, 1), QQ(0, 1), QQ(0, 1)]] assert dmp_ff_div(f, g, 1, QQ) == (q, r)
def test_printing(): f, g = [dmp_normal([], 0, EX)] * 2 e = PolynomialDivisionFailed(f, g, EX) assert str(e)[:57] == ("couldn't reduce degree in a polynomial " 'division algorithm') assert str(e)[-140:][:57] == ('You may want to use a different ' 'simplification algorithm.') f, g = [dmp_normal([], 0, RR)] * 2 e = PolynomialDivisionFailed(f, g, RR) assert str(e)[-139:][:74] == ('Your working precision or tolerance of ' 'computations may be set improperly.') f, g = [dmp_normal([], 0, ZZ)] * 2 e = PolynomialDivisionFailed(f, g, ZZ) assert str(e)[-168:][:80] == ( 'Zero detection is guaranteed in this ' 'coefficient domain. This may indicate a bug') e = OperationNotSupported(Poly(x), 'spam') assert str(e).find('spam') >= 0 assert str(e).find('operation not supported') >= 0 exc = PolificationFailed(1, x, x**2) assert str(exc).find("can't construct a polynomial from x") >= 0 exc = PolificationFailed(1, [x], [x**2], True) assert str(exc).find("can't construct polynomials from x") >= 0 e = ComputationFailed('LT', 1, exc) assert str(e).find('failed without generators') >= 0 assert str(e).find('x**2') >= 0 e = ExactQuotientFailed(Poly(x), Poly(x**2)) assert str(e).find('does not divide') >= 0 assert str(e).find('x**2') >= 0 assert str(e).find('in ZZ') < 0 e = ExactQuotientFailed(Poly(x), Poly(x**2), ZZ) assert str(e).find('in ZZ') >= 0
def test_printing(): f, g = [dmp_normal([], 0, EX)]*2 e = PolynomialDivisionFailed(f, g, EX) assert str(e)[:57] == ("couldn't reduce degree in a polynomial " "division algorithm") assert str(e)[-140:][:57] == ("You may want to use a different " "simplification algorithm.") f, g = [dmp_normal([], 0, RR)]*2 e = PolynomialDivisionFailed(f, g, RR) assert str(e)[-139:][:74] == ("Your working precision or tolerance of " "computations may be set improperly.") f, g = [dmp_normal([], 0, ZZ)]*2 e = PolynomialDivisionFailed(f, g, ZZ) assert str(e)[-168:][:80] == ("Zero detection is guaranteed in this " "coefficient domain. This may indicate a bug") e = OperationNotSupported(Poly(x), 'spam') assert str(e).find('spam') >= 0 assert str(e).find('operation not supported') >= 0 exc = PolificationFailed(1, x, x**2) assert str(exc).find("can't construct a polynomial from x") >= 0 exc = PolificationFailed(1, [x], [x**2], True) assert str(exc).find("can't construct polynomials from x") >= 0 e = ComputationFailed('LT', 1, exc) assert str(e).find('failed without generators') >= 0 assert str(e).find('x**2') >= 0 e = ExactQuotientFailed(Poly(x), Poly(x**2)) assert str(e).find('does not divide') >= 0 assert str(e).find('x**2') >= 0 assert str(e).find('in ZZ') < 0 e = ExactQuotientFailed(Poly(x), Poly(x**2), ZZ) assert str(e).find('in ZZ') >= 0
def test_dup_real_imag(): assert dup_real_imag([], ZZ) == ([[]], [[]]) assert dup_real_imag([ZZ(1)], ZZ) == ([[1]], [[]]) assert dup_real_imag([ZZ(1), ZZ(1)], ZZ) == ([[1], [1]], [[1, 0]]) assert dup_real_imag([ZZ(1), ZZ(2)], ZZ) == ([[1], [2]], [[1, 0]]) assert dup_real_imag([ZZ(1), ZZ(2), ZZ(3)], ZZ) == ([[1], [2], [-1, 0, 3]], [[2, 0], [2, 0]]) f = dmp_normal([1, 1, 1, 1], 0, ZZ) assert dup_real_imag(f, ZZ) == ([[1], [1], [-3, 0, 1], [-1, 0, 1]], [[3, 0], [2, 0], [-1, 0, 1, 0]]) f = dmp_normal([1, 1], 0, EX) pytest.raises(DomainError, lambda: dup_real_imag(f, EX)) A = QQ.algebraic_field(I) f = [A(1), A(I), A(0), A(-1), A(1)] assert dup_real_imag(f, A) == ([[1], [], [-6, -3, 0], [-1], [1, 1, 0, 0, 1]], [[4, 1], [], [-4, -3, 0, 0], [-1, 0]]) A = QQ.algebraic_field(sqrt(2)) f = [A(1), A(sqrt(2)), A(-1)] assert dup_real_imag(f, A) == ([[1], [A.unit], [-1, 0, -1]], [[2, 0], [A.unit, 0]]) A2 = A.algebraic_field(I) f = [A2(1), A2(2*sqrt(2)*I), A2(I - 1)] assert dup_real_imag(f, A2) == ([[1], [], [-1, -2*A.unit, -1]], [[2, 2*A.unit], [1]])
def test_dmp_ground_extract(): f = dmp_normal([2930944, 0, 2198208, 0, 549552, 0, 45796], 0, ZZ) g = dmp_normal([17585664, 0, 8792832, 0, 1099104, 0], 0, ZZ) F = dmp_normal([64, 0, 48, 0, 12, 0, 1], 0, ZZ) G = dmp_normal([384, 0, 192, 0, 24, 0], 0, ZZ) assert dmp_ground_extract(f, g, 0, ZZ) == (45796, F, G) f, g = [ZZ(6), ZZ(12), ZZ(18)], [ZZ(4), ZZ(8), ZZ(12)] assert dmp_ground_extract(f, g, 0, ZZ) == (2, [3, 6, 9], [2, 4, 6]) f = dmp_normal([[2930944], [], [2198208], [], [549552], [], [45796]], 1, ZZ) g = dmp_normal([[17585664], [], [8792832], [], [1099104], []], 1, ZZ) F = dmp_normal([[64], [], [48], [], [12], [], [1]], 1, ZZ) G = dmp_normal([[384], [], [192], [], [24], []], 1, ZZ) assert dmp_ground_extract(f, g, 1, ZZ) == (45796, F, G)
def test_dmp_pdiv(): f = dmp_normal([[1], [], [1, 0, 0]], 1, ZZ) g = dmp_normal([[1], [-1, 0]], 1, ZZ) q = dmp_normal([[1], [1, 0]], 1, ZZ) r = dmp_normal([[2, 0, 0]], 1, ZZ) assert dmp_pdiv(f, g, 1, ZZ) == (q, r) assert dmp_pquo(f, g, 1, ZZ) == q assert dmp_prem(f, g, 1, ZZ) == r pytest.raises(ExactQuotientFailed, lambda: dmp_pexquo(f, g, 1, ZZ)) f = dmp_normal([[1], [], [1, 0, 0]], 1, ZZ) g = dmp_normal([[2], [-2, 0]], 1, ZZ) q = dmp_normal([[2], [2, 0]], 1, ZZ) r = dmp_normal([[8, 0, 0]], 1, ZZ) assert dmp_pdiv(f, g, 1, ZZ) == (q, r) assert dmp_pquo(f, g, 1, ZZ) == q assert dmp_prem(f, g, 1, ZZ) == r pytest.raises(ExactQuotientFailed, lambda: dmp_pexquo(f, g, 1, ZZ))
dup_abs, dmp_abs, dup_neg, dmp_neg, dup_add, dmp_add, dup_sub, dmp_sub, dup_mul, dmp_mul, dup_sqr, dmp_sqr, dup_pow, dmp_pow, dup_add_mul, dmp_add_mul, dup_sub_mul, dmp_sub_mul, dup_pdiv, dup_prem, dup_pquo, dup_pexquo, dmp_pdiv, dmp_prem, dmp_pquo, dmp_pexquo, dup_rr_div, dmp_rr_div, dup_ff_div, dmp_ff_div, dup_div, dup_rem, dup_quo, dup_exquo, dmp_div, dmp_rem, dmp_quo, dmp_exquo, dup_max_norm, dmp_max_norm, dup_l1_norm, dmp_l1_norm, dup_expand, dmp_expand) from diofant.polys.polyerrors import ExactQuotientFailed from diofant.polys.specialpolys import f_polys from diofant.polys.domains import FF, ZZ, QQ __all__ = () f_0, f_1, f_2, f_3, f_4, f_5, f_6 = [f.to_dense() for f in f_polys()] F_0 = dmp_mul_ground(dmp_normal(f_0, 2, QQ), QQ(1, 7), 2, QQ) def test_dup_add_term(): f = dup_normal([], ZZ) assert dup_add_term(f, ZZ(0), 0, ZZ) == dup_normal([], ZZ) assert dup_add_term(f, ZZ(1), 0, ZZ) == dup_normal([1], ZZ) assert dup_add_term(f, ZZ(1), 1, ZZ) == dup_normal([1, 0], ZZ) assert dup_add_term(f, ZZ(1), 2, ZZ) == dup_normal([1, 0, 0], ZZ) f = dup_normal([1, 1, 1], ZZ) assert dup_add_term(f, ZZ(1), 0, ZZ) == dup_normal([1, 1, 2], ZZ) assert dup_add_term(f, ZZ(1), 1, ZZ) == dup_normal([1, 2, 1], ZZ)
def test_dmp_ground_trunc(): assert dmp_ground_trunc(f_0, ZZ(3), 2, ZZ) == \ dmp_normal( [[[1, -1, 0], [-1]], [[]], [[1, -1, 0], [1, -1, 1], [1]]], 2, ZZ)
def test_dmp_normal(): assert dmp_normal([[0], [], [0, 2, 1], [0], [11], []], 1, ZZ) == \ [[ZZ(2), ZZ(1)], [], [ZZ(11)], []]