根号を繰り返す数列は、黄金数を考える入口になります。この記事では、ある項が有理数になる条件を整数の問題へ変換し、Pythonで指定した範囲を探索します。計算で見つかった例と、すべての解を示す数学的な証明は分けて扱います。
2026年10月8日改訂。数式の記号を定義し、浮動小数点の平方根を使った探索を整数演算へ変更しました。
数列と調べたい条件を定義する
以下の記号を使います。
| 記号 | 定義 |
|---|---|
| \(m\) | 0以上の整数で、数列を決めるパラメーター |
| \(n\) | 1以上の整数で、項の番号 |
| \(d_n\) | 数列の第\(n\)項 |
| \(\sqrt{\;\;}\) | 0以上の平方根 |
最初の項と、その次の項を作る規則を次で定めます。
第2項と第3項は、規則に代入して得られます。
今回調べるのは、第3項が有理数となるパラメーターです。
有理数の条件を整数の条件へ変換する
まず\(m=0\)なら、すべての項が1になるため条件を満たします。
\(m>0\)の場合、第3項が有理数なら、次の関係から第2項も有理数です。
整数の平方根が有理数であれば、その平方根は整数です。実際、既約分数の平方が整数なら分母は1でなければなりません。
ここで、新しい記号\(i\)を第2項の値に等しい正の整数、\(p\)を第3項の値に等しい正の整数と定義します。条件は次の式に整理できます。
つまり、正の整数について「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\)の正の解である黄金数と定義します。固定点とは、同じ規則を適用しても値が変わらない点です。
初期値1からの反復は増加し、黄金数を超えません。したがって極限を持ち、連続性からその極限は上の正の固定点になります。黄金数と多重根号の関係は、岩本誠一・江口将生・吉良知文「黄金・白銀・青銅:数と比と形と率と」(2008年)でも扱われています。
一方、「第3項が有理数になる条件」は固定点への収束とは別の問題です。今回のコードが確認するのは\(1\le i\le100000\)の範囲だけであり、範囲外に解がないことまでは証明しません。探索で仮説を作り、その後に証明を検討するという役割分担が大切です。
