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)