def decompose_prime_square(n):
    """
    Attempt to write n as the sum of a prime and twice a square.

    >>> decompose_prime_square(9)
    (7, 1)
    >>> decompose_prime_square(15)
    (7, 2)
    >>> decompose_prime_square(21)
    (3, 3)
    >>> decompose_prime_square(25)
    (7, 3)
    >>> decompose_prime_square(27)
    (19, 2)
    >>> decompose_prime_square(33)
    (31, 1)
    """
    for p in up_to(n, primes()):
        if p == 2:
            continue
        residue = n - p
        assert residue % 2 == 0, residue
        square = residue // 2
        if is_perfect_square(square):
            return (p, isqrt(square))
def is_triangular_number(n):
    """
    >>> all(is_triangular_number(n) for n in up_to(1000000000, figurate_numbers(3)))
    True
    >>> any(is_triangular_number(n + 1) for n in up_to(1000000000, figurate_numbers(3)))
    False
    """
    #http://en.wikipedia.org/wiki/Triangular_number
    return is_perfect_square(8 * n + 1)