マクロツイーター

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

TeX で 10000 桁

「奥底」が 10000 に到達したことだし、また最近 TeX 日和なそうだから、必然的に 10000 的な TeX ネタが求められるわけである。熟慮を重ねた結果、無難に「TeX で 10000 桁」をやることにした。ただし、円周率とかはもう使い尽くされている感が否めないので、敢えて別の実数を取り上げることにしたい。

というわけで、ここでは unity の十進小数展開を小数点 10000 位まで計算した上で結果を整形して組版することにする。unity というのは実数体の乗法単位元のことであり、e や π と並んで数学上の最も重要な定数の 1 つと見做されている。この数を表すギリシャ文字ラテン文字(円周率「π」のように)は特に定められていない*1ので、ここでは unity を U で表す。

unity を表現する等式は数多く存在するが、そのうちの幾つかを挙げておく。

実は、unity の十進小数展開の各桁の数字に関して、以下のような性質が成立する。(整数部は 0 である。*2)今回実装したコードでは、この方法(を少々最適化したもの)を用いて、各桁の数字を個別に求めている。

以下に文書のソースを示す。plain TeX 文書なので、tex で DVI、pdftex で PDF に変換できる。

\catcode64=11 %-------------------------
\newcount\outlen
\newcount\p@pos \p@pos=0
\newcount\p@cpos \p@cpos=0
\newcount\p@gpos \p@gpos=0
\chardef\x@ten=10
\def\p@put#1{\p@put@a#1\p@put@end}
\def\p@put@a#1{%
  \ifx#1\p@put@end \expandafter\p@put@end
  \else \ifnum\p@gpos<\outlen #1\p@putsep \fi
  \fi \p@put@a}
\def\p@put@end\p@put@a{}
\def\p@putsep{%
  \advance\p@pos\@ne \advance\p@gpos\@ne
  \ifnum\p@gpos<\outlen \ifnum\p@pos=\x@ten
    \advance\p@cpos\@ne \p@pos\z@
    \ifnum\p@cpos<\x@ten \space
    \else \par\p@cpos\z@ \fi
  \fi\fi}
\newcount\c@n
{\lccode33=57 \lowercase{\xdef\c@en{!}}}
\def\compmain{%
  \c@n\z@ \loop \ifnum\c@n<\outlen
    \p@put\c@en \advance\c@n\@ne
  \repeat}
\catcode64=12 %-------------------------
\outlen=10000
\hsize=396pt \hoffset=28pt
\vsize=720pt \voffset=-14pt \topskip=7.2pt
\font\msym=cmr10 at 7.2pt \textfont0=\msym
\font\malp=cmmi10 at 7.2pt \textfont1=\malp
\font\tnorm=t1xtt at 7.2pt \tnorm
\parindent=0pt
\baselineskip=7.2pt
\spaceskip=0.25em plus 0.25em
\nopagenumbers
\noindent\hbox to0pt{\hss $U =\;$0.\ }%
\compmain
\noindent\hbox to0pt{\ $\cdots$\hss}%
\bye

オチを手っ取り早く知りたいという人のために結果の PDF を用意しておく。

*  *  *

なお、「(特に TeX 的に)ネタが面白くない」という点については当方も深く痛感する所なのでどうかご容赦願いたい。そして「円周率 10000 桁くらい TeX で計算できて当然だろ!」という指摘が来ないことを切に願っている。

*1:現状で最も一般的に用いられている記号は U+0031 DIGIT ONE であろう。

*2:なお、U は 2 通りの小数展開をもつことが知られていて(参考)、各々の整数部が 0 と 1 である。ここでは前者の方を対象とする。