Featured image of post ペル方程式:無限の解を持つディオファントス方程式の魅力と連分数

ペル方程式:無限の解を持つディオファントス方程式の魅力と連分数

ペル方程式(Pell's equation)の基本から、連分数を用いた解法、そして無限に存在する解の生成方法までを詳細に解説します。

はじめに

整数論の分野において、 ペル方程式 (Pell’s equation)は最も美しく、かつ深い理論的背景を持つディオファントス方程式の一つとして知られています。本記事では、この方程式の基本的な定義と性質から始まり、連分数(Continued fractions)を用いたエレガントで効率的な解法、さらには無限に存在する解の生成メカニズムまでを非常に詳細に解説します。数学を愛するすべての方に向けて、数式の導出からアルゴリズムの可視化、そしてプログラミング言語を用いた実装までを網羅しました。

1. ペル方程式とは何か?

ペル方程式とは、次のような形をした2変数の二次ディオファントス方程式のことを指します。

$$ x^2 - ny^2 = 1 $$

ここで、$n$ は平方数ではない(square-free または少なくとも完全平方数ではない)正の整数とします。私たちの目標は、この方程式を満たす未知の整数 $x$ と $y$ の組を見つけることです。もし仮に $n$ が完全平方数、すなわち $n = k^2$ ($k$ は整数)であるとしましょう。すると、方程式は次のように変形できます。

$$ x^2 - k^2y^2 = 1 $$$$ (x - ky)(x + ky) = 1 $$

$x$ と $y$ 、そして $k$ はすべて整数であるため、 $(x - ky)$ と $(x + ky)$ も整数になります。積が 1 になる整数の組み合わせは $(1, 1)$ または $(-1, -1)$ しか存在しません。これを解くと、 $y = 0$ となり、解は $(x, y) = (\pm 1, 0)$ という非常に単純なものに限られてしまいます。そのため、ペル方程式において $n$ が完全平方数でないという条件は、意味のある解を見つけるために不可欠な前提となります。

2. 歴史的背景:ペルとフェルマー、そして古代インドの数学者たち

この方程式には「ペル」という名前が冠されていますが、歴史的な事実を紐解くと少し奇妙な経緯があります。実は、この方程式の一般的な解法を近代ヨーロッパで最初に研究し、解が常に存在することを強く主張したのはフランスの偉大な数学者 ピエール・ド・フェルマーPierre de Fermat)です。

のちに レオンハルト・オイラーLeonhard Euler)が、イギリスの数学者 ジョン・ペル (John Pell)の名前をこの方程式に誤って結びつけてしまったため、今日でも「ペル方程式」として広く定着してしまいました。ペル自身は、この方程式の解法において中心的な役割を果たしたわけではありません。

さらに時代を遡ると、インドの数学者 ブラーマグプタ (Brahmagupta)や バースカラ2世 (Bhāskara II)は、フェルマーよりも数百年も前に、チャクラヴァーラ法(Chakravala method)と呼ばれる洗練されたアルゴリズムを用いて、この種の方程式の解を計算していました。古代から中世、そして近代へと続く数学者たちの探求の歴史が、この方程式には刻まれています。

3. 自明な解と非自明な解の違い

ペル方程式 $x^2 - ny^2 = 1$ には、$n$ の値にかかわらず、常に $(x, y) = (\pm 1, 0)$ という解が存在します。方程式に代入すれば $1^2 - n \cdot 0^2 = 1$ となり、明らかに成立します。これを 自明な解 (trivial solution)と呼びます。

しかし、数学者が真に興味を持つのは $y \neq 0$ となる 非自明な解 (non-trivial solution)です。驚くべきことに、$n$ が完全平方数でない正の整数であれば、ペル方程式には 無限に多くの非自明な解 が存在することが数学的に証明されています。しかも、その無限にある解の中で $x, y$ が共に正の整数である最小の解を 基本解 (fundamental solution)と呼び、これを見つけることさえできれば、他のすべての解を代数的な操作で容易に生成することが可能になります。

4. 連分数展開とペル方程式の深い関係

基本解を効率的に見つけるための最も強力で標準的なツールが 連分数 (Continued fraction)です。無理数 $\sqrt{n}$ は、無理数であるため有限の分数では表せませんが、無限に続く周期的な正則連分数として美しく表現することができます。

$$ \sqrt{n} = [a_0; \overline{a_1, a_2, \dots, a_k, 2a_0}] $$

ここで $a_0$ は $\sqrt{n}$ の整数部分(つまり $\lfloor \sqrt{n} \rfloor$ )であり、上部にバーが引かれた部分は連分数の周期部分を表します。この周期の長さを $m$ と定義します。

連分数の展開を無限に続けるのではなく、途中のある項で打ち切って得られる有理数 $\frac{p_i}{q_i}$ を 近似分数 (convergent)と呼びます。近似分数は、無理数 $\sqrt{n}$ に対する最良の有理数近似を与えます。ペル方程式の基本解 $(x_1, y_1)$ は、驚くべきことにこの $\sqrt{n}$ の連分数展開における特定の近似分数の分子 $p$ と分母 $q$ から直接得られます。具体的には、周期 $m$ の長さに応じて次のように決定されます。

  • 周期 $m$ が偶数の場合:基本解は $(p_{m-1}, q_{m-1})$ となります。
  • 周期 $m$ が奇数の場合:基本解は $(p_{2m-1}, q_{2m-1})$ となります。

5. 基本解の求め方:アルゴリズムの徹底解説

近似分数 $\frac{p_i}{q_i}$ は、以下に示す漸化式を用いて計算機上で非常に高速に計算することができます。

$$ p_i = a_i p_{i-1} + p_{i-2} $$$$ q_i = a_i q_{i-1} + q_{i-2} $$

初期条件は、アルゴリズムをスムーズに開始させるために以下のように設定します。

  • $p_{-1} = 1, \quad p_{-2} = 0$
  • $q_{-1} = 0, \quad q_{-2} = 1$

連分数の各項 $a_i$ も、整数の四則演算のみを用いて逐次的に求めることができます。これにより、浮動小数点演算の誤差を完全に排除した正確な整数演算が可能になります。

解を探索する一連のプロセスを可視化するために、以下の状態遷移図を用意しました。

  flowchart TD
    Start["開始: 整数 n を入力"] --> CheckSquare["n が完全平方数か判定"]
    CheckSquare --|"Yes"| Trivial["自明な解のみ存在 (終了)"] --> End["終了"]
    CheckSquare --|"No"| InitContFrac["連分数の漸化式を初期化"]
    InitContFrac --> CalcNext["次の連分数項 a_i と近似分数 (p_i, q_i) を計算"]
    CalcNext --> CheckEq["条件: p_i^2 - n * q_i^2 == 1 を評価"]
    CheckEq --|"False"| CalcNext
    CheckEq --|"True"| Found["基本解 (x_1, y_1) = (p_i, q_i) を発見"] --> End

6. 具体例:n = 7 の場合の連分数展開と基本解の導出

抽象的な理論だけでなく、具体的に $n = 7$ の場合について計算を追ってみましょう。ペル方程式は $x^2 - 7y^2 = 1$ となります。

まず、 $\sqrt{7}$ の整数部分は $a_0 = 2$ です。残りの小数部分の逆数を取って整数部分を取り出すという操作を繰り返すと、 $\sqrt{7}$ の連分数展開は次のように求まります。

$$ \sqrt{7} = [2; \overline{1, 1, 1, 4}] $$

周期は $m = 4$ であり、偶数です。したがって、基本解は近似分数 $\frac{p_3}{q_3}$ から得られるはずです。漸化式を使って近似分数を順に計算してみましょう。

  • $i=0$: $a_0=2$ のとき、 $\frac{p_0}{q_0} = \frac{2}{1}$
  • $i=1$: $a_1=1$ のとき、 $p_1 = 1 \times 2 + 1 = 3$ 、 $q_1 = 1 \times 1 + 0 = 1$ 。よって $\frac{p_1}{q_1} = \frac{3}{1}$
  • $i=2$: $a_2=1$ のとき、 $p_2 = 1 \times 3 + 2 = 5$ 、 $q_2 = 1 \times 1 + 1 = 2$ 。よって $\frac{p_2}{q_2} = \frac{5}{2}$
  • $i=3$: $a_3=1$ のとき、 $p_3 = 1 \times 5 + 3 = 8$ 、 $q_3 = 1 \times 2 + 1 = 3$ 。よって $\frac{p_3}{q_3} = \frac{8}{3}$

ここで得られた $(p_3, q_3) = (8, 3)$ を方程式に代入して検算してみます。 $8^2 - 7 \times 3^2 = 64 - 7 \times 9 = 64 - 63 = 1$ 。 見事に条件を満たしており、これが $n = 7$ の場合の基本解 $(x_1, y_1) = (8, 3)$ となります。

7. 無限の解の生成:行列と漸化式を用いたアプローチ

基本解 $(x_1, y_1)$ が一つでも見つかれば、他のすべての正の整数解 $(x_k, y_k)$ は以下の代数的な関係式から無限に生成することができます。

$$ x_k + y_k \sqrt{n} = (x_1 + y_1 \sqrt{n})^k \quad \text{for} \quad k = 1, 2, 3, \dots $$

この式を展開し、有理数部分と無理数部分($\sqrt{n}$ の係数)を比較することで、次回の解 $(x_{k+1}, y_{k+1})$ を前回の解 $(x_k, y_k)$ から計算する漸化式が得られます。これを行列の形式で表現すると、非常にスッキリとした形になります。

$$ \begin{pmatrix} x_{k+1} \\ y_{k+1} \end{pmatrix} = \begin{pmatrix} x_1 & n y_1 \\ y_1 & x_1 \end{pmatrix} \begin{pmatrix} x_k \\ y_k \end{pmatrix} $$

任意の $k$ 番目の解は、行列のべき乗を用いて次のように直接計算することも可能です。

$$ \begin{pmatrix} x_k \\ y_k \end{pmatrix} = \begin{pmatrix} x_1 & n y_1 \\ y_1 & x_1 \end{pmatrix}^{k-1} \begin{pmatrix} x_1 \\ y_1 \end{pmatrix} $$

この性質は、ペル方程式の解が単純な数字の羅列ではなく、代数的な構造(群の構造)を持っていることを強く示唆しています。

8. ブラーマグプタの恒等式とチャクラヴァーラ法

古代インドの数学において、ペル方程式の解法において中心的な役割を果たしたのが ブラーマグプタの恒等式 (Brahmagupta’s identity)です。この恒等式は次のような形をしています。

$$ (x_1^2 - ny_1^2)(x_2^2 - ny_2^2) = (x_1 x_2 + n y_1 y_2)^2 - n(x_1 y_2 + x_2 y_1)^2 $$

この恒等式の素晴らしい点は、 $x^2 - ny^2 = k_1$ の解 $(x_1, y_1)$ と、 $x^2 - ny^2 = k_2$ の解 $(x_2, y_2)$ を組み合わせることで、新しく $X^2 - nY^2 = k_1 k_2$ となる解 $(X, Y)$ を直接合成できることです。

インドの数学者たちは、この強力な恒等式を巧みに利用し、小さな誤差を持つ解を次々と合成していくことで、最終的に誤差が $1$ となる解、すなわちペル方程式の解へと到達する チャクラヴァーラ法 を編み出しました。これは連分数展開と同等以上の効率を持つ、人類の数学史に残る偉大な成果です。

9. Pythonによる実装例と解説

理論的な背景を十分に理解したところで、実際にプログラムを書いてみましょう。以下のPythonスクリプトは、指定された $n$ に対して連分数の漸化式を実行し、ペル方程式の基本解を探索します。計算過程で浮動小数点数を使わず、すべて整数の演算で処理するため、桁落ちの心配がありません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import math

def is_square(n):
    """
    指定された数 n が完全平方数であるかを高速に判定する関数。
    """
    s = math.isqrt(n)
    return s * s == n

def solve_pell(n):
    """
    ペル方程式 x^2 - n * y^2 = 1 の基本解を連分数法を用いて計算する。
    戻り値: 基本解 (x, y) のタプル。完全平方数の場合は None を返す。
    """
    if is_square(n):
        return None  # 完全平方数の場合は非自明な解を持たない

    # 連分数の計算のための初期化
    m = 0
    d = 1
    a0 = math.isqrt(n)
    a = a0
    
    # 近似分数の初期値設定 (p_{-1}=1, p_{-2}=0, q_{-1}=0, q_{-2}=1)
    num1, num2 = 1, 0  # p_{i-1}, p_{i-2}
    den1, den2 = 0, 1  # q_{i-1}, q_{i-2}
    
    # 最初の近似分数 (p_0, q_0)
    num = a0
    den = 1
    
    # 条件 x^2 - n*y^2 == 1 を満たすまでループを回す
    while num * num - n * den * den != 1:
        # 連分数の次の項 a_i を計算
        m = d * a - m
        d = (n - m * m) // d
        a = (a0 + m) // d
        
        # 近似分数 p_i, q_i の更新
        num2 = num1
        num1 = num
        den2 = den1
        den1 = den
        
        num = a * num1 + num2
        den = a * den1 + den2

    return num, den

# 使用例: n = 7 の場合
n = 7
solution = solve_pell(n)
if solution:
    x, y = solution
    print(f"n={n} の基本解: x={x}, y={y}")
    print(f"検算: {x}^2 - {n}*{y}^2 = {x**2 - n * y**2}")

このコードを実行すると、先ほど手計算で求めた通り、基本解 $(x, y) = (8, 3)$ が一瞬にして出力されます。 $n$ の値を例えば $61$ のように大きくしてみると、解が巨大な数字( $x = 1766319049, y = 226153980$ )になることが確認でき、ペル方程式の奥深さを実感できるでしょう。

10. 代数的整数論への架け橋:ディリクレの単数定理との関係

ペル方程式は、単なるパズルのような整数の問題にとどまりません。近代数学においては、 実二次体 (real quadratic field) $\mathbb{Q}(\sqrt{n})$ の理論への重要な入り口として位置づけられています。

ペル方程式の解は、実二次体の代数的整数環における 単数 (unit、逆元もまた代数的整数となる元)と密接に対応しています。基本解は、この単数群を生成する 基本単数 (fundamental unit)に対応しており、ペル方程式に無限の解が存在するという事実は、より高度な定理である ディリクレの単数定理 (Dirichlet’s unit theorem)の特殊なケースと見なすことができます。基本単数の性質を理解することは、二次体の類数(class number)の公式やイデアル類の構造を深く研究する上で極めて重要です。

11. まとめ

本記事では、ディオファントス方程式の中でも特に魅力的な ペル方程式 について、その基礎から応用までを詳しく探求しました。完全平方数でない $n$ に対しては常に無限の非自明な解が存在するという驚くべき事実、連分数展開を利用した効率的な解の探索アルゴリズム、そして生成された基本解から行列を用いて次々と新しい解を合成していくダイナミズムを解説しました。

数百年前にフェルマーやブラーマグプタが考察した古典的な問題が、現代のコンピュータ・アルゴリズムとして美しく実装でき、さらに高度な代数的整数論へと繋がっているという事実には、時代を超えた数学の深いロマンを感じざるを得ません。この記事をきっかけに、ぜひPythonコードを活用して様々な $n$ の値でペル方程式の世界を探索し、数の奥深い性質に触れてみてください。

comments powered by Disqus