競技プログラミング記事を書きたい人のための数式の書き方入門

2024/05/15に公開
5

はじめに

この記事を読んでいる方の多くは、これから競技プログラミングに関する記事を書こうと思っていることでしょう。とても素晴らしいことだと思います。しかし、(分野によってある程度の差はあるだろうとはいえ)数式を書くには一般的な作法というものがあります。せっかく力を入れて内容を考えた記事も、これらの作法を守らないと「読みにくい記事だな」と思われて途中で読むのをやめられてしまうかもしれません。(あるいは自分で読み直して同じことを思うかもしれません。)これは、頑張って記事を書いた人にとっても、些細なことで読む気力を削がれてしまった読者にとっても不幸なことです。

この記事はそういった不幸なことが起こらないように、数式に関する基本的な書き方や作法を紹介するものです。特に、競技プログラミングで頻出の書き方に焦点を当てているので、リファレンスのような感じで役立てていただけたらと思います。

TeXについて

TeXは、世界で最も有名なDonald E. Knuthが開発した組版処理システムです(詳しくはWikipedia参照)。科学技術の論文を書くために最も一般的なツールではないでしょうか。一般的なブログサービスのはてなブログや、Qiita、Zennでも数式を書くためにTeXの記法を(一部)使うことができます。

この記事ではTeXによる数式の書き方を紹介します。各ブログサービスにおけるTeXによる数式の入力方法は、ブログサービスのヘルプページを確認してください。

変数、関数

xy などの変数や f(x) などの関数は、単に xyf(x) と入力するだけで上手に表示されます。e\pi などの定数は立体にすることを求める分野もあるようですが、そこまではしなくてもいいでしょう。ちなみに、\pi\piと入力します。

略語由来の関数

略語由来の関数 \sin \theta\log{n}\exp(x) などは立体(ローマン体)で書きます。log n のようには書きません。後者の書き方だと、lognを掛けたものだと見間違いやすく、スペースがうまくとられていないので読みにくいです。実際、出版されている書物でこのように書かれているものはかなり少ないと思います。

入力は \sin \theta\log n\exp(x)のようにします。\min\maxのように一般的な関数は、その関数の名前の前にバックスラッシュ(\)を加えることで、きれいに入力ができるはずです。

もし \mathrm{id}(x)=x のようにあまり一般的でないものを使う時は、少し面倒ですが\mathrm{id}(x)と書きましょう。本当は\mathop{\mathrm{id}}(x)とすべきようですが、マクロの使えない環境下ではそこまでやらなくてもいいでしょう。

すこし面倒ですが、\mathrm{dp}[i][j]\mathrm{dp}[i][j]と書いてある方が僕は好きです。

2つのmod

\bmod には \bmod\pmod があります。\bmodは2つの数に対する演算として使います。例えば、

5 \bmod 3 = 2

5 \bmod 3 = 2 のように入力します。

\pmod\pmod m のように括弧付きのmodを入力するときに使います。たとえば、

5 \equiv 2 \pmod{3}

5 \equiv 2 \pmod{3}のように入力します。無理やり\bmodを使って、5 \equiv 2 (\bmod 3)のように入力すると、次のようになります。

5 \equiv 2 (\bmod 3)

上の例に比べて読みにくいと思います。

下付き文字と上付き文字

x_i^n のような式を入力するためには、x_i^nのように入力します。なお、基本的に_^の後の1文字だけしか下付き・上付きになりません。x_{i+1}^{n-1}のような式を入力するには、x_{i+1}^{n-1}のようにします。TeXにおいて{}は文字列をグループ化する役割で使われており、表示されません。\{\}を入力するには\{\}のようにバックスラッシュをつけます。

てんてん

x_1 + x_2 + \dots + x_n

と書きたいときはx_1 + x_2 + \dots + x_nと書きます。

\{x_1, x_2, \dots, x_n\}

と書きたいときは\{x_1, x_2, \dots, x_n\}と書きます。とりあえず、\dotsと打っておけば、うまい具合にやってくれるようです。

ここで1つ注意事項があります。 \dots の両側には、同じ記号があるようにしましょう。例えば、x_1 \times x_2 \times \dotsb x_nx_1, x_2, \dots x_n ではなく、 x_1 \times x_2 \times \dots \times x_nx_1, x_2, \dots , x_n と書きましょう。忘れがちなことなので気をつけてください。実際、この節を書いているときに自分も\dots の後の演算子を書き忘れていました。

集合

a \in Aa \in AA \subset BA \subset Bと書きます。

\overline{A \cup B} = \overline{A} \cap \overline{B}

\overline{A \cup B} = \overline{A} \cap \overline{B}と書きます。補集合はA^cと書く派の人はA^cと入力しましょう。

A \setminus BA \setminus Bと書きます。空集合を格好良く \emptyset と書きたい人は\emptysetを使いましょう。

集合の内包表記を使って

\{ x^2 \mid x \in \N \}

のように書きたい場合は \mid を使って、\{ x^2 \mid x \in \N \}としましょう。|を使うと、これは絶対値の括弧と認識されて、下の例のようにスペースが少しおかしくなります。

\{ x^2 | x \in \N \}

大小

a \le bc \ge dはそれぞれa \le bc \ge dと入力します。等号を含まない場合は<>でOKです。

ちなみに \langle a, b \rangle のような括弧を使いたいときは、\langle a, b \rangleを使いましょう。

総和、総積

\sum_{k=1}^{n} k

\sum_{k=1}^{n} kと書きます。総積

\prod_{k=1}^n k =n!

\prod_{k=1}^n k =n!のように書きます。

括弧

床関数 \lfloor x \rfloor と天井関数 \lceil x \rceil は、それぞれ、 \lfloor x \rfloor\lceil x \rceil と入力します。

また、対応する括弧に \left \rightをつけると、括弧の大きさを自動で調節してくれます。例えば、分数を入れてみます(\left(\frac{a}{b}\right))。

\left(\frac{a}{b}\right)

これは、入れ子にしてもうまく動きますし、括弧に分類されるものであればなんでも使えます(\left\lfloor \left| \sum_{k=1}^n (-1)^k \frac{1}{k} \right|^3 \right\rfloor)。

\left\lfloor \left| \sum_{k=1}^n (-1)^k \frac{1}{k} \right|^3 \right\rfloor

この式に特に意味はありません。

演算子

掛け算の記号 \times\times と入力します。ビットごとの排他的論理和でよく使われる \oplus\oplus と入力します。

論理

論理演算における and \land と or \lor 、not \lnotは、\land\lor\lnotです。

最後に

競技プログラミングの解説を書くときに使いたくなりそうな数式の書き方をまとめてみました。ここに載っていないものでも、「TeX 入力方法」と検索すると出てくると思います。また、詳しそうな人に聞いてみるのも手です。「こんな数式の書き方も載せておいてほしい」というリクエストにも可能な範囲で応えたいと思っています。

大学の図書館が使える人は、LaTeX美文書作成入門を、必要なときにぱらぱらめくってみるのもいいでしょう。

数式の作法を守って、楽しい競プロライフを!

参考文献

更新履歴

  • noshi91さんの意見をもとに、括弧の節を追加。(2024-05-15)
  • elnikkisさんの指摘で、\dotsの使い方を修正。(2024-05-15)
  • 演算子と論理の節を追加。(2024-05-15)
  • rsk0315_h4xさんの意見をもとに、\dots の前後の注意事項を追加。(2024-05-16)
  • kkddさんの指摘をもとに、変数・関数、略語由来の関数の節のタイトルと記述を修正。(2024-05-16)
  • 下付き文字と上付き文字の節を追加。(2024-05-16)

Discussion

kkddkkdd

こんにちは。
イタリック体の使い方は「数学的な変数(と変関数)のシンボルをイタリック体とする」のようです(https://texwiki.texjp.org/?表記の哲学 より)。
なお「1文字からなる関数名」との説明は適切ではなさそうで、広めない方が良さそうです。この説明はどこかで見かけるでしょうか?(私も昔見かけた気がしますが)

blue_jamblue_jam

ありがとうございます。変関数って呼ぶんですね。知らなかったです。

kkddkkdd

こんにちは。
この「変関数」は、定義された関数ではないものをさしていますが、その呼び名は一般的ではないと思われますので広めない方が良さそうです。

kkddkkdd

こんにちは。
upright 体と italic 体との使い分け規則につきましては、constant と variable とを区別する考え方を、関数にも適用すると思えば良いかと多います(したがって constant の該当例は、\uppi\sin ですが、慣習上、必ずしもそうしないこともあるようです)。

「略語由来」という説明も確かに見かけますが、遡っても ISO 由来ではなさそうです。急いで御記事を書くよりも、ゆっくり調べをつけてからが良いかと思いました。