C++でpascal

まさか、これではありませんが、
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.8.2.html

パスカルの三角形が、四角錐だったらどうなるのか気になったので。。。

#include <iostream>
#include <vector>
#include <pstade/oven/foreach.hpp>
#include <pstade/oven/counting.hpp>

typedef std::vector<std::vector<unsigned long long>> Field;

unsigned long long pow_(unsigned long long n, long long e) {
	if( e >= 1 ) 	{ return n * pow_(n, e-1); }
	else 			{ return 1; }
}

int pascal(const Field& prev)
{
	using namespace pstade::oven;
	
	Field	field;
	field.resize(prev.size()+1);
	PSTADE_OVEN_FOREACH(f, field) { f.resize(prev[0].size()+1); }
	
	PSTADE_OVEN_FOREACH(y, counting(0, prev.size())) {
		PSTADE_OVEN_FOREACH(x, counting(0, prev[0].size())) {
			unsigned long long n = prev[y][x];
			field[y][x] 	+= n;
			field[y][x+1] 	+= n;
			field[y+1][x]	+= n;
			field[y+1][x+1]	+= n;
		}
	}
	
	if(pow_(4, prev.size()) < pow_(4, std::max((size_t)1, prev.size())-1)) {
		std::cout << "overflow!" << std::endl;
		return 0;
	}
	
	std::cout << "[" << pow_(4, prev.size()) << "]" << std::endl;
	PSTADE_OVEN_FOREACH(f, field) {
		PSTADE_OVEN_FOREACH(ff, f) {
			std::cout << ff << "\t";
		}
		std::cout << std::endl;
	}
	
	pascal(field);
}

int main()
{
	Field f(1);
	f[0].resize(1);
	f[0][0] = 1;
	std::cout << "[1]" << std::endl;
	std::cout << 1 << std::endl;
	
	pascal(f);
	
	return 0;
}

出力結果。

[1]
1
[4]
1	1	
1	1	
[16]
1	2	1	
2	4	2	
1	2	1	
[64]
1	3	3	1	
3	9	9	3	
3	9	9	3	
1	3	3	1	
[256]
1	4	6	4	1	
4	16	24	16	4	
6	24	36	24	6	
4	16	24	16	4	
1	4	6	4	1	
[1024]
1	5	10	10	5	1	
5	25	50	50	25	5	
10	50	100	100	50	10	
10	50	100	100	50	10	
5	25	50	50	25	5	
1	5	10	10	5	1	
[4096]
1	6	15	20	15	6	1	
6	36	90	120	90	36	6	
15	90	225	300	225	90	15	
20	120	300	400	300	120	20	
15	90	225	300	225	90	15	
6	36	90	120	90	36	6	
1	6	15	20	15	6	1	
[16384]
1	7	21	35	35	21	7	1	
7	49	147	245	245	147	49	7	
21	147	441	735	735	441	147	21	
35	245	735	1225	1225	735	245	35	
35	245	735	1225	1225	735	245	35	
21	147	441	735	735	441	147	21	
7	49	147	245	245	147	49	7	
1	7	21	35	35	21	7	1	
[65536]
1	8	28	56	70	56	28	8	1	
8	64	224	448	560	448	224	64	8	
28	224	784	1568	1960	1568	784	224	28	
56	448	1568	3136	3920	3136	1568	448	56	
70	560	1960	3920	4900	3920	1960	560	70	
56	448	1568	3136	3920	3136	1568	448	56	
28	224	784	1568	1960	1568	784	224	28	
8	64	224	448	560	448	224	64	8	
1	8	28	56	70	56	28	8	1	
[262144]
1	9	36	84	126	126	84	36	9	1	
9	81	324	756	1134	1134	756	324	81	9	
36	324	1296	3024	4536	4536	3024	1296	324	36	
84	756	3024	7056	10584	10584	7056	3024	756	84	
126	1134	4536	10584	15876	15876	10584	4536	1134	126	
126	1134	4536	10584	15876	15876	10584	4536	1134	126	
84	756	3024	7056	10584	10584	7056	3024	756	84	
36	324	1296	3024	4536	4536	3024	1296	324	36	
9	81	324	756	1134	1134	756	324	81	9	
1	9	36	84	126	126	84	36	9	1	
[1048576]
1	10	45	120	210	252	210	120	45	10	1	
10	100	450	1200	2100	2520	2100	1200	450	100	10	
45	450	2025	5400	9450	11340	9450	5400	2025	450	45	
120	1200	5400	14400	25200	30240	25200	14400	5400	1200	120	
210	2100	9450	25200	44100	52920	44100	25200	9450	2100	210	
252	2520	11340	30240	52920	63504	52920	30240	11340	2520	252	
210	2100	9450	25200	44100	52920	44100	25200	9450	2100	210	
120	1200	5400	14400	25200	30240	25200	14400	5400	1200	120	
45	450	2025	5400	9450	11340	9450	5400	2025	450	45	
10	100	450	1200	2100	2520	2100	1200	450	100	10	
1	10	45	120	210	252	210	120	45	10	1
...
[]が分母で、これがオーバフローするまで計算してくれます
64bit符号なし整数なら
[4611686018427387904]
まで計算してくれます。

なんだか九九の表みたいになりましたとさ。
これに面白い数学的性質があったら教えてくださいエロい人。

(ところで、この記事は以前に投稿したけど、間違って消してしまったので再投稿です。。。)