近傍の種類

位相空間とはなんでしょうか?
1つの解釈は、近傍の形を決めた空間といえます。
近傍とは、私たちがよく知っている円があります。
しかし、次も近傍です。
f:id:mikuwaorenoyome:20160607073451p:plain
これはノイマン近傍と呼ばれていて、次で定義されます。
|x|+|y|=1
次は、ムーア近傍と呼ばれているものです。
f:id:mikuwaorenoyome:20160607074054p:plain
\displaystyle\lim_{n\rightarrow\infty}(|x|^n+|y|^n)=1
全体集合も近傍になります。\{0\}も近傍です。
本当は、位相空間はもっと広い意味で使われるのですが、私たちがよく知っているものは、これらが定義されています。

一般に、異なる近傍を決めると、異なる位相になりますが、円とノイマン近傍とムーア近傍は同じ位相空間になります。

あらゆる言葉が載った辞書

あらゆる言葉が載った辞書を考えます。
一番最初に載っている言葉は何でしょうか?
正解は「あ」です。
次は「ああ」ですね。その次が「あああ」。
何ページかめくると、「あああああ・・・」となってますね。
それを超えると、今度は「あい」になります。
次が「あいあ」。その次が「あいああ」。
以下、「あいあああああ・・・」となってますね。
さらに超えると、次は「い」になります。
以下、「いあ」、「いああ」、「いあああ・・・」、「いあい」、「いあいあ」、「いあいああ」、「いあいあああ・・・」となります。

では、辞書を分けて、「あ」から始まる辞書を「あ巻」とし、最初の「あ」を省略します。
一番最初に載っている言葉は何でしょうか?
元の辞書の「あ」は消えるので、次の「ああ」の「あ」を省略して、「あ」になります。
次は、「あああ」を省略して、「ああ」になります。
以下、「あああ」、「ああああ」、「あああああ・・・」になります。
それを超えたら、次の「あい」を省略して、「い」になります。
以下、「いあ」、「いああ」、「いあああ・・・」となります。
つまり、「あ巻」は、「あ」、「ああ」、「あああ・・・」、「い」、「いあ」、「いああ」、「いあああ・・・」となっています。

ということは、元の辞書とあ巻は同じものになります。
辞書を分けたはずなのに、同じになるのは不思議ですね。

スターリング数

S(m,n)をm個の集合からn個の集合への全射の総数とする。
S(m,n):=|\{f\in B^A|f:全射,|A|=m,|B|=n\}|
以下の漸化式が成り立つ。
 S(m,0)=0^m\\
\displaystyle S(m,n)=n^m-\sum_{k=0}^{n-1}\left(\begin{matrix}n\\k\end{matrix}\right)S(m,k)
nを固定して求める。
\displaystyle 
\begin{eqnarray}
S(m,1)&=&1^m-\sum_{k=0}^{0}\left(\begin{matrix} 1 \\k\end{matrix}\right)S(m,k)\\
&=&1^m-\left(\begin{matrix} 1 \\0\end{matrix}\right)S(m,0)\\
&=&1^mー0^m\\
S(m,2)&=&2^m-\sum_{k=0}^{1}\left(\begin{matrix}2 \\k\end{matrix}\right)S(m,k)\\
&=&2^m-\left(\begin{matrix}2 \\1\end{matrix}\right)S(m,1)-\left(\begin{matrix}2 \\0\end{matrix}\right)S(m,0)\\
&=&2^m-2(1^m-0^m)-0^m\\
&=&2^m-2\cdot1^m+0^m\\
S(m,3)&=&3^m-\sum_{k=0}^{2}\left(\begin{matrix}3 \\k\end{matrix}\right)S(m,k)\\
&=&3^m-\left(\begin{matrix}3 \\2\end{matrix}\right)S(m,2)-\left(\begin{matrix}3 \\1\end{matrix}\right)S(m,1)-\left(\begin{matrix}3 \\0\end{matrix}\right)S(m,0)\\
&=&3^m-3(2^m-2\cdot1^m+0^m)-3(1^mー0^m)-0^m\\
&=&3^m-3\cdot2^m+3\cdot1^m-0^m\\
S(m,4)&=&4^m-\sum_{k=0}^{3}\left(\begin{matrix} 4 \\k\end{matrix}\right)S(m,k)\\
&=&4^m-\left(\begin{matrix} 4 \\3\end{matrix}\right)S(m,3)-\left(\begin{matrix} 4 \\2\end{matrix}\right)S(m,2)-\left(\begin{matrix} 4 \\1\end{matrix}\right)S(m,1)-\left(\begin{matrix} 4 \\0\end{matrix}\right)S(m,0)\\
&=&4^m-4(3^m-3\cdot2^m+3\cdot1^m-0^m)-6(2^m-2\cdot1^m+0^m)\\
&&-4(1^mー0^m)-0^m\\
&=&4^m-4\cdot3^m+6\cdot2^m-4\cdot1^m+0^m
\end{eqnarray}
どうやら、S(m,n)は次の式になるようだ。
\displaystyle S(m,n)=\sum_{k=0}^n \left(\begin{matrix}n\\k\end{matrix}\right) (-1)^{n-k} k^m
以下、数学的帰納法で証明する。
\displaystyle
\begin{eqnarray}
S(m,n)&=&n^m-\sum_{k=0}^{n-1}\left(\begin{matrix}n\\k\end{matrix}\right)S(m,k)\\
&=&n^m-\sum_{k=0}^{n-1}\left(\begin{matrix}n\\k\end{matrix}\right)\sum_{i=0}^k \left(\begin{matrix}k\\i\end{matrix}\right) (-1)^{k-i} i^m\\
&=&n^m-\sum_{k=0}^{n-1}\sum_{i=0}^k \left(\begin{matrix}n\\k\end{matrix}\right)\left(\begin{matrix}k\\i\end{matrix}\right) (-1)^{k-i} i^m\\
&=&n^m-\sum_{i=0}^{n-1}\sum_{k=i}^{n-1} \left(\begin{matrix}n\\k\end{matrix}\right)\left(\begin{matrix}k\\i\end{matrix}\right) (-1)^{k-i} i^m\\
\end{eqnarray}

\begin{eqnarray}
\left(\begin{matrix}n\\k\end{matrix}\right)\left(\begin{matrix}k\\i\end{matrix}\right)&=&\frac{n!}{k!(n-k)!}\frac{k!}{i!(k-i)!}\\
&=&\frac{n!}{(n-k)!}\frac{1}{i!(k-i)!}\\
&=&\frac{n!}{i!}\frac{1}{(n-k)!(k-i)!}\\
&=&\frac{n!}{i!(n-i)!}\frac{(n-i)!}{(n-k)!(k-i)!}\\
&=&\left(\begin{matrix}n\\i\end{matrix}\right)\frac{(n-i)!}{(n-k)!(k-i)!}\\
\end{eqnarray}

\begin{eqnarray}
S(m,n)&=&n^m-\sum_{i=0}^{n-1}\sum_{k=i}^{n-1} \left(\begin{matrix}n\\k\end{matrix}\right)\left(\begin{matrix}k\\i\end{matrix}\right) (-1)^{k-i} i^m\\
&=&n^m-\sum_{i=0}^{n-1}\sum_{k=i}^{n-1} \left(\begin{matrix}n\\i\end{matrix}\right)\frac{(n-i)!}{(n-k)!(k-i)!} (-1)^{k-i} i^m\\
&=&n^m-\sum_{i=0}^{n-1}\left(\begin{matrix}n\\i\end{matrix}\right)i^m\sum_{k=i}^{n-1} \frac{(n-i)!}{(n-k)!(k-i)!} (-1)^{k-i}\\
\end{eqnarray}

\begin{eqnarray}
\sum_{k=i}^{n-1} \frac{(n-i)!}{(n-k)!(k-i)!} (-1)^{k-i}&=&\sum_{k-i=0}^{n-i-1} \frac{(n-i)!}{(n-i-(k-i))!(k-i)!} (-1)^{k-i}\\
&=&\sum_{j=0}^{n-i-1} \frac{(n-i)!}{(n-i-j)!j!} (-1)^{j}\\
&=&\sum_{j=0}^{n-i-1} \left(\begin{matrix}n-i\\j\end{matrix}\right) (-1)^{j}\\
&=&-\left(\begin{matrix}n-i\\n-i\end{matrix}\right) (-1)^{n-i} + \sum_{j=0}^{n-i} \left(\begin{matrix}n-i\\j\end{matrix}\right) (-1)^{j}\\
&=&-(-1)^{n-i}+0^{n-i}
\end{eqnarray}

\begin{eqnarray}
S(m,n)&=&n^m-\sum_{i=0}^{n-1}\left(\begin{matrix}n\\i\end{matrix}\right)i^m\sum_{k=i}^{n-1} \frac{(n-i)!}{(n-k)!(k-i)!} (-1)^{k-i}\\
&=&n^m-\sum_{i=0}^{n-1}\left(\begin{matrix}n\\i\end{matrix}\right)i^m(-(-1)^{n-i}+0^{n-i})\\
&=&n^m+\sum_{i=0}^{n-1}\left(\begin{matrix}n\\i\end{matrix}\right)i^m(-1)^{n-i}-\sum_{i=0}^{n-1}\left(\begin{matrix}n\\i\end{matrix}\right)i^m 0^{n-i}\\
&=&\sum_{i=0}^{n}\left(\begin{matrix}n\\i\end{matrix}\right)i^m(-1)^{n-i}\\
&=&\sum_{k=0}^n \left(\begin{matrix}n\\k\end{matrix}\right) (-1)^{n-k} k^m
\end{eqnarray}
ちなみに、スターリング数はS(m,n)をn!で割ったものだ。

ドットボックス 3×3 必勝

Dots&Boxesという外国のゲームの3×3の必勝手順を調べました。
結果は後手必勝となったんですが、問題はプログラムを走らせるとあまりにも早く結果が出るんですよね(-_-;)
プログラムが間違ってるのか私が間違っているのか・・・

#include<stdio.h>

bool dotbox(int *c);
bool turn(int *c);
void calq(int *c, bool *q);
void calsq(int s, int *sq);
bool winlose(int *c);
void printc(int *c);

int main(){
	int i;
	int c[24];
	int result;
	
	for (i = 0; i < 24; i++){
		c[i] = -1;
	}
	
	result = dotbox(c);
	printf("%d\n", result);
	return 0;
}
bool dotbox(int *c){
	int i,j,k;
	bool t;
	for (k = 0; k < 24; k++){
		if (c[k] == -1) break;
	}
	if (k == 24){
		return winlose(c);
	}else{
		for (i = 0; i < 24; i++){
			for (j = 0; j < 24; j++){
				if (c[j] == i) break;
			}
			if (j == 24){
				t = turn(c);
				c[k] = i;
				//printc(c);
				if (t == dotbox(c)){
					c[k] = -1;
					return t;
				}
			}
		}
		return !turn(c);
	}
}
bool turn(int *c){
	int i, j;
	int sq[9] = {};
	bool turn = 0, turnflag = 0;

	for (i = 0; i < 24; i++){
		if (c[i] == -1) break;
		calsq(c[i], sq);
		for (j = 0; j < 9; j++){
			if (sq[j] == 4){
				sq[j]++;
				turnflag = 1;
			}
		}
		if (turnflag == 1){
			turn = !turn;
			turnflag = 0;
		}

		turn = !turn;
	}
	return turn;
}
void calq(int *c, bool *q){
	int i, j;
	int sq[9] = {};
	bool turn=0,turnflag=0;

	for (i = 0; i < 24; i++){
		calsq(c[i], sq);
		for (j = 0; j < 9; j++){
			if (sq[j] == 4){
				q[j] = turn;
				sq[j]++;
				turnflag = 1;
			}
		}
		if (turnflag == 1){
			turn = !turn;
			turnflag = 0;
		}

		turn = !turn;
	}
}
void calsq(int s, int *sq){
	if (s == 0 || s == 1 || s == 12 || s == 15)
		sq[0]++;
	if (s == 1 || s == 2 || s == 13 || s == 16)
		sq[1]++;
	if (s == 2 || s == 3 || s == 14 || s == 17)
		sq[2]++;
	if (s == 4 || s == 5 || s == 15 || s == 18)
		sq[3]++;
	if (s == 5 || s == 6 || s == 16 || s == 19)
		sq[4]++;
	if (s == 6 || s == 7 || s == 17 || s == 20)
		sq[5]++;
	if (s == 8 || s == 9 || s == 18 || s == 21)
		sq[6]++;
	if (s == 9 || s == 10 || s == 19 || s == 22)
		sq[7]++;
	if (s == 10 || s == 11 || s == 20 || s == 23)
		sq[8]++;
}
bool winlose(int *c){
	int i;
	bool q[9];
	calq(c, q);
	int sen=0, kou=0;
	for (i = 0; i < 9; i++){
		if (q[i] == 0)
			sen++;
		else
			kou++;
	}
	if (sen>kou)
		return 0;
	else
		return 1;
}
void printc(int *c){
	int i;
	for (i = 0; i < 24; i++){
		printf("%d,", c[i]);
	}
	printf("\n");
}

数学的帰納法はなぜ演繹法なのか

数学的帰納法はよく演繹法だと言われるけど、なぜなのかを私なりに考えてみました。
論理学では、帰納法の反対は演繹法となっています。つまり、数学の定義である数学的帰納法演繹法なはずです。でも、一つだけ気になる点があります。
よくある次の問題を見てみましょう。

\displaystyle\sum_{k=0}^n (2k+1)=(n+1)^2

これは数学的帰納法で証明できるけど、重要なのは右辺の式はすでに与えられていることです。普通、数学的帰納法を使いたいときは、まず右辺の式を予測しなければいけません。n=0のとき1、n=1のとき4、n=2のとき9、…と計算していって、あるときに「これは平方数の数列なんじゃないか」と気づきます。そうしてから、数学的帰納法を使います。つまり予測できないと、永遠に数学的帰納法で証明できません。でも、個々の結果から一般の式を予測するのは、帰納法と呼ばれています。果たして数学的帰納法演繹法帰納法、どっちなんでしょうか。
私の考えでは、数学的帰納法演繹法でもあり、帰納法でもあると思います。つまり、証明する部分を数学的帰納法と呼ぶなら、演繹法になり、予測して証明する二つを合わせて数学的帰納法と呼ぶなら、帰納法になるんだと思います。(演繹法帰納法が混ざった推論は帰納法になります。)
人の考え方は、矛盾したハイブリッドのエンジンで動いてるのかもしれません。

およそπ

円周率およそ3というネタでうごメモに一度作品を投稿したことがある。

円周率およそ3、評定平均およそ3、お金で買えない天才肌、買えるものは親の金で

というものだった。円周率およそ3がずいぶん昔にもてはやされたが、今考えると円周率を3.14で計算するより高等的だと思う。そもそも円周率は無限に続くということをどうしても小学生に理解させるのは難しい。私が小学生の頃は実際に身の回りの丸いものを測って円周率を求めたが、今でもそうして教えていると思う。そして円周率をおよそ3.14で計算するにつれてそれが定数であることに気づき、およそ3で計算するにつれてそれが重要な数だとわかり、最終的におよそπで計算するのだと思う。余談だが、工業技術基礎を学んでたときは、円は直径で表していた。たぶん半径ではなく直径を測るのが普通だからだと思う。