【よしなく宣伝】
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 ページ。