ピタゴラス数生成
直角三角形とピタゴラスの定理
を参考に、ピタゴラス数を小さい順*1に生成してみた。
Project Eulerぐらいにしか使い道がなさそうだけど。
#include <iostream> #include <queue> #include <boost/numeric/ublas/matrix.hpp> #include <boost/numeric/ublas/io.hpp> #include <boost/numeric/ublas/vector.hpp> using namespace boost::numeric::ublas; void output_pythagoras_numbers(int count){ struct f : std::binary_function<vector<int>,vector<int>,bool> { bool operator()(const vector<int>& lhs, const vector<int>& rhs) const{ return std::min(lhs(0),std::min(lhs(1),lhs(2))) > std::min(rhs(0),std::min(rhs(1),rhs(2))); } }; matrix<int> magic(3,3); magic(0,0) = magic(1,1) = -1; magic(0,1) = magic(1,0) = magic(2,0) = magic(2,1) = -2; magic(0,2) = magic(1,2) = 2; magic(2,2) = 3; std::priority_queue<vector<int>, std::vector<vector<int> > , f > q; vector<int> v(3); v(0) = 3, v(1) = 4, v(2) = 5; q.push(v); for(int i=1;i<=count;++i){ vector<int> v = q.top(); q.pop(); std::cout << i << " : " << v << std::endl; v(0) = -v(0); q.push(prod(magic,v)); v(1) = -v(1); q.push(prod(magic,v)); v(0) = -v(0); q.push(prod(magic,v)); } } int main(int,char**) { output_pythagoras_numbers(1000); }
*1:三つの数字のうち一番小さい数字が基準