torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

有理数 mod はこわくない

導入

 最近(どれぐらい?)の AtCoder の問題で,「有理数を $\bmod$ で扱え」といった問題がしばしば出題されます*1.わたしは数学が苦手なのでこの手の問題は最初から諦めていたのですが,そろそろそういうことも言っていられなくなってきた気がするので,真面目に考えることにしました.
 わたしと同じぐらい「何も分からない」人向けに,非常に基本的なところから書こうと想います.目標は「非本質に囚われずに,とりあえずノリで問題を解ける」ぐらいを目指します.

定義

 「有理数 $\bmod$」の定義を AtCoder の適当な問題*2から引用します.

 求める期待値は必ず有理数となることが証明できます。またこの問題の制約下では、その値を互いに素な 2 つの整数 $P, Q$ を用いて $\frac P Q$ と表したとき、$R \times Q \equiv P \pmod {998244353}$ かつ $0 \leq R < {998244353}$ を満たす整数 $R$ がただ一つ存在することが証明できます。この $R$ を求めてください。

 面倒なので,本記事では以降 $M = 998244353$ とします.

何が問題か?

 定義中に現れる定理については全て受け入れることにして,問題を解く上で何が問題かというと,有理数 $\bmod$ で表された 2 つの数についての演算が何も分からないことです.普通に問題を解こうと思ったら四則演算ぐらいはしたいですからね.

$\frac P Q$ の表現

 与えられた式は,表現したい有理数を表す $P, Q$ とその表現 $R$ がある種「混ざって」いて分かりにくいので,$Q^{-1}$ をかけて次のように変形してみましょう.
\begin{eqnarray}
R \times Q &\equiv& P & \pmod M \\
R &\equiv& P Q^{-1} & \pmod M
\end{eqnarray}
こうすると幾分見通しがよくて,$R$ というのは分子と,分母の逆元の積だということが一目で分かります.

二項演算

 $R$ で表される有理数 $\frac P Q$ と $R'$ で表される有理数 $\frac {P'} {Q'}$ の二項演算について考えましょう.
 まず加算について考えてみると,$$\frac P Q + \frac {P'} {Q'} = \frac{PQ' + P'Q } {QQ'}$$なので,加算結果を表現する整数を $x$ とすると
\begin{eqnarray}
QQ' x &\equiv& PQ' + P'Q & \pmod M \\
x &\equiv& ( PQ' + P'Q ) \times ( QQ' )^{-1} & \pmod M \\
&\equiv& PQ'(QQ')^{-1} + P'Q(QQ')^{-1} & \pmod M \\
&\equiv& PQ'Q^{-1}Q'^{-1} + P'QQ^{-1}Q'^{-1} & \pmod M \\
&\equiv& PQ^{-1} + P'Q'^{-1} & \pmod M \\
&\equiv& R + R' & \pmod M
\end{eqnarray}
となって,表現している数同士の和でよいことが分かります.途中 $(ab)^{-1} = a^{-1}b^{-1}$ という形の変形をしていますが,これは逆元を Fermat の小定理で計算することにすれば指数法則から即座に言えます.
 次に乗算について考えてみましょう.同様に立式すると $$\frac P Q \frac {P'} {Q'} = \frac {PP' } { QQ' }$$ なので,同じように答えを $x$ とすれば,
\begin{eqnarray}
QQ'x &\equiv& PP' & \pmod M \\
x &\equiv& PP' \times (QQ')^{-1} & \pmod M \\
&\equiv& PP'Q^{-1}Q'^{-1} & \pmod M \\
&\equiv& PQ^{-1} \times P'Q'^{-1} & \pmod M \\
&\equiv& RR' & \pmod M
\end{eqnarray}
となって,表現している数同士の積でよいことが分かります.
 和と積がそれぞれ剰余類環上の対応する演算でよいことが分かったので,差と商も剰余類環上の対応する演算でよいことになります.

まとめ

 ということで,有理数 $\bmod$ での数の作り方と四則演算について勉強がてら書いてみました.わたしと同じ躓き方をしている方の助けにでもなれば幸いです.