マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

それでも TeX で連分数展開したい人のための何か

【よしなく宣伝】
2012/12/01 〜 2012/12/25

TeX & 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 ページ。