Maxima で綴る数学の旅

紙と鉛筆の代わりに、数式処理システムMaxima / Macsyma を使って、数学を楽しみましょう

-数学- 連分数と一次分数変換と行列

f:id:jurupapa:20210329233305j:plain

 

連分数は一次分数変換、従って2x2の正方行列ともとても強い結びつきがあります。

数理科学 2020年 08 月号 [雑誌]

数理科学 2020年 08 月号 [雑誌]

  • 発売日: 2020/07/20
  • メディア: 雑誌
 

この辺の導入的な話が、数理科学2020年8月号のラマヌジャン特集の中にありました(岡崎龍太郎:連分数、p15)。 自分自身の連分数の知識が「2次無理数を正則連分数で表すと周期を持つ」くらいでもう少し知りたいと思っていたところ、この文章の内容が分かりやすくMaximaでも簡単に試すことができたので、記事にすることにしました。

この記事では、「有限連分数は行列の積に分解できること」を説明します。実はこのことは2段回の説明が必要になります。それは「有限連分数は一次分数関数の繰り返し適用で計算できる」こと、及び「一次分数関数の繰り返し適用は対応する行列の積で計算できる」ことです。

 

早速、簡単な連分数を定義します。

(%i1) (powerdisp:true,a1+b1/(a2+b2/z));

$$ \tag{${\it \%o}_{1}$}a_{1}+\frac{b_{1}}{a_{2}+\frac{b_{2}}{z}} $$

(%i??) powerdisp:false$

2段の連分数です。多段の連分数の場合最後の\(z\)のところがさらに連分数になります。これを普通の分数になるように計算してみます。

(%i3) a1+b1/(a2+b2/z),factor;

$$ \tag{${\it \%o}_{3}$}\frac{b_{1}\,z+a_{1}\,a_{2}\,z+a_{1}\,b_{2}}{a_{2}\,z+b_{2}} $$

 

この2段の連分数が一次分数変換の2回の繰り返し適用になっていることを確認しましょう。

まず一次分数変換を定義します。関数名のLFTはLinear Fractional Transformの頭文字をとったものです。引数のMは適当な2x2の行列です。この行列を分解してzに分数の形で作用させるように定義します。
(%i4) applyLFT(M,z):=(M[1,1]*z+M[1,2])/(M[2,1]*z+M[2,2]);

$$ \tag{${\it \%o}_{4}$}{\it applyLFT}\left(M , z\right):=\frac{M_{1,1}\,z+M_{1,2}}{M_{2,1}\,z+M_{2,2}} $$

 

連分数一段分(\(a_n\)と\(b_n\)の組)が1つの行列に対応しています。具体的には、

$$\begin{pmatrix} a_{n}&b_{n}\cr 1&0\cr \end{pmatrix} $$

に対応します。

上記の例の連分数は2段ですので2つの行列\(\begin{pmatrix} a_{1}&b_{1}\cr 1&0\cr \end{pmatrix},\, \begin{pmatrix} a_{2}&b_{2}\cr 1&0\cr \end{pmatrix}\)に対応します。それをぞれを一次分数変換に直して変換を合成してみます。
(%i5) applyLFT(matrix([a1,b1],[1,0]),applyLFT(matrix([a2,b2],[1,0]),z)),factor;

$$ \tag{${\it \%o}_{5}$}\frac{b_{1}\,z+a_{1}\,a_{2}\,z+a_{1}\,b_{2}}{a_{2}\,z+b_{2}} $$

これは例の連分数を普通の分数に計算したもの(%o3)と一致します。

 

今度は対応する行列に対して先に積を取り、得られた行列を一次分数変換に直してみます。Maximaでは行列の積は2項演算子ドットを使います。
(%i6) applyLFT(matrix([a1,b1],[1,0]) . matrix([a2,b2],[1,0]), z),factor;

$$ \tag{${\it \%o}_{6}$}\frac{b_{1}\,z+a_{1}\,a_{2}\,z+a_{1}\,b_{2}}{a_{2}\,z+b_{2}} $$

こちらも例の連分数の計算結果(%o3)と一致します。

 

2段の連分数の場合には、連分数、一次分数変換の合成、行列の積、が一致することが分かりました。有限\(n\)段の連分数については数学的帰納法で同じことが簡単に証明できます。

 

無限段の連分数は、きちんとした収束(行列の無限積による)の定義がありますが、それは別の機会にご紹介することにします。

 

ここでは2つの例題で行列の積による連分数計算を確認しましょう。まずは2の平方根の連分数展開からいきましょう。2の平方根は2次無理数ですので周期があります(実際には周期は1です)。これを10周期分、Maximaの組込関数cf()で求めてみましょう。
(%i7) cf(sqrt(2)),cflength=10;

$$ \tag{${\it \%o}_{7}$}\left[ 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 \right] $$
(%i8) cfdisrep(%);

$$ \tag{${\it \%o}_{8}$}1+\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{2}}}}}}}}}} $$

 

これを行列に直すわけですが、最初のところだけ1を足す形で始まり、あとは2を足す形と分子のところが1(正則連分数に展開されているので)です。というわけで最初の部分だけは以下の\(a\), それ以降は以下の\(b\)の繰り返しであることが分かります。
(%i9) a:matrix([1,1],[1,0]);

$$ \tag{${\it \%o}_{9}$}\begin{pmatrix}1 & 1 \\ 1 & 0 \\ \end{pmatrix} $$
(%i10) b:matrix([2,1],[1,0]);

$$ \tag{${\it \%o}_{10}$}\begin{pmatrix}2 & 1 \\ 1 & 0 \\ \end{pmatrix} $$

では連分数4段分くらいで試してみましょう。この連分数を打ち切ると最後は2ですから、z=2としています。
(%i11) applyLFT(a . b . b . b, 2),numer;

$$ \tag{${\it \%o}_{11}$}1.413793103448276 $$

小数点第3位まで一致しています。えいやで21段分やってみましょう。
(%i12) applyLFT(a . b^^20, 2),numer;

$$ \tag{${\it \%o}_{12}$}1.414213562373095 $$

全ての桁が一致しています!

 

今度は円周率に関する次の連分数を行列を使って計算してみましょう。
(%i??) powerdisp:true$

(%i14) %pi=0+4/(1+1/(3+4/(5+9/(7+16/(9+25/(11+36/(13+49/(15+64/z))))))));

$$ \tag{${\it \%o}_{14}$}\pi=\frac{4}{1+\frac{1}{3+\frac{4}{5+\frac{9}{7+\frac{16}{9+\frac{25}{11+\frac{36}{13+\frac{49}{15+\frac{64}{z}}}}}}}}} $$
(%i??) powerdisp:false$

この連分数は最初の部分が0と4になっていること、それ以降は足す数が奇数、分子が平方数になっています。そこで奇数と平方数の部分については次の行列で処理できます。

(%i16) picf(n):=matrix([2*n-1,n^2],[1,0]);

$$ \tag{${\it \%o}_{16}$}{\it picf}\left(n\right):=\begin{pmatrix}2\,n-1 & n^2 \\ 1 & 0 \\ \end{pmatrix} $$

また最初の部分は次の行列で表すことができます。
(%i17) picf_0:matrix([0,4],[1,0]);

$$ \tag{${\it \%o}_{17}$}\begin{pmatrix}0 & 4 \\ 1 & 0 \\ \end{pmatrix} $$

早速、この連分数の11段までを行列で計算してみます。
(%i18) pimat:picf_0 . picf(1) . picf(2) . picf (3) . picf(4) . picf(5) . picf(6) . picf(7) . picf(8) . picf(9) . picf(10);

$$ \tag{${\it \%o}_{18}$}\begin{pmatrix}12434780160 & 54193766400 \\ 3958113600 & 17250408000 \\ \end{pmatrix} $$

この行列を使って一次分数変換を計算します。
(%i19) applyLFT(pimat,1),numer;

$$ \tag{${\it \%o}_{19}$}3.141593167908507 $$

小数第5位まで一致しました。