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] まで計算してくれます。
なんだか九九の表みたいになりましたとさ。
これに面白い数学的性質があったら教えてくださいエロい人。
(ところで、この記事は以前に投稿したけど、間違って消してしまったので再投稿です。。。)