本文へ移動

黄金数の漸化式をPythonで調べる:有理数条件と整数演算

技術

数列の有理数条件を整数条件へ変換し、isqrtで平方数を判定する流れと、探索で見つかった4つの例を示す図

根号を繰り返す数列は、黄金数を考える入口になります。この記事では、ある項が有理数になる条件を整数の問題へ変換し、Pythonで指定した範囲を探索します。計算で見つかった例と、すべての解を示す数学的な証明は分けて扱います。

2026年10月8日改訂。数式の記号を定義し、浮動小数点の平方根を使った探索を整数演算へ変更しました。

数列と調べたい条件を定義する

以下の記号を使います。

記号定義
\(m\)0以上の整数で、数列を決めるパラメーター
\(n\)1以上の整数で、項の番号
\(d_n\)数列の第\(n\)項
\(\sqrt{\;\;}\)0以上の平方根

最初の項と、その次の項を作る規則を次で定めます。

\[d_1=1,\qquad d_{n+1}=\sqrt{1+m d_n}.\]

第2項と第3項は、規則に代入して得られます。

\[d_2=\sqrt{1+m},\qquad d_3=\sqrt{1+m\sqrt{1+m}}.\]

今回調べるのは、第3項が有理数となるパラメーターです。

有理数の条件を整数の条件へ変換する

まず\(m=0\)なら、すべての項が1になるため条件を満たします。

\(m>0\)の場合、第3項が有理数なら、次の関係から第2項も有理数です。

\[d_2=\frac{d_3^2-1}{m}.\]

整数の平方根が有理数であれば、その平方根は整数です。実際、既約分数の平方が整数なら分母は1でなければなりません。

ここで、新しい記号\(i\)を第2項の値に等しい正の整数、\(p\)を第3項の値に等しい正の整数と定義します。条件は次の式に整理できます。

\[i=d_2,\qquad m=i^2-1,\qquad p^2=i^3-i+1.\]

つまり、正の整数について「3乗から自分自身を引いて1を足した数が、整数の平方になるか」を調べればよいことになります。この条件を満たす整数から作ったパラメーターは、元の数列でも第3項を整数にするため、十分条件にもなっています。先に分けた\(m=0\)も、\(i=1\)として含められます。

浮動小数点を使わずに探索する

大きな整数の平方数判定では、浮動小数点の丸め誤差を避けたいところです。Pythonのmath.isqrtは、0以上の整数の平方根を切り捨てた整数を返します。その結果を2乗して元の整数と一致するか確認すれば、整数演算だけで判定できます。

コード内の変数は次の意味です。limitは探索する正の整数の上限、iは上で定義した第2項、candidateは平方数か調べる整数、rootはその平方根を切り捨てた整数、mは元の数列のパラメーターです。

from math import isqrt

limit = 100_000
for i in range(1, limit + 1):
    candidate = i**3 - i + 1
    root = isqrt(candidate)
    if root * root == candidate:
        m = i * i - 1
        print(f"i={i}, m={m}, d3={root}")

rangeの終端は含まれないため、limit + 1を指定して上限を含めています。この例の探索結果は次のとおりです。

i=1, m=0, d3=1
i=3, m=8, d3=5
i=5, m=24, d3=11
i=56, m=3135, d3=419

例えば最後の例では、\(d_2=56\)かつ\(1+3135\times56=175561=419^2\)なので、第3項は確かに419です。

黄金数との関係

ここでは\(m=1\)とし、\(x\)を反復の固定点、\(\varphi\)を方程式\(x^2-x-1=0\)の正の解である黄金数と定義します。固定点とは、同じ規則を適用しても値が変わらない点です。

\[x=\sqrt{1+x} \quad\Longrightarrow\quad x^2-x-1=0, \qquad \varphi=\frac{1+\sqrt{5}}{2}\approx1.618034.\]

初期値1からの反復は増加し、黄金数を超えません。したがって極限を持ち、連続性からその極限は上の正の固定点になります。黄金数と多重根号の関係は、岩本誠一・江口将生・吉良知文「黄金・白銀・青銅:数と比と形と率と」(2008年)でも扱われています。

一方、「第3項が有理数になる条件」は固定点への収束とは別の問題です。今回のコードが確認するのは\(1\le i\le100000\)の範囲だけであり、範囲外に解がないことまでは証明しません。探索で仮説を作り、その後に証明を検討するという役割分担が大切です。

関連記事

カテゴリー
アーカイブ

導入・開発のご相談

検査の自動化、品質予測、工程条件の最適化。
課題の整理からご相談ください。

お問い合わせ