【よしなく宣伝】
2012/12/01 〜 2012/12/25TeX & LaTeX Advent Calendar
こちらは平常運行。
* * *
前回に引き続いて「変換して TeX プログラミング」の例。運用の詳細は前回と同じなのでその辺りの解説は省略。
Lua で「連分数展開」してみた
show_cont_frac(x, y) で有理数 x/y を連分数展開した結果を出力する。
[contfrac0.lua]
-- contfrac0.lua -- [変数一覧] -- 整数値: x, y, q, r --(公開) show_cont_frac(整数x, 整数y) -- 有理数 x/y の連分数展開を出力する. function show_cont_frac(_1, _2) x = _1; y = _2 if x < 0 or y < 1 then return end q, r = int_divide(x, y) if r == 0 then io.write(""..q.."\n") else io.write("["..q..";") while r > 0 do x = y; y = r q, r = int_divide(x, y) io.write(""..q) if r > 0 then io.write(",") end end io.write("]\n") end end -- int_divide(整数x,整数y) -- xをyで整除した時の商と余りを返す. function int_divide(_1, _2) return math.floor(_1 / _2), _1 % _2 end -- テスト show_cont_frac(355, 113) show_cont_frac(99, 70) show_cont_frac(740785, 516901)
出力は以下の通り。なお、ここでは連分数を線形書式を用いて表した。(Wikipedia「連分数」を参照。)
[3;7,16] [1;2,2,2,2,2] [1;2,3,4,5,6,7,8,9]
これをもう一段書き換えるとすると、int_divide() を前回のコードと全く同様に書き換えることになるだろう。ここでは省略していきなり TeX のコードに書き直す。
TeX で「連分数展開」してみた
パッケージ名は tccontfrac、名前空間は tccf。公開命令は \showcontfrac{<x>}{<y>} のみ。
[tccontfrac.sty]
% tccontfrac.sty
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{tccontfrac}
%% 変数定義
%(整数値)
\newcount\tccf@x
\newcount\tccf@y
\newcount\tccf@q
\newcount\tccf@r
%%(公開) \showcontfrac{整数x}{整数y}
\newcommand*{\showcontfrac}[2]{%
\tccf@x=#1\relax \tccf@y=#2\relax
\ifnum \tccf@x<0 \tccf@y=0 \fi
\ifnum \tccf@y<1 \else
\tccf@int@divide{\tccf@x}{\tccf@y}%
\ifnum \tccf@r=0 \the\tccf@q
\else
\the\tccf@q +%
\@whilenum \tccf@r>0 \do{%
\tccf@x=\tccf@y \tccf@y=\tccf@r
\tccf@int@divide{\tccf@x}{\tccf@y}%
\ifnum \tccf@r>0 \frac{1}{\the\tccf@q +{}}\,%
\else \frac{1}{\the\tccf@q}%
\fi
}%
\fi
\fi
}
%% \tccf@int@divide{整数x}{整数y}
\def\tccf@int@divide#1#2{%
\tccf@q=#1\relax \divide\tccf@q#2\relax
\tccf@r=-\tccf@q \multiply\tccf@r#2\relax \advance\tccf@r#1\relax
}
\endinput連分数の出力の書式は「美文書」*1に紹介されているものを用いた。テスト用文書は以下の通り。
[test-tccontfrac.tex]
\documentclass[a4paper]{article} \usepackage{amsmath} \usepackage{tccontfrac} \begin{document} \begin{align*} \frac{355}{113} &= \showcontfrac{355}{113} \\ \frac{99}{70} &= \showcontfrac{99}{70} \\ \frac{740785}{516901} &= \showcontfrac{740785}{516901} \end{align*} \end{document}

*1:第 5 版では 106 ページ。