/*!
@author d金魚
@since 2004/1/2
@note
*/
#ifndef __dkutil_Calculate__h__
#define __dkutil_Calculate__h__


namespace dkutil{

/*
多倍長計算研究中

template<size_t size=64>
class InfiniteInteger{
public:
	typedef InfiniteInteger<size> self_type;
protected:
	boost::array<size> mA;
public:
	InfiniteInteger(){
		mA.clear();
	}
	virtual ~InfiniteInteger(){
	}
	self_type &operator+(const self_type &se){


	}


};
*/



///@return 引数に０がある場合は０を返す。
/// 最大公約数（Greatest Common Divisor）を返す。
/// 引数に０がある場合は０を返す。
inline int gcd( int m, int n )
{
	// 引数に０がある場合は０を返す
	if ( ( 0 == m ) || ( 0 == n ) )
		return 0;
	
	// ユークリッドの互除法
	while( m != n )
	{
		if ( m > n ) m = m - n;
		else         n = n - m;
	}
	return m;
}//gcd

///@return 引数に０がある場合は０を返す。
/// 最小公倍数（Least Common Multiple）を返す。
/// 引数に０がある場合は０を返す。
inline int lcm( int m, int n )
{
	// 引数に０がある場合は０を返す
	if ( ( 0 == m ) || ( 0 == n ) )
		return 0;
	
	return ((m / gcd(m, n)) * n); // lcm = m * n / gcd(m,n)
}//lcm

}//end of dkutil namespace







#endif



