連分数の計算 を元にペル方程式を計算する。ペル方程式の連分数を用いた魔法の解法 – tsujimotterのノートブックを参考にした。
ペル方程式は以下のように表わされる。特にDが素数の時に興味がある。
\[ x^{2} – Dy^{2} = 1 \]
まず、D=61で計算してみる。計算手順は以下のようになる。
- \(\sqrt{61}\) の連分数展開を求める
- 連分数の周期を確認し、奇数なら2周期とする
- 近似分数 \(\frac{P}{Q}\) を求める
- \(P^{2} – 61Q^{2} = 1\) となる
cfrac = get_continued_fraction(61) if 1 == (len(cfrac[1:]) % 2): cfrac += cfrac[1:] get_approx_fraction(cfrac[:-1])
つぎに115以下の素数を ペル方程式 – Wikipedia にある一覧表で確認する。
import sympy lst_pq = [['D(prime)', 'P', 'Q'], None] for i, p in enumerate(sympy.primerange(115)): cfrac = get_continued_fraction(p) if 1 == (len(cfrac[1:]) % 2): cfrac += cfrac[1:] pq = get_approx_fraction(cfrac[:-1]) lst_pq.append([p, pq.numerator, pq.denominator]) lst_pq
D(prime) | P | Q |
---|---|---|
2 | 3 | 2 |
3 | 2 | 1 |
5 | 9 | 4 |
7 | 8 | 3 |
11 | 10 | 3 |
13 | 649 | 180 |
17 | 33 | 8 |
19 | 170 | 39 |
23 | 24 | 5 |
29 | 9801 | 1820 |
31 | 1520 | 273 |
37 | 73 | 12 |
41 | 2049 | 320 |
43 | 3482 | 531 |
47 | 48 | 7 |
53 | 66249 | 9100 |
59 | 530 | 69 |
61 | 1766319049 | 226153980 |
67 | 48842 | 5967 |
71 | 3480 | 413 |
73 | 2281249 | 267000 |
79 | 80 | 9 |
83 | 82 | 9 |
89 | 500001 | 53000 |
97 | 62809633 | 6377352 |
101 | 201 | 20 |
103 | 227528 | 22419 |
107 | 962 | 93 |
109 | 158070671986249 | 15140424455100 |
113 | 1204353 | 113296 |