예제 #1
0
def test_power_representation():
    tests = [
        (1729, 3, 2),
        (234, 2, 4),
        (2, 1, 2),
        (3, 1, 3),
        (5, 2, 2),
        (12352, 2, 4),
        (32760, 2, 3),
    ]

    for test in tests:
        n, p, k = test
        f = power_representation(n, p, k)

        while True:
            try:
                l = next(f)
                assert len(l) == k

                chk_sum = 0
                for l_i in l:
                    chk_sum = chk_sum + l_i ** p
                assert chk_sum == n

            except StopIteration:
                break

    assert list(power_representation(20, 2, 4, True)) == [(1, 1, 3, 3), (0, 0, 2, 4)]
    raises(ValueError, lambda: list(power_representation(1.2, 2, 2)))
    raises(ValueError, lambda: list(power_representation(2, 0, 2)))
    raises(ValueError, lambda: list(power_representation(2, 2, 0)))
    assert list(power_representation(-1, 2, 2)) == []
    assert list(power_representation(1, 1, 1)) == [(1,)]
    assert list(power_representation(3, 2, 1)) == []
    assert list(power_representation(4, 2, 1)) == [(2,)]
    assert list(power_representation(3 ** 4, 4, 6, zeros=True)) == [
        (1, 2, 2, 2, 2, 2),
        (0, 0, 0, 0, 0, 3),
    ]
    assert list(power_representation(3 ** 4, 4, 5, zeros=False)) == []
    assert list(power_representation(-2, 3, 2)) == [(-1, -1)]
    assert list(power_representation(-2, 4, 2)) == []
    assert list(power_representation(0, 3, 2, True)) == [(0, 0)]
    assert list(power_representation(0, 3, 2, False)) == []
    # when we are dealing with squares, do feasibility checks
    assert len(list(power_representation(4 ** 10 * (8 * 10 + 7), 2, 3))) == 0
    # there will be a recursion error if these aren't recognized
    big = 2 ** 30
    for i in [13, 10, 7, 5, 4, 2, 1]:
        assert list(sum_of_powers(big, 2, big - i)) == []
예제 #2
0
def test_sum_of_squares_powers():
    tru = {
        (0, 0, 1, 1, 11),
        (0, 0, 5, 7, 7),
        (0, 1, 3, 7, 8),
        (0, 1, 4, 5, 9),
        (0, 3, 4, 7, 7),
        (0, 3, 5, 5, 8),
        (1, 1, 2, 6, 9),
        (1, 1, 6, 6, 7),
        (1, 2, 3, 3, 10),
        (1, 3, 4, 4, 9),
        (1, 5, 5, 6, 6),
        (2, 2, 3, 5, 9),
        (2, 3, 5, 6, 7),
        (3, 3, 4, 5, 8),
    }
    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
    assert ans == tru

    raises(ValueError, lambda: list(sum_of_squares(10, -1)))
    assert list(sum_of_squares(-10, 2)) == []
    assert list(sum_of_squares(2, 3)) == []
    assert list(sum_of_squares(0, 3, True)) == [(0, 0, 0)]
    assert list(sum_of_squares(0, 3)) == []
    assert list(sum_of_squares(4, 1)) == [(2,)]
    assert list(sum_of_squares(5, 1)) == []
    assert list(sum_of_squares(50, 2)) == [(5, 5), (1, 7)]
    assert list(sum_of_squares(11, 5, True)) == [(1, 1, 1, 2, 2), (0, 0, 1, 1, 3)]
    assert list(sum_of_squares(8, 8)) == [(1, 1, 1, 1, 1, 1, 1, 1)]

    assert [len(list(sum_of_squares(i, 5, True))) for i in range(30)] == [
        1,
        1,
        1,
        1,
        2,
        2,
        1,
        1,
        2,
        2,
        2,
        2,
        2,
        3,
        2,
        1,
        3,
        3,
        3,
        3,
        4,
        3,
        3,
        2,
        2,
        4,
        4,
        4,
        4,
        5,
    ]
    assert [len(list(sum_of_squares(i, 5))) for i in range(30)] == [
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        1,
        0,
        0,
        1,
        0,
        1,
        1,
        0,
        1,
        1,
        0,
        1,
        2,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        3,
    ]
    for i in range(30):
        s1 = set(sum_of_squares(i, 5, True))
        assert not s1 or all(sum(j ** 2 for j in t) == i for t in s1)
        s2 = set(sum_of_squares(i, 5))
        assert all(sum(j ** 2 for j in t) == i for t in s2)

    raises(ValueError, lambda: list(sum_of_powers(2, -1, 1)))
    raises(ValueError, lambda: list(sum_of_powers(2, 1, -1)))
    assert list(sum_of_powers(-2, 3, 2)) == [(-1, -1)]
    assert list(sum_of_powers(-2, 4, 2)) == []
    assert list(sum_of_powers(2, 1, 1)) == [(2,)]
    assert list(sum_of_powers(2, 1, 3, True)) == [(0, 0, 2), (0, 1, 1)]
    assert list(sum_of_powers(5, 1, 2, True)) == [(0, 5), (1, 4), (2, 3)]
    assert list(sum_of_powers(6, 2, 2)) == []
    assert list(sum_of_powers(3 ** 5, 3, 1)) == []
    assert list(sum_of_powers(3 ** 6, 3, 1)) == [(9,)] and (9 ** 3 == 3 ** 6)
    assert list(sum_of_powers(2 ** 1000, 5, 2)) == []