示例#1
0
def test_diop_general_sum_of_squares_quick():
    for i in range(3, 10):
        assert check_solutions(sum(i**2 for i in symbols(f':{i:d}')) - i)
    pytest.raises(ValueError, lambda: _diop_general_sum_of_squares((x, y), 2))
    assert _diop_general_sum_of_squares((x, y, z), -2) == set()
    eq = x**2 + y**2 + z**2 - (1 + 4 + 9)
    assert diop_general_sum_of_squares(eq) == {(1, 2, 3)}
    eq = u**2 + v**2 + x**2 + y**2 + z**2 - 1313
    assert len(diop_general_sum_of_squares(eq, 3)) == 3
    # issue sympy/sympy#11016
    var = symbols(':5') + (symbols('6', negative=True), )
    eq = Add(*[i**2 for i in var]) - 112
    assert diophantine(eq) == {(0, 1, 1, 5, 6, -7), (1, 1, 1, 3, 6, -8),
                               (2, 3, 3, 4, 5, -7), (0, 1, 1, 1, 3, -10),
                               (0, 0, 4, 4, 4, -8), (1, 2, 3, 3, 5, -8),
                               (0, 1, 2, 3, 7, -7), (2, 2, 4, 4, 6, -6),
                               (1, 1, 3, 4, 6, -7), (0, 2, 3, 3, 3, -9),
                               (0, 0, 2, 2, 2, -10), (1, 1, 2, 3, 4, -9),
                               (0, 1, 1, 2, 5, -9), (0, 0, 2, 6, 6, -6),
                               (1, 3, 4, 5, 5, -6), (0, 2, 2, 2, 6, -8),
                               (0, 3, 3, 3, 6, -7), (0, 2, 3, 5, 5, -7),
                               (0, 1, 5, 5, 5, -6)}
    # handle negated squares with signsimp
    assert diophantine(12 - x**2 - y**2 - z**2) == {(2, 2, 2)}
    # diophantine handles simplification, so classify_diop should
    # not have to look for additional patterns that are removed
    # by diophantine
    eq = a**2 + b**2 + c**2 + d**2 - 4
    pytest.raises(NotImplementedError, lambda: classify_diop(-eq))
示例#2
0
def test_diop_general_sum_of_squares_quick():
    for i in range(3, 10):
        assert check_solutions(sum(i**2 for i in symbols(':%i' % i)) - i)
    pytest.raises(ValueError, lambda: _diop_general_sum_of_squares((x, y), 2))
    assert _diop_general_sum_of_squares((x, y, z), -2) == set()
    eq = x**2 + y**2 + z**2 - (1 + 4 + 9)
    assert diop_general_sum_of_squares(eq) == {(1, 2, 3)}
    eq = u**2 + v**2 + x**2 + y**2 + z**2 - 1313
    assert len(diop_general_sum_of_squares(eq, 3)) == 3
    # issue sympy/sympy#11016
    var = symbols(':5') + (symbols('6', negative=True),)
    eq = Add(*[i**2 for i in var]) - 112
    assert diophantine(eq) == {
        (0, 1, 1, 5, 6, -7), (1, 1, 1, 3, 6, -8), (2, 3, 3, 4, 5, -7),
        (0, 1, 1, 1, 3, -10), (0, 0, 4, 4, 4, -8), (1, 2, 3, 3, 5, -8),
        (0, 1, 2, 3, 7, -7), (2, 2, 4, 4, 6, -6), (1, 1, 3, 4, 6, -7),
        (0, 2, 3, 3, 3, -9), (0, 0, 2, 2, 2, -10), (1, 1, 2, 3, 4, -9),
        (0, 1, 1, 2, 5, -9), (0, 0, 2, 6, 6, -6), (1, 3, 4, 5, 5, -6),
        (0, 2, 2, 2, 6, -8), (0, 3, 3, 3, 6, -7), (0, 2, 3, 5, 5, -7),
        (0, 1, 5, 5, 5, -6)}
    # handle negated squares with signsimp
    assert diophantine(12 - x**2 - y**2 - z**2) == {(2, 2, 2)}
    # diophantine handles simplification, so classify_diop should
    # not have to look for additional patterns that are removed
    # by diophantine
    eq = a**2 + b**2 + c**2 + d**2 - 4
    pytest.raises(NotImplementedError, lambda: classify_diop(-eq))
示例#3
0
def test_diopcoverage():
    eq = (2*x + y + 1)**2
    assert diop_solve(eq) == {(t_0, -2*t_0 - 1)}
    eq = 2*x**2 + 6*x*y + 12*x + 4*y**2 + 18*y + 18
    assert diop_solve(eq) == {(t_0, -t_0 - 3), (2*t_0 - 3, -t_0)}
    assert diop_quadratic(x + y**2 - 3) == {(-t**2 + 3, -t)}
    assert diop_quadratic(x + y) is None  # wrong type

    assert diop_linear(x + y - 3) == (t_0, 3 - t_0)
    assert diop_linear(x**2 - 1) is None  # wrong type

    assert base_solution_linear(0, 1, 2, t=None) == (0, 0)
    ans = (3*t - 1, -2*t + 1)
    assert base_solution_linear(4, 8, 12, t) == ans
    assert base_solution_linear(4, 8, 12, t=None) == tuple(_.subs({t: 0}) for _ in ans)

    assert cornacchia(1, 1, 20) is None
    assert cornacchia(1, 1, 5) == {(1, 2)}
    assert cornacchia(1, 2, 17) == {(3, 2)}
    assert cornacchia(2, 3, 31) == set()

    pytest.raises(ValueError, lambda: reconstruct(4, 20, 1))

    assert gaussian_reduce(4, 1, 3) == (1, 1)
    eq = -w**2 - x**2 - y**2 + z**2

    assert (diop_general_pythagorean(eq) == diop_general_pythagorean(-eq) ==
            (m1**2 + m2**2 - m3**2, 2*m1*m3, 2*m2*m3, m1**2 + m2**2 + m3**2))

    assert check_param(Integer(3) + x/3, Integer(4) + x/2,
                       Integer(2), x) == (None, None)
    assert check_param(Rational(3, 2), Integer(4) + x,
                       Integer(2), x) == (None, None)
    assert check_param(Integer(4) + x, Rational(3, 2),
                       Integer(2), x) == (None, None)

    assert _nint_or_floor(16, 10) == 2
    assert _odd(1) == (not _even(1)) is True
    assert _odd(0) == (not _even(0)) is False
    assert _remove_gcd(2, 4, 6) == (1, 2, 3)
    pytest.raises(TypeError, lambda: _remove_gcd((2, 4, 6)))
    assert sqf_normal(2 * 3**2 * 5, 2 * 5 * 11, 2 * 7**2 * 11) == (11, 1, 5)

    # it's ok if these pass some day when the solvers are implemented
    pytest.raises(NotImplementedError, lambda: diophantine(x**2 + y**2 + x*y + 2*y*z - 12))
    pytest.raises(NotImplementedError, lambda: diophantine(x**3 + y**2))

    # issue sympy/sympy#11026
    pytest.raises(NotImplementedError, lambda: diophantine(x**3 + y**3 - 2))

    assert transformation_to_DN(x + y) is None  # wrong type
    assert find_DN(x + y) is None  # wrong type
    assert diop_ternary_quadratic(x + y) is None  # wrong type
    assert transformation_to_normal(x + y) is None  # wrong type
    assert parametrize_ternary_quadratic(x + y) is None  # wrong type
    assert diop_general_pythagorean(x + y) is None  # wrong type
    assert diop_general_sum_of_squares(x + y) is None  # wrong type
    assert diop_general_sum_of_even_powers(x + y) is None  # wrong type
示例#4
0
def test_diop_sum_of_even_powers():
    eq = u**2 + v**2 + x**2 + y**2 + z**2 - 123
    ans = diop_general_sum_of_squares(eq, oo)  # allow oo to be used
    assert len(ans) == 14

    eq = x**4 + y**4 + z**4 - 2673
    assert diop_solve(eq) == {(3, 6, 6), (2, 4, 7)}
    assert diop_general_sum_of_even_powers(eq, 2) == {(3, 6, 6), (2, 4, 7)}
    pytest.raises(NotImplementedError, lambda: diop_general_sum_of_even_powers(-eq, 2))
    neg = symbols('neg', negative=True)
    eq = x**4 + y**4 + neg**4 - 2673
    assert diop_general_sum_of_even_powers(eq) == {(-3, 6, 6)}
    assert diophantine(x**4 + y**4 + 2) == set()
    assert diop_general_sum_of_even_powers(x**4 + y**4 - 2, limit=0) == set()
示例#5
0
def test_diop_sum_of_even_powers():
    eq = u**2 + v**2 + x**2 + y**2 + z**2 - 123
    ans = diop_general_sum_of_squares(eq, oo)  # allow oo to be used
    assert len(ans) == 14

    eq = x**4 + y**4 + z**4 - 2673
    assert diop_solve(eq) == {(3, 6, 6), (2, 4, 7)}
    assert diop_general_sum_of_even_powers(eq, 2) == {(3, 6, 6), (2, 4, 7)}
    pytest.raises(NotImplementedError,
                  lambda: diop_general_sum_of_even_powers(-eq, 2))
    neg = symbols('neg', negative=True)
    eq = x**4 + y**4 + neg**4 - 2673
    assert diop_general_sum_of_even_powers(eq) == {(-3, 6, 6)}
    assert diophantine(x**4 + y**4 + 2) == set()
    assert diop_general_sum_of_even_powers(x**4 + y**4 - 2, limit=0) == set()
示例#6
0
def test_diopcoverage():
    eq = (2 * x + y + 1)**2
    assert diop_solve(eq) == {(t_0, -2 * t_0 - 1)}
    eq = 2 * x**2 + 6 * x * y + 12 * x + 4 * y**2 + 18 * y + 18
    assert diop_solve(eq) == {(t_0, -t_0 - 3), (2 * t_0 - 3, -t_0)}
    assert diop_quadratic(x + y**2 - 3) == {(-t**2 + 3, -t)}
    assert diop_quadratic(x + y) is None  # wrong type

    assert diop_linear(x + y - 3) == (t_0, 3 - t_0)
    assert diop_linear(x**2 - 1) is None  # wrong type

    assert base_solution_linear(0, 1, 2, t=None) == (0, 0)
    ans = (3 * t - 1, -2 * t + 1)
    assert base_solution_linear(4, 8, 12, t) == ans
    assert base_solution_linear(4, 8, 12,
                                t=None) == tuple(_.subs({t: 0}) for _ in ans)

    assert cornacchia(1, 1, 20) is None
    assert cornacchia(1, 1, 5) == {(2, 1)}
    assert cornacchia(1, 2, 17) == {(3, 2)}
    assert cornacchia(2, 3, 31) == set()
    assert cornacchia(1, 4, 52) == {(4, 3)}

    pytest.raises(ValueError, lambda: reconstruct(4, 20, 1))

    assert gaussian_reduce(4, 1, 3) == (1, 1)
    eq = -w**2 - x**2 - y**2 + z**2

    assert (diop_general_pythagorean(eq) == diop_general_pythagorean(-eq) ==
            (m1**2 + m2**2 - m3**2, 2 * m1 * m3, 2 * m2 * m3,
             m1**2 + m2**2 + m3**2))

    assert check_param(Integer(3) + x / 3,
                       Integer(4) + x / 2, Integer(2), x) == (None, None)
    assert check_param(Rational(3, 2),
                       Integer(4) + x, Integer(2), x) == (None, None)
    assert check_param(Integer(4) + x, Rational(3, 2), Integer(2),
                       x) == (None, None)

    assert _nint_or_floor(16, 10) == 2
    assert _odd(1) == (not _even(1)) is True
    assert _odd(0) == (not _even(0)) is False
    assert _remove_gcd(2, 4, 6) == (1, 2, 3)
    assert sqf_normal(2 * 3**2 * 5, 2 * 5 * 11, 2 * 7**2 * 11) == (11, 1, 5)

    # it's ok if these pass some day when the solvers are implemented
    pytest.raises(NotImplementedError,
                  lambda: diophantine(x**2 + y**2 + x * y + 2 * y * z - 12))
    pytest.raises(NotImplementedError, lambda: diophantine(x**3 + y**2))

    # issue sympy/sympy#11026
    pytest.raises(NotImplementedError, lambda: diophantine(x**3 + y**3 - 2))

    assert transformation_to_DN(x + y) is None  # wrong type
    assert find_DN(x + y) is None  # wrong type
    assert diop_ternary_quadratic(x + y) is None  # wrong type
    assert transformation_to_normal(x + y) is None  # wrong type
    assert parametrize_ternary_quadratic(x + y) is None  # wrong type
    assert diop_general_pythagorean(x + y) is None  # wrong type
    assert diop_general_sum_of_squares(x + y) is None  # wrong type
    assert diop_general_sum_of_even_powers(x + y) is None  # wrong type

    assert diop_quadratic(x**2 + y**2 - 1**2 - 3**4) == \
        {(-9, -1), (-9, 1), (-1, -9), (-1, 9), (1, -9), (1, 9), (9, -1), (9, 1)}