「0で割ってはいけません」とよく言われますが,通常の実数や複素数以外の体系で0で割ること(零除算)ができるようなものはいくつかあります.今回はそのような体系の例である実射影直線,輪(wheel),リーマン球面,前草原についてご紹介します.
1 そもそも何故0で割ってはいけないのか?
そもそも「0で割ってはいけません」と言われるのは何故でしょうか? このようなことが言われる前提となる文脈では実数や複素数を考えている場合が多いので,まずは実数や複素数の割り算について考えてみましょう.
割り算は普通,掛け算の逆演算として定義されます.つまり,\(a\div b\)とは \[b\times x=a\] を満たす\(x\)のことです.ところで,任意の複素数\(x\)に対して, \[0\times x=0\] が成り立ちます.よって,\(a\)が0でない任意の複素数のとき, \[0\times x=a\] となる複素数\(x\)は存在しないので,\(a\div 0\)は存在しません.一方,\(0\div 0\)は一つに定めることができないという意味で定義できません.強いて言うなら,\(0\div 0\)は「不定」や「どんな値にもなり得るようなもの」になります.いずれの場合も零除算は定義できないということになります.
実数や複素数を拡張した一般の体でも同様の理由で0による割り算は定義できません.
一方で,掛け算の逆演算を直接定義できなくても,その自然な拡張ができるならそれを割り算の定義として採用してはどうかという考え方もできます.その一例として定義できている場合の極限を考えてみましょう.例えば,\(1\div 0\)を,普通に定義される\(1\div b\) (\(b\neq 0\))で\(b\to 0\)としたときの極限と考えてみましょう.右極限と左極限を計算すると, \[\lim_{b\to -0}\frac{1}{b}=-\infty,\quad \lim_{b\to +0} \frac{1}{b}=\infty\] となり,一致しません.そもそも\(\infty\)は(より広い体系で「数」として扱うこともできますが)実数や複素数の文脈では数とは見做されないので失敗です.よって,「掛け算の逆演算の自然な拡張として極限を考える」という作戦でも零除算はダメになります.
更に,算数のように,0以上の整数\(b\)による割り算\(a\div b\)を,「合計が\(a\)になる何らかの量を\(b\)人で均等に分けたとき,1人分はいくらになるか」の答えとして解釈しても,「0人で分ける」ということができない,あるいは意味不明になるため,定めることができません.
2 非負拡張実数
それでは,\(\infty\)を数として扱う拡張実数の体系なら零除算を定義できるでしょうか? 拡張実数(拡大実数,アフィン拡大実数)の体系とは,実数と正負の無限大からなる集合\(\mathbb{R}\cup\{\infty,-\infty\}\)に通常の実数の四則演算と次のような拡張された演算を入れたものです. \[\begin{align}
{2}
a + \infty = (+\infty) + a &= +\infty &\quad (a \neq -\infty) \\
a – \infty = (-\infty) + a &= -\infty &\quad (a \neq +\infty) \\
a \cdot (\pm\infty) = (\pm\infty) \cdot a &= \pm\infty &\quad (a >0) \\
a \cdot (\pm\infty) = (\pm\infty) \cdot a &= \mp\infty &\quad (a <0) \\
\frac{a}{\pm\infty} &= 0 &\quad (a \in \mathbb{R}) \\
\frac{\pm\infty}{a} &= \pm\infty &\quad (a \in \mathbb{R}_{+}) \\
\frac{\pm\infty}{a} &= \mp\infty &\quad (a \in \mathbb{R}_{-})
\end{align}\] 残念ながら拡張実数の体系は体にも環にもなりませんが,\(\infty-\infty\), \(0\times \pm\infty\)などのような定義されない結果を含む計算以外については加法と乗法に関する交換法則と結合法則が成り立ちます.つまり,通常の交換法則と結合法則において「等しい」というのを「等しいかまたは両方とも定義されない」に置き換えた法則が成り立ちます.分配法則については「\(a\times (b+c)\)と\(a\times b+a\times c\)が両方とも定義されるならば両者は等しい」という形で定義可能性条件付きで成り立ちます.交換法則と結合法則については片方の順番で計算したものが定義されれば自動的に他方の順番で計算したものも定義されますが,分配法則についてだけは片方だけ定義されるというケースが存在するので「両方とも定義される」という仮定が必要です.
拡張実数の体系には四則演算だけでなく位相構造(「近さ」という概念が適切に働く構造)も定義されており,上記の演算は極限に基づいて定まるもので,位相構造と両立します.しかし,残念ながら拡張実数の体系においても零除算を位相構造と両立するように定義するのは不可能です.理由は先程と同様に \[\lim_{b\to -0}\frac{1}{b}=-\infty,\quad \lim_{b\to +0} \frac{1}{b}=\infty\] が成り立つので,\(\infty\)と\(-\infty\)のどちらになるかが定まらないからです.
では,負の部分を構造ごと取り除いて,「非負拡張実数」の体系\(\mathbb{R}_{+}\cup\{0,\infty\}\)を考えたらどうでしょうか? この場合は \[\frac{a}{0}=\lim_{b\to +0}\frac{a}{b}=\infty\quad (a\neq 0)\] として位相構造と両立する形で矛盾なく定義できます.しかし,\(0\div 0\)は依然として定義できません.もちろん\(0\div 0\)を勝手に \[\lim_{x\to +0}\frac{x}{x}= \lim_{x\to +0} 1=1\] のことだと解釈して1と定義することもできますが,これは結合法則由来の計算法則\(a\times (b\div c)=(a\times b)\div c\)を破壊する上に,位相構造とも両立しません.他の構造と両立するようにするためには,\(0\div 0\)を分子と分母を独立に0に近づける極限 \[\lim_{\substack{a\to +0 \\ b\to +0}}\frac{a}{b}\] として解釈すべきですが,例えば \[\lim_{\substack{x\to +0}}\frac{2x}{x}=2,\quad \lim_{\substack{x\to +0}}\frac{x^2}{x}=0\] なので,これは確定値になりません.よって,非負拡張実数の体系においても\(0\div 0\)は自然には定義されません.
ちなみに,零除算ではありませんが,\(0\times \infty\)も位相構造と両立する形では定義できません.しかし,測度論やルベーグ積分では便宜上\(0\times \infty=0\)と定義することがあります.これは,極限の結果としての0ではなく,測度の値としての確定した0や可測関数の値としての確定した\(\infty\)を上手く扱うための設定です.
3 実射影直線
実数直線に一つの無限遠点\(\infty\)を付け加えた体系を実射影直線と言います.正確な定義は次の通りです.
Definition 1. \(V\)を位相体\(K\)上の位相線型空間とする.射影空間\(\mathbb{P}(V)\)とは,\(V\setminus\{0\}\)を \[x\sim y\Longleftrightarrow \exists \lambda\in K \setminus\{0\}\text{ s.t. }x=\lambda y\] なる同値関係\(\sim\)で割って得られる商空間である.特に\(\mathbb{P}^n (K)\coloneqq \mathbb{P}(K^{n+1})\)を\(K\)上の\(n\)次元射影空間,\(\mathbb{P}^1 (K)\)を\(K\)上の射影直線,実数体\(\mathbb{R}\)上の射影直線\(\mathbb{P}^1 (\mathbb{R})\)を実射影直線と言う.\(\mathbb{P}^n (K)\)における\((x_1,\ldots,x_{n+1})\in K^{n+1}\)の属する同値類を\([x_1:x_2:\cdots :x_{n+1}]\)と書くことが多い.\(\mathbb{P}^n (K)\)を\(K\mathbb{P}^n\)と書く流儀もある.
実射影直線は直感的には普通の実数の数直線の右端(正の部分の無限遠方)に\(\infty\),左端(負の部分の無限遠方)に\(-\infty\)をくっ付けてから\(\infty\)と\(-\infty\)を同一視して(合わせて一つにして)輪っかにしたような幾何学的構造をしていると考えることができます.このような見方で実数全体を埋め込んだ(\(\mathbb{R}\subset \mathbb{P}^1(\mathbb{R})\)と考えた)実射影直線を射影的補完実数直線と言います.一般の体\(K\)上の射影直線についても,\(x\in K\)と射影空間による定義における\((x,1)\)の属する同値類\([x:1]\in \mathbb{P}^1 (K)\)を同一視することで\(K\subset \mathbb{P}^1 (K)\)と考えることができます.このとき,\(\mathbb{P}^1 (K)\setminus K=\{[1:0]\}\)で,同値類\([1:0]\)は無限遠点と解釈できます.実射影直線はアフィン拡大実数の体系と違って,「無限」が一つしかないのがポイントです.位相空間としては,実射影直線は実数直線の一点コンパクト化(一点を付け加えることでコンパクト集合にしたもの)と同一視できます.ただし,これは1次元限定の性質であり,2次元以上では成り立たない点には注意が必要です.例えば,実射影平面\(\mathbb{P}^2(\mathbb{R})\)は平面\(\mathbb{R}^2\)の一点コンパクト化\(\mathbb{R}^2\cup\{\infty\}\)と同相ではありません.
射影直線の代数的構造としては,実数または一般の体\(K\)の四則演算の拡張として自然に次のように演算が定義できます. \[\frac{x}{0}=\infty \quad (\forall x\neq 0),\quad \frac{x}{\infty}=0 \quad (\forall x\neq\infty),\] \[x\times \infty=\infty\quad (\forall x\neq 0),\quad x+\infty=\infty \quad (\forall x\neq\infty).\] しかし,\(0/0\)は依然として定義できません.\(0\times \infty\)や\(\infty/\infty\)も定義できません.
4 リーマン球面
複素数平面\(\mathbb{C}\)に一つの無限遠点を追加した集合\(\hat{\mathbb{C}}=\mathbb{C}\cup\{\infty\}\)に,通常の複素数の四則演算を次のように拡張した演算を入れたものをリーマン球面と言います. \[z+\infty=\infty\quad(\forall z\in \mathbb{C}),\quad z\cdot\infty=\infty\quad(\forall z\in \hat{\mathbb{C}}\setminus\{0\}),\] \[\frac{z}{0}=\infty \quad(\forall z\in \hat{\mathbb{C}}\setminus\{0\}),\quad\frac{z}{\infty}=0 \quad(\forall z\in \mathbb{C}).\] なお,\(0/0,\infty/\infty,\infty-\infty,0\cdot\infty\)は定義されません.\(\infty\)に乗法逆元が存在しないため,リーマン球面は体にはなりません.
何故「リーマン球面」と言うかというと,自然に多様体としての構造を定めることができ,それが幾何学的には球面として捉えることができるからです.リーマン球面は実は代数的・幾何学的構造も含めて複素射影直線\(\mathbb{P}^1 (\mathbb{C})\)と同じものです.これは1次元複素多様体ですが,実2次元の実多様体としては\(\mathbb{R}^3\)内の単位球面 \[S^2=\{(x,y,z)\in\mathbb{R}^3\mid x^2+y^2+z^2=1\}\] と微分同相で,立体射影によりその様子を描くことができます.複素数平面の一点コンパクト化とも同一視できます.
似たような言葉として「リーマン面」がありますが,リーマン面は一般の連結な複素1次元複素多様体を指します.リーマン球面はリーマン面の一種です.
5 Wheel
では,\(0/0\)が定義される体系はあるのでしょうか?
実は,環に似た代数系で,\(0\div 0\)も含めて零除算が常に可能になる「輪」(wheel)と呼ばれる体系があります.
Definition 2. 集合\(W\)と\(W\)上の2つの二項演算\(+:W\times W\to W\), \(\cdot:W\times W\to W\),単項演算\(/:W\to W\),2元\(0,1\in W\)に対し,\((W,+,\cdot,/,0,1)\)(または単に\(W\))がwheelであるとは,以下が成り立つことを言う.
-
\(+\), \(\cdot\)は可換かつ結合的であり(交換法則と結合法則を満たし),単位元としてそれぞれ\(0,1\)をもつ.
-
\(/(/x)=x\) (\(\forall x\in W\))(\(/\)の対合性)
-
\(/(x\cdot y)=/x\cdot /y\) (\(\forall x,y\in W\)) (\(/\)の乗法性)
-
\(0\cdot 0=0\)
-
\(0\cdot /0+x=0\cdot /0\) (\(\forall x\in W\))(\(0/0\)の加法吸収性)
-
\(x\cdot z+y\cdot z=(x+y)\cdot z+0\cdot z\) (\(\forall x,y,z\in W\))(補正された分配法則その1)
-
\((x+y\cdot z)\cdot /y=x\cdot /y+z+0\cdot y\) (\(\forall x,y,z\in W\))(補正された分配法則その2)
-
\((x+0\cdot y)\cdot z=x\cdot z+0\cdot y\) (\(\forall x,y,z\in W\))(零倍の性質その1)
-
\(/(x+0\cdot y)=/x+0\cdot y\) (\(\forall x,y\in W\))(零倍の性質その2)
ここで,計算の順序は括弧が付いていない限り\(+\)より\(\cdot\)の方を先に計算するものとする(普通の加法と乗法のルールと同じ).また,このとき,\(+\)を\(W\)の加法,\(\cdot\)を\(W\)の乗法と言う.\(x\cdot y\)を単に\(xy\),\(x\cdot /y\)を単に\(x/y\)と書く.
記号から察しがつく通り\(/x\)は\(x\)の逆数\(x^{-1}\)の抽象化になっています.しかし,\(x/x=1\)は常には成り立たないので,\(/\)は\(\cdot\)の厳密な逆演算になるとは限りません.\(/\)を「割り算」と解釈すると,「割り算」は常に可能で,零除算も常に定義できます.しかし,「割り算」は部分的にしか掛け算の逆演算になっていないかもしれないということです.また,\(0x=0\)も常には成り立つとは限らず,1の加法逆元\(-1\)が存在したとしても\(x+(-1)\cdot x=0\)が常に成り立つとは限りません.\(+,\cdot,/\)の全域的定義可能性や,結合法則を全域的に成立させることと引き換えに,これらの計算法則を犠牲にしているわけです.
実射影直線やリーマン球面にbottom elementと呼ばれる一つの要素\(\perp\)を付け加え,\(0/0=\perp\)と定義することにより拡張した体系はwheelになります.実射影直線やリーマン球面では\(x/0\) (\(x\neq 0\))は定義されていましたが,\(0/0\)は定義されていませんでした.この拡張により全ての零除算が定義できたことになります.こうすると,wheelの演算の公理により\(\infty/\infty\)や\(\infty+\infty\)も\(\perp\)になります.位相も考える場合,\(\perp\)は他の全ての元と密着しているものと解釈され,\(\mathbb{R}^2\)や\(\mathbb{R}^3\)には埋め込むことができない,従って平面上や空間内には描くことができないような位相空間になります.しかし,無理やり円周や球面の全ての点とそこにない1点\(\perp\)が密着している様子を描こうとして,\(\perp\)を中心に配置し,周りから線を引っ張ると,車輪のような形になります.これがwheelという用語の由来です.
一般のwheelについて言えることですが,\(0/0\)は何を足しても何を掛けても変わりません.このように,代数系においてどんなものと演算した結果も自分自身になるような要素を吸収元と言います.何を足しても変わらないという性質はwheelの公理に含まれており,何を掛けても変わらないという性質はそれと計算法則「\((x+0\cdot y)\cdot z=x\cdot z+0\cdot y\) (\(\forall x,y,z\in W\))」において\(x=0,y=/0\)としたものから導かれます.最早何を施しても変化しないものに落とし込むことで,\(0/0\)の「不定」性に対処しているのです.
6 Common meadow
可換環の公理において加法逆元の公理\(x+(-x)=0\)を\(x+(-x)=0x\), \(-(-x)=x\)に弱め,更に\(0(x+y)=0xy\)を課した代数系をpre-meadowと言い,pre-meadowの公理から\(0(x+y)=0xy\)を取り除いて代わりに全域的に定義された一般化逆元をとる操作\(\cdot^{-1}\)に関する公理
-
\(x\cdot x^{-1}=1+0x^{-1}\)
-
\((xy)^{-1}=x^{-1}y^{-1}\)
-
\((1+0x)^{-1}=1+0x\)
-
\({}^\exists \mathbf{a}=0^{-1}\)
-
\(\mathbf{a}+x= \mathbf{a}\)
を追加したものをcommon meadowと言います(\(x\)の全称量化は省略しています). pre-meadowでは\(0x=0\)が成り立つとは限らず,もし成り立てば可換環になります.Common meadowは\(0x=0\)という計算法則を捨て去る代わりに全ての元の逆数の存在を獲得した代数系と言え,0の逆数は加法に関する吸収元になります.
最近の研究により,pre-meadowは可換環の非交和に分割され,common meadowは可換環の束と対応することが示されています.
7 零環
集合\(\{0\}\)に\(0+0=0\), \(0\cdot 0=0\)という自明な加法と乗法を入れたものを零環と言います.零環は環の一種ですが,\(1\)を乗法単位元として\(0=1\)が成り立ちます.最もつまらない例ですが,零環では\(0/0= 0\cdot 0^{-1}=0\)で零除算が常に可能になります.ただ,豊かな構造がなく,数として0しか考えないので,零環の中身だけを考えてもあまり意味はありません.数学的にはむしろ「環の圏における終対象である」などの零環自体の圏論的な性質の方が重要でしょう.
加法単位元0が逆元をもつ(可逆である)という条件を満たす環は零環しかありません.
8 コンピュータではどうなるか?
零除算を含むプログラムを実行しようとした場合にどうなるかは言語や処理系,扱う型に依存します.
整数型の場合,整数を0で割るようなプログラムは実行時例外やエラー(JavaではArithmeticException,PythonではZeroDivisionError,RubyではZeroDivisionError)を発生させます.
一方,浮動小数点型で零除算を行うと,NumPyを使用していない場合の標準のPython(整数型と同様にZeroDivisionErrorが発生)やMicrosoft Excel(独自の仕様として#DIV/0!というエラーメッセージを表示)など,エラーや例外が発生するケースもありますが,浮動小数点演算の規格の一つであるIEEE 754に従い,被除数(分子)が零でない場合は「無限大」(Infinity,Inf,inf)または「負の無限大」,被除数も零の場合は非数(NaN,nan)が値として返されることが多いです.浮動小数点では,正確には0でない数でも丸め誤差により0.0として扱われてしまう場合があります.また,分母に偶然0.0が現れる可能性があるような計算を大量に行うプログラムにおいて,分岐処理などにより0.0でないかを逐一確認してから計算を行うようにすると,計算コストが増加してしまうという問題もあります.そのため,浮動小数点の四則演算において零除算をエラーや例外扱いにせず,零除算が発生しても計算を継続可能とするIEEE 754に則った設計にはパフォーマンス上の利点があります.
9 まとめ
いかがだったでしょうか? 零除算を定義することは様々な体系で可能ですが,何らかの計算法則と両立させようとすると,どこかにしわ寄せが来て,別の計算法則や構造が犠牲になります.全ての演算の結果が定義でき,実数や複素数で成り立つような全ての計算法則が成り立ってくれるような都合の良い体系は残念ながら存在しません.
9 J. Dias, B. Dinis: Strolling through common meadows. Communications in Algebra 52(12), 5015–5042, 2024