LoginSignup
1
1

More than 3 years have passed since last update.

Project Euler 57をPythonでやってみる

Posted at

問題57

英語
https://projecteuler.net/problem=57
日本語
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2057

解答57

この問題の第$n$項目の連分数を$a_n$とすると1〜4項目は以下のようになる。

\begin{align}
a_1 &= 1+\cfrac{1}{2} = \cfrac{3}{2} \\
a_2 &= 1+\cfrac{1}{2+\cfrac{1}{2}}=\cfrac{7}{5} \\
a_3 &= 1+\cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2}}}=\cfrac{17}{12} \\
a_4 &= 1+\cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2}}}}=\cfrac{41}{29}
\end{align}

上の4つにおいて次の$*$の部分に注目する。

1+\cfrac{1}{*}

すると、$*$は前の項に1を足したものになっていることが分かる。
この関係を漸化式にすると次のようになる。

a_{n+1}=1+\cfrac{1}{a_n+1}

さらに$a_m$の分子を$N_m$ , 分母を$D_m$とおくと次のような関係が分かる。($N_m,D_m$は互いに素)

\begin{align}
a_{m+1} = \cfrac{N_{m+1}}{D_{m+1}} &= 1+\cfrac{1}{1+\cfrac{N_m}{D_m}} \\
&= 1+\cfrac{D_m}{N_m+D_m} \\
&= \cfrac{N_m+2 \cdot D_m}{N_m+D_m}
\end{align} \\
\therefore N_{m+1} = N_m+2 \cdot D_m \\
N_{m+1} = N_m+D_m

ここまで分かったのであとは分母と分子をそれぞれ更新して桁数をチェックしていけばいいです。
コードは次のようになります。

ProjectEuler51.py
def next(num_tpl):
    return (num_tpl[0]+2*num_tpl[1],num_tpl[0]+num_tpl[1])

count = 0
fraction = (3,2)
for i in range(1,1000):
    fraction = next(fraction)
    if len(str(fraction[0])) > len(str(fraction[1])):
        count += 1

print(count)

0.091 seconds

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1