0の0乗が1でないと困る


リンクしないけど、0の0乗がゼロ除算同様未定義であるというような記事がブクマを集めていてなんか困るよなぁと思って書いた。

# 前提として

```math
\displaystyle \lim_{x \to 0} (x^0)=1
\\
\displaystyle \lim_{x \to +0} (0^x)=0
```

である。
$x^y$ は、$(0,0)$ で不連続になっているので、極限を根拠に $0^0$ を定めるとすると、不定とか定義されないとか、そういうことになる。

これは未定義のほうが好ましいかもしれない理由のひとつにはなるけれど、決して決定的ではない。

連続性を根拠にするのは、一見未定義であっても連続性を保つように定義できれば幸せになるからだと思う。
とはいえ。
$x^y$ の $(0,0)$ における連続性と、$0^0$ の値は、別の話だ。
どうやっても連続性が保てないからといって、よい定義が存在しないという事にはならない。

というわけで、$0^0$ が時折現れる世界をより住みやすくするためにはどうすればいいのかを考える。
ゼロ除算のように未定義にするのがよいのか、${0!}$ のように、よい値を定義するのがよいのか。

# 指数法則

$0^0$ をどうするかにあたって、指数法則は大事だ。
連続性は$x^y$という関数の本質ではないと思うけど、指数法則は$x^y$の本質だと思う。
指数法則のじゃまになるような定義しか出来ないのなら、未定義にしておいたほうが良い。

で。
指数法則により、
$0^0 × 0^0 = 0^{0+0}$
$(0^0)^0 = 0^{0×0}$
でなければならない。
ので、$0^0$ は、$0$ または $1$ となる。
逆に $0^0$ が $0$ または $1$ ならば（ゼロ除算になってしまうものを除いて）全ての指数法則を満たす。（証明してないからちょっと自信ない）

で。
どっちにするのがいいのか。

# 例えば二項定理

二項定理は普通

$n$ が非負の整数の場合
$(a+b)^n=\displaystyle \sum_{k=0}^n{ _n C _k}a^{n-k}b^k$

と書くが、$0^0$ が未定義であるという立場なら、
まあ $n$ を正の整数にするのはまあ良いとして、
「ただし、$a=0$、$b=0$ の場合は成立しない」
というような註釈が必要になる。

このような註釈なしで二項定理を扱ってきた人は、暗黙のうちに $0^0=1$ の立場で計算していたことになる。

# 例えば数列の和

たとえば

```math
\sum_{k=0}^{n-1}(k+1)x^k = \frac{1-(n+1)x^n+nx^{n+1}}{(1-x)^2}
```

を考える。

$x=0, n=1$ のときも成立してほしいので、代入する。

```math
\sum_{k=0}^{n-1}(k+1)x^k = (0+1)0^0 = 0^0
\\
\frac{1-(n+1)x^n+nx^{n+1}}{(1-x)^2} = \frac{1-(1+1)0^1 + 0^2}{1^2} = 1
```

というわけで、$0^0$ は $1$ であってほしい。

# たとえば重複順列

相異なる $n$ 個のものから、重複を許して $r$ 回選ぶ選び方は、$n^r$ になる。

$0$ 個のなかから重複を許して $1$ 回選ぶ選び方は、そんな選び方はできないので $0$ 通り。$0^1=0$ なので辻褄が合う。

$1$ 個のなかから重複を許して $0$ 回選ぶ選び方は「なにも選ばない」という行為がのみが該当するので $1$ 通り。$1^0=1$ なので辻褄が合う。

$0$ 個のなかから重複を許して $0$ 回選ぶ選び方も「なにも選ばない」で問題がないので、 $1$ 通り。というわけで、$0^0=1$ が望ましい。


# 例えば微分

$y=x^n\, (0<n)$  の $x=0$ における傾きを考える。
微分して、
$y'=x^{n-1}$。
これに $x=0$ を代入して、
$y'\mid_{x=0}=0^{n-1}$
$n=1$ の場合も成立してほしいので、やはり $0^0$ は $1$ が望ましい。

この $y'$ を表現する際に場合分けをしてなかった人は、暗黙のうちに $0^0$ が $1$ であることを受け入れていたことになると思う。

# 数学の専門書と専門家の意見
「標準的な数学の教科書においては、0の0乗は定義されない」というような意見もあるが、手元にある「解析入門Ⅰ」( http://www.amazon.co.jp/dp/4130620053 )を見ると


> **定義 1**　$\exp  z = \displaystyle \sum_{n=0}^{\infty}{\frac{z^n}{n!}}$

としたうえで、
> 定義から明らかに
$\exp 0 = 1$
(略)が成立つ

としている。
この「定義から明らかに」というのは
定義 1 の $z$ に $0$ を代入すればすぐわかるよね、という意味で

```math
\exp  0 = \sum_{n=0}^{\infty}{\frac{0^n}{n!}} = \frac{0^0}{0!}+\frac{0^1}{1!}+\dots
```

という計算の結果として $\exp 0=1$ であるということを言っている。

つまり、この本は $0^0=1$ であることを当然のこととして知っている人を読者として想定している。
なお。この本は解析学の本である。

また、数学者である黒木さんは
https://twitter.com/genkuroki/status/664278743091818496
で
> 「函数x^yを(x,y)=(0,0)まで連続的に延長できない」という話と「函数x^0のxに0を代入するときには0^0=1とみなす習慣になっている」という話を両方理解しておく必要があるし、高校の段階ではっきりそう教えておかなければ生徒は混乱するだろう。

とおっしゃっている。
私は数学者ではないが、私もそう思う。

# というわけで

上記の通り、高校数学の範囲でも $0^0=1$ でないといろいろ困る。

最初の方に書いた通り、これは、どう定義したら幸せになるかという話で、$0^0$ を ゼロ除算のように扱う世界/処理系/文脈 があっても矛盾はない。

矛盾はないんだけど、$0^0$ が $1$ ではないような 世界/処理系/文脈 は、今流通している数学の常識からは逸脱している。

それは丁度「0÷0は、1とする」とか「$\sqrt{4}$ は $-2$ とする」いう世界に似ていると思う。そうしたって矛盾はないけど、そうしないよね。

※ 0÷0 を 1 とした場合に矛盾があるという指摘がはてなブックマークにあるが、そんなことはない。

```math
1×0=2×0
\\
(1×0)÷0=(2×0)÷0
```

ここで、我々の世界では
$1×(0÷0)=2×(0÷0)$
と変形したくなるが、0÷0=1 の世界ではそのような変形は許されないということである。

# さまざまな言語の実装

幾つかの言語で調べてみたが、やはりどの言語でも $0^0=1$ となっている。
※ と書きましたが、コメントによると mathmatica, maxima などでは $0^0$ は未定義になるとのこと。

```ruby:ruby
0**0 #=>1
```

```python:python3
0**0 #=>1
```

```perl:perl
print( 0**0 ) #=>1
```

```C++:C++
std::cout << std::pow(0.0,0.0); //=>1
```

※ はてなブックマークで指摘のあった通り、C99 の仕様では
> A domain error may occur if x is zero and y is zero. 

となっており、処理系によっては domain error となる場合がある模様。


```javascript:node.js
Math.pow(0,0) //=>1
```

```groovy:groovy
print( 0**0 ) //=>1
```

```PHP:PHP
<?php
echo pow(0, 0); //=>1
?>
```

```fortran:fortran95
print '(F10.5)', 0.0**0.0 !=>1.00000
end
```

```R:R
0.0**0.0 # => 1
```

```octave:octave
printf( "%f", 0.0^0.0 ) #=> 1.000000
```

```C#:C#
Console.WriteLine("{0}", Math.Pow(0,0)); //=>1
```

Go ( see http://golang.jp/pkg/math )
> Pow(x, ±0) = 1 for any x