프로젝트 오일러 045
오각수와 육각수도 되는 삼각수
문제
삼각수와 육각수
삼각수 공식에서 n을 (2k - 1)로 치환하여 정리하면 k에 관한 육각수 공식이 됩니다. 즉, 2k - 1은 홀수를 나타내는 식이니, 홀수번째 삼각수는 육각수이기도 한 것이죠. 따라서 모든 육각수는 삼각수입니다. 그러면 40,775보다 큰 오각수이면서 육각수인 수를 찾으면 됩니다.
여기서 사소한 선택을 하나 해야 합니다.
- 오각수의 수열을 진행하며 육각수인지 검사
- 육각수의 수열을 진행하며 오각수인지 검사
각 수열의 일반항에서 최고차항은 둘 다 2차항인데, 오각수의 최고차항 계수가 더 큰 값이므로 오각수를 기준으로 육각수인지 검사하는 것이 좀 더 (사실 비율로는 훨씬 더) 빠를 겁니다.
육각수인지 검사하는 것은 Hn에 관한 식을 반대로 n에 관한 식으로 풀어낸 후 Hn 자리에 어떤 값을 넣어서 그 값이 정수인지 확인하면 됩니다.
def p(k=1):
while True:
yield k * ( 3 * k - 1) // 2
k += 1
def test(h):
k = ((8 * h + 1) ** 0.5 + 1) / 4
return int(k) == k
def main():
g = p(166)
while True:
pk = next(g)
if test(pk):
return pk
if __name__ == '__main__':
print(main())