project euler 45

오일러 프로젝트 45 번

삼각수, 오각수, 육각수는 아래 식으로 구할 수 있습니다.

삼각수     Tn = n (n + 1) / 2      1, 3, 6, 10, 15, ...
오각수     Pn = n (3n − 1) / 2     1, 5, 12, 22, 35, ...
육각수     Hn = n (2n − 1)     1, 6, 15, 28, 45, ...
여기서 T285 = P165 = H143 = 40755 가 됩니다.

오각수와 육각수도 되는, 그 다음으로 큰 삼각수를 구하세요.

http://euler.synap.co.kr/prob_detail.php?id=45

모든 육각수는 그 자체로 삼각수이므로, 오각수가 육각수인지 판별해나가면 된다. 육각수 판별식은 육각수 일반항 식을 역으로 풀어서 n이 자연수인지 판단한다.


def is_hexagonal(k):
    n = (((8*k+1) ** 0.5) + 1 ) /4
    return int(n) == n

def pn(n):
    return n * ( 3 * n - 1) // 2

def e45():
    k = 166
    while True:
        pk = pn(k)
        if is_hexagonal(pk):
            print(pk)
            break
        k += 1

%time e45()

# 1533776805
# Wall time: 98 ms