오일러 프로젝트 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 = 40775가 됩니다. 오각수와 육각수도 되는, 그 다음으로 큰 삼각수를 구하세요.

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

접근

언뜻 보기에 이 문제는 별로 어려운 게 아닌 것 같다. k를 늘려나가면서 삼각수를 구하고, 이 삼각수가 오각수이면서 육각수인지를 판단하면 된다. 어떤 수가 오각수이거나 육각수인지를 판단하려면, 해당 수열의 일반항의 식을 거꾸로 푼 식에 대입한 후 그 결과가 정수로 떨어지는지를 보면 된다.

우선 문제의 주어진 예시를 잘 보면, 모든 육각수가 삼각수 수열에 등장하는 것처럼 보인다. 삼각수 공식에 n 대신, 2k – 1을 넣어서 정리해보면…

\begin{array}{lll}
T_{2k-1} &= frac{(2k-1)(2k)}{2}  &left(k = 1, 2, 3,...right) \\
&=k(2k-1)
\end{array}

육각수의 일반항 공식과 같아진다. 즉 모든 홀수번째 삼각수는 육각수라는 점을 알 수 있다. 따라서 오각수인 육각수를 찾으면 되는데, 이차항의 계수가 오각수 공식에서 3으로 더 크기 때문에, 거꾸로 육각수인 오각수를 찾는 편이 더 빠르게 찾을 수 있다.

%%time

def p(k=1):
    while True:
        yield k * ( 3 * k - 1) // 2
        k += 1


def test(h):
    k = ((8 * h + 1) ** .5 + 1) / 4
    return int(k) == k

g = p(166)
while True:
    pk = next(g)
    if test(pk):
        print(pk)
        break

참고로, 육각수 검사 공식은 다음과 같이 유도된다. 위 코드에서는 아래 식으로 구한 순번 k가 정수인지 판단하는 것으로 h가 오각수인지를 판단한다.

\begin{array}{lll}
H_n &= n(2n - 1) \\
&= 2(n^2 - n + \frac{1}{16}) - \frac{1}{8} \\
&=2(n - \frac{1}{4})^2 - \frac{1}{8} \\
\frac{1}{2}\left(H_n + \frac{1}{8}\right) &= (n - \frac{1}{4})^2 \\
n &=  \sqrt{\frac{1}{2}\left(H_n + \frac{1}{8}\right)} + \frac{1}{4} \\
&= \frac{1}{4}\left(\sqrt{8H_n + 1} + 1\right)
\end{array}

Read more

워드프레스에서 고스트로 이전

워드프레스에서 고스트로 이전

이 글을 쓰면서도 믿기 힘든 사실인데, 블로그라는 걸 처음 시작한지가 20년이 되었습니다. 이글루스에서 처음 시작했다가, SK컴즈가 인수한다고 발표함과 동시에 워드프레스로 플랫폼을 옮겼죠. 워드프레스오 옮긴 이후에는 호스팅 환경을 이리 저리 옮기긴 했지만 거의 18년 가까이 워드프레스를 사용해온 것 같습니다. 그 동안 워드프레스는 블로깅 툴에서 명실상부한 범용CMS로 발전했습니다. 사실 웬만한 홈페이지들은 이제

By sooop
띄어쓰기에 대한 생각

띄어쓰기에 대한 생각

업무 메일을 쓸 때 가장 많이 쓰는 말 중에 하나가 메일 말미에 ‘업무에 참고 부탁 드립니다.‘인데요, 어느 날부터 아웃룩에서 이 ‘부탁 드립니다’가 틀렸다고 맞춤법 지적을 하기 시작했습니다. 맞는 말은 ‘부탁드립니다’라고 붙여 쓰는 거라고. 사실 아래아한글 시절부터 이전의 MS워드까지, 워드프로세서들의 한국어 맞춤법 검사 실력은 거의 있으나 마나 한

By sooop

구글 포토에서 아이클라우드로 탈출한 후기

한 때 구글 포토가 백업 용량을 무제한으로 제공해 주겠다고해서, 구글 포토를 사용해서 사진을 백업해왔습니다. 물론 이 이야기의 결말은 저나 이 글을 읽고 있는 여러분이나 모두 알고 있습니다. 사실 AI에게 학습 시킬 이미지 데이터를 모으기 위한 것일 뿐이라거나 하는 이야기는 그 당시에도 있었습니다만, 에이 그래도 구글인데 용량은 넉넉하게 주겠지…하는 순진한

By sooop

Julia의 함수 사용팁

연산자의 함수적 표기 Julia의 연산자는 기본적으로 함수이며, 함수 호출 표기와 같은 방식으로 호출하는 것이 가능합니다. 또한 그 자체로 함수이기 때문에 filter(), map() 과 같이 함수를 인자로 받는 함수에도 연산자를 그대로 적용하는 것이 가능합니다. 특히 + 연산자는 sum() 함수와 같이 여러 인자를 받아 인자들의 합을 구할 수 있습니다. 2 + 3 # = 5 +(2,

By sooop