ピタゴラス数生成

直角三角形とピタゴラスの定理
を参考に、ピタゴラス数を小さい順*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:三つの数字のうち一番小さい数字が基準