ゼロ除算

数学において**ゼロ除算**（ゼロじょさん、ゼロじょざん、0除算、）とは、0で除す割り算のことである。このような除算は、除される数をとすると、形式的に と書くことができるが、このような式を矛盾なく定義することはできない。一方、コンピュータプログラムの計算においてゼロ除算が発生した場合、大抵はエラーとなって計算処理が中断されてしまう為、一般的には0による除算が起こらないように設計される。
## 概要
### 陥りやすい誤解
現代数学の観点では、いかなるアプローチから定義を試みようとも必ず破綻に至る。結局、「**値を定義し得ないため、計算は不可能である**」と理解する他ない概念であり、それ以上の議論によって数学的に有用な結果が得られることは期待できない。しかし、概念自体は極めて初等的な知識で捉えることができるため、しばしば数学的原則を前提としていない議論や独自な解釈が展開されることがある。そのような議論や解釈はいずれも論理的破綻を含むか信頼性のある根拠を伴わない為、学術的な評価の余地をほとんど有しない。

ゼロ除算の定義可能性に関する誤った理解の典型としては、例えば\lim_{x \to +0}\frac{1}{x}のような極限が通常「+∞」という記号で表現されることから、「ゼロ除算の値を∞で定義することができる。」などと誤解し、これを起点として、ある種の集合においてはゼロ除算の定義可能性が排除されない、という旨の解釈を展開するケースである。すなわち、「\lim_{x \to +0}\frac{1}{x} = +∞」のような、極限についての単なる「記号的な表現式」を「等式」（1/0 = +∞）として成立させるために定義を拡張しようと試みるものであるが、いずれも基礎的な観点において破綻を招いてしまい、結局、ゼロ除算の定義可能性を生み出すことには繋がらない。例えば、実数体（または複素数体）に無限遠点を付加した集合におけるゼロ除算の定義可能性を議論する解釈については、無限遠点の付加によってそれらの集合の代数構造が破壊される（すなわち、既存の代数構造が維持できない）ことが直ちに確認できるため、除算はおろか加法や乗法という最低限の演算すら良く定義されない集合であるという事実に至る。結局、「1/0 = +∞」のような式は、極限計算の定義を表現するシンボルとして理解できるだけで、ある種の除算の値についての定義可能性を示唆するものではない。

「1/0 = 1」や「1/0 = 0」で定義し、ゼロ除算が可能であるとする主張もあるが、これらは約分や通分で破綻を起こす。例えば「1/0=1」のとき、

　約分：　1=1/0=(2*1)/(2*0)=2/0=2*(1/0)=2　（矛盾）

　通分：　
2=1+1=1/0+1/1=(1*1+0*1)/(0*1)=1/0=1

　（矛盾）

となる。「1/0 = 0」でも同様に通分が破綻する。さらにこれらの場合、例えば a*(1/a) という計算において通常は即座に「1」とできるはずが、

\quad a*(1/a)= \begin{cases} 0 & (a=0) \\ 1 & (a\neq 0) \end{cases}

のような場合分けも発生する。結局、「1/0 = 0」などを認めても、通常のように分母ゼロのケースを排除している状況（この場合、初めから a\neq 0 としておくこと）より複雑化してしまったり、破綻を招いてしまう。

1点集合 X:= \{ e\} に  0:=e  、1:=e  （したがって、特に 1=0  ）として環の構造を与え、体とみなすこととすれば、 X においてはいかなる２項演算も矛盾を起こさないため、除算とよぶ演算を好きなように定義できるが、このような集合で代数学を展開する意味は無い。この X は零環または自明な体と呼ばれる。ゼロ除算が成立する集合は、実体的にはこの X と同じ（すなわち環同型）となってしまう。

### 身近な例
コンピュータの整数演算においては多くの場合、無限大に相当する値は定義されておらず《エラー》が発生し、またいくつかの除算アルゴリズムの単純な実装（取尽し法など）を採用しており《無限ループ》に陥りシステムが実質的に停止してしまう。浮動小数点数の国際標準規格のIEEE 754に浮動小数点の演算の結果 戻される値（戻されるべき値）の定義がされているが、システムの挙動はその種類により異なる。
→#コンピュータにおけるゼロ除算

一般的な電卓（普通電卓または事務用電卓）では、ゼロ除算の場合、画面には「E   0.」のように表示される。

計算尺では、対数尺には0に相当する位置が存在しない（無限の彼方である）ため計算不可能である。

## 算数的解釈
日本の小学校における算数では、除算は何らかの物の集合をそれぞれ同数になるように分けることで説明される。例えば、6個のリンゴを3人で分ける場合、各人は2個ずつのリンゴを受け取ることになる。これは 6 ÷ 3 = 2個の簡単な説明である。この考え方を使ってゼロ除算を説明できる。6個のリンゴを0人で分けるとする。これはすなわちリンゴを受け取る人がいないということを意味する。その場合、それぞれ何個ずつのリンゴを受け取るか？という問いは、そもそも問題の前提が破綻しており答えは定義できない。すなわち6 ÷ 0 を計算しようとしても、定義できないのである。以上のように算数レベルで考える場合、ゼロ除算は無意味または未定義となる。

ゼロ除算の未定義性を理解する別の方法として、減法の繰り返し適用という考え方がある。すなわち、0になるまで被除数から除数を引き続けるのである。例えば96を8で割る場合、96-8-8-8-...=0となるまで8は12回引くことができるので、96÷8=12とする。ゼロ除算で同様の例を考える。例えば卵が6個入っている籠から定期的に一定個数の卵を取り出して籠を空にするとする。このとき毎回0個ずつ取り出す、すなわち籠に手を入れるけれども1個も取り出さないという操作を考えると、この取り出す操作をどれだけ繰り返しても籠を空にすることはできない。つまり0で割る結果は未定義であるとする説明がある。

## 初期の試み
ブラフマグプタが著した『ブラーマ・スプタ・シッダーンタ』は、0を数として定義し、その演算結果も定義している著作としては最初期のものである。しかし、ブラフマグプタによるゼロ除算の定義に従うと、代数的不合理が生じることを簡単に証明できる。ブラフマグプタによれば、次の通りである。

830年、マハーヴィーラはブラフマグプタの間違いを著書『ガニタ・サーラ・サングラハ』で「数はゼロで割っても変化しない」と訂正しようとしたが、これも失敗に終わった。

バースカラ2世は  = ∞ と定義することで問題を解決しようとした。この定義は一見正しいようにも見えるが、この定義に従うとパラドックスに陥る（後述の「ゼロ除算と極限」も参照）ため、結局これも失敗に終わった。このパラドックスは近年まで考察されなかった。

## 代数学的解釈
ゼロ除算を数学的に扱う自然な方法は、まず除算を他の算術操作で定義することで得られる。整数、有理数、実数、複素数の一般的算術規則では、ゼロ除算は未定義である。体の公理体系に従う数学的体系では、ゼロ除算は未定義のままとされなければならない。その理由は、除法が乗法の逆演算として定義されているためである。つまり、 の値は、*bx* = *a* という方程式を *x* について解いたときに値が一意に定まる場合のみ存在する。さもなくば、値は未定義のままとされる。（ただし数学基礎論などでは全域的な関数を扱う議論が除法を含めても適用できるよう便宜的に  = 0 と定義しておくことはある。あるいは *a* ÷ 0 = *a* と定義しておくこともある。）

*b* = 0 のとき、方程式 *bx* = *a* は 0*x* = *a* または単に 0 = *a* と書き換えられる。つまりこの場合、方程式 *bx* = *a* は *a* が 0 でないときには解がなく、*a* が 0 であれば任意の *x* が解となりうる。いずれにしても解は一意に定まらず、 は未定義となる。逆に、体においては  は *b* がゼロでないとき常に一意に定まる。

### ゼロ除算に基づく誤謬
ゼロ除算を代数学的記述に用いて、例えば以下のように 1 = 2 のような誤った証明を導くことができる。

以下を前提とする。
:0 \times 1 = 0\quad
:0 \times 2 = 0\quad
このとき、次が成り立つ。
:0 \times 1 = 0 \times 2
両辺をゼロ除算すると、次のようになる。
:1 = 2\quad
この誤謬は、暗黙のうちに =1 であるかのように扱っていることから生じる。

上の証明が間違いであることは多くの人が気づくと思われるが、これをもっと巧妙に表現すると間違いを分かりにくくできる。例えば、1 を *x* と *y* に置き換え、ゼロを *x* &minus; *y*、2 を *x* + *y* で置き換える。すると上記の証明は次のようになる。

* 0 \times 1 = 0\quadのとき
:(0) \qquad \times(1) =0
: (x-y)\times(x)= (x-y)x=0 
:(x-y)x= x^2-xy =0 …①
:また、xとｙに１を代入すると
:x^2-xy =(1)^2-(1\times1)=1-1=0

* 0 \times 2 = 0\quadのとき
: (0) \times(2) =0 
:(x-y)\times (x+y) =(x-y)(x+y) = 0
:(x-y)(x+y) = x^2-y^2 = 0 …②
:また、xとｙに１を代入すると
: x^2-y^2= (1)^2-(1)^2 = 0

:①と②の各左辺より、
:(x-y)x = (x-y)(x+y)
:両辺を *x* &minus; *y* で割ると次のようになる。
:x = x+y
:*x* = *y* = 1 であったからこれを代入すると、次のようになる。
:1 = 2

## 解析学的解釈
### ゼロ除算と極限
[thumb|right|300px|関数 ''y'' =  のグラフ。''x'' が 0 に近づくと、''y'' の[絶対値は無限大に近づく。]]
直観的に  は  で 正数*b* を 0 に漸近させたときの極限を考えることで定義されるように見える。

*a* が正の数の場合、次のようになる。
:\lim_{b \to 0+} \frac{a}{b} =+\infty
*a* が負の数の場合、次のようになる。
:\lim_{b \to 0+} \frac{a}{b} =-\infty
したがって、*a* が正のとき  を +∞、*a* が負のとき &minus;∞ と定義できるように思われる。しかし、この定義には以下の2つの問題点があるため、こういう定義はできない。

第一に、正と負の無限大は実数ではない。実数の範囲内で考えたい場合、この定義には意味がない。この定義を使いたければ、何らかの形で実数を拡張する必要がある。

第二に、右側から極限に漸近するのは恣意的である。左側から漸近して極限を求めた場合、*a* が正の場合に  が &minus;∞ となり、*a* が負の場合に +∞ となる。これを等式で表すと次のようになる。
:+\infty =\frac{1}{0} =\frac{1}{-0} =-\frac{1}{0} =-\infty
このように、+∞ と &minus;∞ が等しいことになってしまい、これではあまり意味がない。これを意味のある拡張とするには、「符号のない無限大」という概念を導入するしかない。

実数に、正負の区別が有る、あるいは無い、無限大が含まれるように拡張したものが拡大実数である。アフィン拡大実数では区別が有り、射影拡大実数では区別が無い（無限遠点）。

 についても、極限
:\lim_{(a,b)\to (0,0)} \frac{a}{b} 
は存在しないため、うまく定義できない。さらに一般に、*x* が 0 に漸近すると共に *f*(*x*) も *g*(*x*) も 0 に漸近するとして、極限
:\lim_{x\to 0} \frac{f(x)}{g(x)}
を考えても、これは任意の値に収束する可能性もあるし、収束しない可能性もある。したがって、この手法では  について意味のある定義は得られない。

### リーマン球面
リーマン球面は、複素平面に無限遠点 ∞ の1点を付け加えて得られるもの **C**&nbsp;∪&nbsp;{∞} である。上記実射影直線（射影拡大実数）の複素数版とも考えられる。リーマン球面は複素解析において重要な概念であり、演算は例えば 1/0 = ∞、1/∞ = 0、などとなるが、∞+∞ や 0/0 は定義されない。

## コンピュータにおけるゼロ除算

ゼロ除算をしたときのコンピュータの挙動は整数演算の場合と浮動小数点数演算の場合で異なる。したがって、整数演算の場合と浮動小数点数演算の場合で分けて説明する。

;整数演算の場合
コンピュータにおける整数のゼロ除算では結果を表す方法がなく、多くのプロセッサは整数のゼロ除算を実行しようとすると 《例外》 を発生させる。(なおIntel 8086の場合、商がレジスタに格納できる数値を越えている場合にもゼロ除算した時と同様の例外が発生する)。この例外に対する対処がなされていない場合、ゼロ除算を実行しようとしたプログラムは**[[強制終了]]（[[アボート]]）されてしまう**。これは、ゼロ除算が 《 エラー 》 と解釈されるためで、エラーメッセージが表示されることも多い。

;浮動小数点演算の場合
他方、浮動小数点演算の場合は、次のようなことが起きる。
*《エラー》で処理を中断する
*無限を意味するInfinity(無限大)という特殊な数を返す。
*非数（NaN、Not a Number）を返す
*NULLという特殊な値を返す
なおゼロ除算が生じた場合にそのマシンで表現可能な最大値に + /- の符号も考慮した上で置き換えて処理を続行することを推奨している本もある。

なお、浮動小数点数演算の規格であるIEEE 754では、全ての浮動小数点数演算が定義されており、ゼロ除算も例外ではなく、どういう値になるか（どういう値を返すべきか）が定義されている。IEEE 754の定義によれば、*a*/0 で *a* が正の数であれば、除算の結果は正の無限大となり、*a* が負の数であれば負の無限大となる。そして、*a* も 0 であった場合、除算結果は NaN（、数でない）となる。IEEE 754 には &minus;0 も定義されているため、0 の代わりに &minus;0 で除算をした場合は、上述の符号が反転する。
IEEE 754は現在、ほとんどのコンピュータでサポートされている。
 
### コンピュータのゼロ除算が原因で実際に現実世界で起きた事態
1997年、民生品の応用を研究していたアメリカ海軍は、タイコンデロガ級ミサイル巡洋艦「ヨークタウン」を改造して主機のガスタービンエンジンの制御にマイクロソフトのソフトウェアを採用したが、試験航行中にデータベースのゼロ除算が発生してソフトウェアが《例外》を返し、結果として主機が停止、回復するまでカリブ海を**2時間半ほど[[漂流]]**する事態となってしまった。

## ポップカルチャー
* "OH SHI-"―ゼロ除算がコンピュータや電卓でエラーを引き起こす様を宇宙の終焉などに結びつけた英語の口語表現。「Oh shit!」と最後まで言い切る前に宇宙は破壊されてしまう。
* テッド・チャンの短篇に『*ゼロで割る*』（w:Division by Zero (short story)）という題名のものがある。
* 北米発祥のジョーク、チャック・ノリス・ファクトによれば、「チャック・ノリスはゼロ除算ができる」という真実（ファクト）がある。
* マジック:ザ・ギャザリングのストリクスヘイヴン：魔法学院では、同名のカードが打ち消し呪文として登場する。

## 脚注



### 出典

## 参考文献
* Jakub Czajko (July 2004) "On Cantorian spacetime over number systems with division by zero", *Chaos, Solitons and Fractals*, volume 21, number 2, pages 261&mdash;271.
* ゼロ除算の結果を nullity という新たな記号で表す方法が提唱された。
* 
* 
* 

## 関連項目
*漸近線
*0の0乗
*輪 (数学)
*NaN

## 外部リンク
*
*The Last Denominator - 「OH SHI-」を題材にしたショートフィルム。ゼロ除算をしようとした直後に地球が爆発する。