33 #ifndef __INCLUDE_MIST_INTEGER_H__
34 #define __INCLUDE_MIST_INTEGER_H__
37 #ifndef __INCLUDE_MIST_CONF_H__
58 template <
unsigned int __256_N__ >
62 typedef size_t size_type;
63 typedef ptrdiff_t difference_type;
64 typedef unsigned char value_type;
67 _MIST_CONST( difference_type, BASE, 256 );
68 _MIST_CONST( size_type, DATA_NUM, __256_N__ );
73 value_type data_[ DATA_NUM ];
76 integer( ) : length_( 0 ), sign_( true )
78 memset( data_, 0,
sizeof( value_type ) * DATA_NUM );
81 integer( difference_type v ) : length_( 0 ), sign_( true )
83 memset( data_, 0,
sizeof( value_type ) * DATA_NUM );
94 data_[ length_++ ] =
static_cast< value_type
>( v % BASE );
96 }
while( v > 0 && length_ < DATA_NUM );
100 integer(
const integer &v ) : length_( v.length_ ), sign_( v.sign_ )
102 memcpy( data_, v.data_,
sizeof( value_type ) * DATA_NUM );
105 integer( const ::std::string &str ) : length_( 0 ), sign_( true )
107 operator =( read( str ) );
110 const integer &operator =(
const integer &a )
116 memcpy( data_, a.data_,
sizeof( value_type ) * DATA_NUM );
133 return (
operator =( a ) );
135 else if( a.length_ == 0 )
141 if( sign_ == a.sign_ )
147 sign_ = asub( *
this, a ) ? sign_ : !sign_;
161 else if( a.length_ == 0 )
167 if( sign_ == a.sign_ )
169 sign_ = asub( *
this, a ) ? sign_ : !sign_;
181 if( length_ * a.length_ == 0 )
183 return(
operator =( integer( 0 ) ) );
185 else if( length_ == 1 )
187 difference_type t = sign_ ? data_[ 0 ] : -data_[ 0 ];
188 return(
operator =( integer( a ) *= t ) );
190 else if( a.length_ == 1 )
192 difference_type t = a.sign_ ? a.data_[ 0 ] : -a.data_[ 0 ];
193 return(
operator *=( t ) );
196 if( length_ + a.length_ > DATA_NUM )
199 std::cerr <<
"overflow!!" << std::endl;
203 if( a.length_ > length_ )
205 return(
operator =( integer( a ) *= *
this ) );
209 x.sign_ = sign_ == a.sign_;
212 for( size_type j = 0 ; j < a.length_ ; j++ )
214 difference_type u = a.data_[ j ];
217 difference_type t = 0;
218 size_type imax = length_ + j - 1;
219 for( i = j ; i <= imax ; i++ )
221 t += ( x.data_[ i ] + u * data_[ i - j ] );
222 x.data_[ i ] =
static_cast< value_type
>( t % BASE );
228 x.data_[ i++ ] =
static_cast< value_type
>( t - BASE );
229 t = x.data_[ i ] + 1;
231 x.data_[ i ] =
static_cast< value_type
>( t );
234 x.length_ = length_ + a.length_;
235 while( x.data_[ x.length_ - 1 ] == 0 )
239 return(
operator =( x ) );
244 if( length_ == 0 || n == 0 )
246 return(
operator =( integer( 0 ) ) );
249 else if( n >= BASE || -n >= BASE )
251 return(
operator *=( integer( n ) ) );
260 difference_type t = 0;
261 for( size_type i = 0 ; i < length_ ; i++ )
264 data_[ i ] =
static_cast< value_type
>( t % BASE );
271 if( length_ > DATA_NUM )
274 std::cerr <<
"overflow!!" << std::endl;
278 data_[ length_ - 1 ] =
static_cast< value_type
>( t % BASE );
289 return(
operator =( integer( 0 ) ) );
291 else if( a.length_ == 0 )
294 std::cerr <<
"zero division!!" << std::endl;
299 value_type t = a.sign_ ? a.data_[ 0 ] : -a.data_[ 0 ];
300 return(
operator /=( t ) );
303 int c = acmp( *
this, a );
307 return(
operator =( integer( 0 ) ) );
312 return(
operator =( integer( sign_ == a.sign_ ? 1 : -1 ) ) );
315 if( length_ == DATA_NUM )
318 std::cerr <<
"too large to divide!!" << std::endl;
323 integer aa( *
this ), bb( a );
324 difference_type d = BASE / ( a.data_[ a.length_ - 1 ] + 1 ), x;
325 q.sign_ = sign_ == a.sign_;
332 q.length_ = aa.length_ - bb.length_ + 1;
333 if( ( x = aa.data_[ aa.length_ - 1 ] / bb.data_[ bb.length_ - 1 ] ) == 0 )
336 x = ( aa.data_[ aa.length_ - 1 ] * BASE + aa.data_[ aa.length_ - 2 ] ) / bb.data_[ bb.length_ - 1 ];
341 difference_type ql = q.length_;
347 shift_up( w, ql - 1 );
348 if( acmp( w, aa ) <= 0 )
354 q.data_[ ql-- - 1 ] =
static_cast< value_type
>( x );
356 if( aa.length_ == 0 || ql == 0 )
360 x = ( aa.data_[ aa.length_ - 1 ] * BASE + aa.data_[ aa.length_ - 2 ] ) / bb.data_[ bb.length_ - 1 ];
362 if( q.data_[ q.length_ - 1 ] == 0 )
366 return(
operator =( q ) );
378 std::cerr <<
"zero division!!" << std::endl;
382 else if( n >= BASE || -n >= BASE )
384 return(
operator /=( integer( n ) ) );
393 difference_type t = 0;
394 for( difference_type i = length_ - 1 ; i >= 0 ; i-- )
396 t = t * BASE + data_[ i ];
397 data_[ i ] =
static_cast< value_type
>( t / n );
400 if( data_[ length_ - 1 ] == 0 )
407 const integer &operator %=(
const integer &a )
409 return(
operator =( *
this - ( *
this / a ) * a ) );
412 const integer &operator %=( difference_type n )
414 return(
operator =( *
this - ( *
this / n ) * n ) );
418 const integer &operator &=(
const integer &a )
420 for( size_type i = 0 ; i < DATA_NUM ; i++ )
422 data_[ i ] &= a.data_[ i ];
425 for( difference_type j = DATA_NUM - 1 ; j >= 0 ; j-- )
427 if( data_[ length_ - 1 ] != 0 )
436 const integer &operator |=(
const integer &a )
438 for( size_type i = 0 ; i < DATA_NUM ; i++ )
440 data_[ i ] |= a.data_[ i ];
442 length_ = length_ > a.length_ ? length_ : a.length_;
446 const integer &operator ^=(
const integer &a )
448 for( size_type i = 0 ; i < DATA_NUM ; i++ )
450 data_[ i ] ^= a.data_[ i ];
453 for( difference_type j = DATA_NUM - 1 ; j >= 0 ; j-- )
455 if( data_[ length_ - 1 ] != 0 )
464 integer &operator ++( )
470 const integer operator ++(
int )
472 integer old_val( *
this );
477 integer &operator --( )
483 const integer operator --(
int )
485 integer old_val( *
this );
491 bool operator ==(
const integer &a )
const {
return( sign_ == a.sign_ && acmp( *
this, a ) == 0 ); }
492 bool operator !=(
const integer &a )
const {
return( !( *
this == a ) ); }
493 bool operator < (
const integer &a )
const {
return( !( *
this >= a ) ); }
494 bool operator <=(
const integer &a )
const {
return( a >= *
this ); }
495 bool operator > (
const integer &a )
const {
return( a < *
this ); }
496 bool operator >=(
const integer &a )
const
498 if( sign_ && !a.sign_ )
502 else if( !sign_ && a.sign_ )
508 bool cmp = acmp( *
this, a ) >= 0;
509 return( sign_ ? cmp : !cmp );
513 const ::std::string to_string( )
const
519 else if( length_ == 1 )
522 sprintf( tmp,
"%d", data_[ 0 ] );
523 return( ( sign_ ?
"" :
"-" ) + ::std::string( tmp ) );
527 ::std::string s =
"";
528 integer dmy( *
this );
529 while( dmy.length_ != 0 )
531 difference_type t = 0;
532 for( difference_type i = dmy.length_ - 1 ; i >= 0 ; i-- )
534 t = t * BASE + dmy.data_[ i ];
535 dmy.data_[ i ] =
static_cast< value_type
>( t / 10 );
538 if( dmy.data_[ dmy.length_ - 1 ] == 0 )
542 s =
static_cast< char >(
'0' + t ) + s;
544 return( ( sign_ ?
"" :
"-" ) + s );
554 else if( length_ > 4 )
557 std::cerr <<
"overflow!!" << std::endl;
562 return( ( sign_ ? 1 : -1 ) * ( data_[ 0 ] + BASE * ( data_[ 1 ] + BASE * ( data_[ 2 ] + BASE * data_[ 3 ] ) ) ) );
572 else if( length_ > 4 )
575 std::cerr <<
"overflow!!" << std::endl;
580 return( data_[ 0 ] + BASE * ( data_[ 1 ] + BASE * ( data_[ 2 ] + BASE * data_[ 3 ] ) ) );
585 static int acmp(
const integer &a,
const integer &b )
587 if( a.length_ > b.length_ )
591 else if( b.length_ > a.length_ )
597 for( difference_type i = a.length_ - 1 ; i >= 0 ; i-- )
599 if( a.data_[ i ] < b.data_[ i ] )
603 else if( a.data_[ i ] > b.data_[ i ] )
612 static void aadd( integer &a0,
const integer &b0 )
614 const integer *pa = a0.length_ >= b0.length_ ? &a0 : &b0;
615 const integer *pb = a0.length_ >= b0.length_ ? &b0 : &a0;
617 const integer &a = *pa;
618 const integer &b = *pb;
621 difference_type t = 0;
623 for( i = 0 ; i < b.length_ ; i++ )
625 t += a.data_[ i ] + b.data_[ i ];
629 a0.data_[ i ] =
static_cast< value_type
>( t );
634 a0.data_[ i ] =
static_cast< value_type
>( t - BASE );
639 while( i < a.length_ && t != 0 )
645 a0.data_[ i ] =
static_cast< value_type
>( t );
650 a0.data_[ i ] =
static_cast< value_type
>( t - BASE );
657 for( ; i < a.length_ ; i++ )
659 a0.data_[ i ] = a.data_[ i ];
664 a0.length_ = a.length_;
668 if( a.length_ <= DATA_NUM )
670 a0.length_ = a.length_ + 1;
675 std::cerr <<
"overflow!!" << std::endl;
680 static bool asub( integer &a0,
const integer &b0 )
682 int c = acmp( a0, b0 );
689 const integer *pa = c >= 0 ? &a0 : &b0;
690 const integer *pb = c >= 0 ? &b0 : &a0;
692 const integer &a = *pa;
693 const integer &b = *pb;
696 difference_type t = 0;
698 for( i = 0 ; i < b.length_ ; i++ )
700 t = a.data_[ i ] - b.data_[ i ] - t;
704 a0.data_[ i ] =
static_cast< value_type
>( t );
709 a0.data_[ i ] =
static_cast< value_type
>( t + BASE );
714 while( i < a.length_ && t != 0 )
716 t = a.data_[ i ] - t;
720 a0.data_[ i ] =
static_cast< value_type
>( t );
725 a0.data_[ i ] =
static_cast< value_type
>( t + BASE );
732 for( ; i < a.length_ ; i++ )
734 a0.data_[ i ] = a.data_[ i ];
737 a0.length_ = a.length_;
739 while( a0.data_[ a0.length_ - 1 ] == 0 )
747 static void shift_up( integer &a, difference_type n )
749 if( a.length_ == 0 || n == 0 )
759 for( i = a.length_ - 1 ; i >= 0 ; i-- )
761 a.data_[ i + n ] = a.data_[ i ];
763 for( i = n - 1 ; i >= 0 ; i-- )
771 static void shift_down( integer &a, difference_type n )
773 difference_type len = a.length_;
774 if( a.length_ == 0 || n == 0 )
788 for( i = 0 ; i < len - n ; i++ )
790 a.data_[ i ] = a.data_[ i + n ];
792 for( ; i < len ; i++ )
800 static integer read( const ::std::string &str )
802 if( str.size( ) == 0 )
804 return( integer( 0 ) );
810 if( str[ 0 ] ==
'-' )
815 else if( str[ 0 ] ==
'+' )
820 if( str.size( ) - k < 10 )
822 return( integer( ::atoi( str.c_str( ) ) ) );
825 for( i = k ; i < str.size( ) ; i++ )
828 if(
'0' <= str[ i ] && str[ i ] <=
'9' )
837 ::std::string s = str.substr( k, i - k + 1 );
840 integer base( 100000000 ), b( 1 );
843 difference_type len = s.size( );
846 x += integer( ::atoi( ( s.substr( len - 8 ) ).c_str( ) ) ) * b;
848 s = s.substr( 0, len - 8 );
852 x += integer( ::atoi( s.c_str( ) ) ) * b;
863 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator +(
const integer< __256_N__ > &v1,
const integer< __256_N__ > &v2 ){
return( integer< __256_N__ >( v1 ) += v2 ); }
864 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator -(
const integer< __256_N__ > &v1,
const integer< __256_N__ > &v2 ){
return( integer< __256_N__ >( v1 ) -= v2 ); }
865 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator *(
const integer< __256_N__ > &v1,
const integer< __256_N__ > &v2 ){
return( integer< __256_N__ >( v1 ) *= v2 ); }
866 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator /(
const integer< __256_N__ > &v1,
const integer< __256_N__ > &v2 ){
return( integer< __256_N__ >( v1 ) /= v2 ); }
867 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator %(
const integer< __256_N__ > &v1,
const integer< __256_N__ > &v2 ){
return( integer< __256_N__ >( v1 ) %= v2 ); }
868 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator |(
const integer< __256_N__ > &v1,
const integer< __256_N__ > &v2 ){
return( integer< __256_N__ >( v1 ) |= v2 ); }
869 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator &(
const integer< __256_N__ > &v1,
const integer< __256_N__ > &v2 ){
return( integer< __256_N__ >( v1 ) &= v2 ); }
870 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator ^(
const integer< __256_N__ > &v1,
const integer< __256_N__ > &v2 ){
return( integer< __256_N__ >( v1 ) ^= v2 ); }
872 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator *(
const integer< __256_N__ > &v1,
const typename integer< __256_N__ >::difference_type &v2 ){
return( integer< __256_N__ >( v1 ) *= v2 ); }
873 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator *(
const typename integer< __256_N__ >::difference_type &v1,
const integer< __256_N__ > &v2 ){
return( integer< __256_N__ >( v2 ) *= v1 ); }
874 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator /(
const integer< __256_N__ > &v1,
const typename integer< __256_N__ >::difference_type &v2 ){
return( integer< __256_N__ >( v1 ) /= v2 ); }
876 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator +(
const integer< __256_N__ > &v1,
const typename integer< __256_N__ >::difference_type &v2 ){
return( integer< __256_N__ >( v1 ) += v2 ); }
877 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator +(
const typename integer< __256_N__ >::difference_type &v1,
const integer< __256_N__ > &v2 ){
return( integer< __256_N__ >( v2 ) += v1 ); }
878 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator -(
const integer< __256_N__ > &v1,
const typename integer< __256_N__ >::difference_type &v2 ){
return( integer< __256_N__ >( v1 ) -= v2 ); }
879 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator -(
const typename integer< __256_N__ >::difference_type &v1,
const integer< __256_N__ > &v2 ){
return( integer< __256_N__ >( v1 ) -= v2 ); }
881 template <
unsigned int __256_N__ >
inline const integer< __256_N__ >
operator %(
const integer< __256_N__ > &v1,
const typename integer< __256_N__ >::difference_type &v2 ){
return( integer< __256_N__ >( v1 ) %= v2 ); }
884 template <
unsigned int __256_N__ >
885 inline std::ostream &operator <<( std::ostream &out, const integer< __256_N__ > &a )
887 out << a.to_string( );
896 #endif // __INCLUDE_MIST_INTEGER_H__