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_hexagonal_number(n): """ >>> all(is_hexagonal_number(n) for n in up_to(1000000000, figurate_numbers(6))) True >>> any(is_hexagonal_number(n + 1) for n in up_to(1000000000, figurate_numbers(6))) False """ #http://en.wikipedia.org/wiki/Hexagonal_number h = 8 * n + 1 r = isqrt(h) if r * r != h: return False return (r + 1) % 4 == 0