35#define SC_BIG_MAX(LEFT,RIGHT) ( (LEFT) > (RIGHT) ? (LEFT) : (RIGHT) )
36#define SC_BIG_MIN(LEFT,RIGHT) ( (LEFT) < (RIGHT) ? (LEFT) : (RIGHT) )
54 for (
int digit_i = source_hod; digit_i >= 0; --digit_i ) {
55 std::cout << std::hex << source_p[digit_i] <<
" ";
57 std::cout << std::dec << std::endl;
73template<
typename RESULT,
typename LEFT,
typename RIGHT>
76sc_big_add( RESULT& result,
const LEFT& left,
const RIGHT& right )
78 if ( 0 == RESULT::HOD ) {
79 *result.get_digits() = *left.get_digits() + *right.get_digits();
81 else if ( 1 == RESULT::HOD ) {
82 const sc_digit* left_p = left.get_digits();
84 sc_digit* result_p = result.get_digits();
86 const sc_digit* right_p = right.get_digits();
88 if ( 1 == LEFT::HOD ) {
91 else if ( LEFT::SIGNED ) {
92 left_value = (
int64)(
int)*left_p;
95 left_value = (
int64)*left_p;
97 if ( 1 == RIGHT::HOD ) {
100 else if ( RIGHT::SIGNED ) {
101 right_value = (
int64)(
int)*right_p;
104 right_value = (
int64)*right_p;
106 result_value = left_value + right_value;
110 else if ( (
int)LEFT::HOD >= (int)RIGHT::HOD ) {
112 RIGHT::HOD, right.get_digits(),
113 RESULT::HOD, result.get_digits() );
117 LEFT::HOD, left.get_digits(),
118 RESULT::HOD, result.get_digits() );
122template<
int WL,
int WR>
133template<
int WL,
int WR>
143template<
int WL,
int WR>
154template<
int WL,
int WR>
178template<
typename RESULT,
typename LEFT,
typename RIGHT>
181sc_big_and( RESULT& result,
const LEFT& left,
const RIGHT& right )
183 if ( 0 == RESULT::HOD ) {
184 *result.get_digits() = *left.get_digits() & *right.get_digits();
186 else if ( 1 == RESULT::HOD ) {
187 const sc_digit* left_p = left.get_digits();
189 sc_digit* result_p = result.get_digits();
191 const sc_digit* right_p = right.get_digits();
193 if ( 1 == LEFT::HOD ) {
196 else if ( LEFT::SIGNED ) {
197 left_value = (
int64)(
int)*left_p;
200 left_value = (
int64)*left_p;
202 if ( 1 == RIGHT::HOD ) {
205 else if ( RIGHT::SIGNED ) {
206 right_value = (
int64)(
int)*right_p;
209 right_value = (
int64)*right_p;
211 result_value = left_value & right_value;
212 *result_p = result_value;
215 else if ( (
const int)LEFT::HOD >= (
const int)RIGHT::HOD ) {
216 vector_and<LEFT::SIGNED,RIGHT::SIGNED>( LEFT::HOD,
220 result.get_digits() );
223 vector_and<RIGHT::SIGNED,LEFT::SIGNED>( RIGHT::HOD,
227 result.get_digits() );
231template<
int WL,
int WR>
241template<
int WL,
int WR>
251template<
int WL,
int WR>
261template<
int WL,
int WR>
284template<
typename RESULT,
typename LEFT,
typename RIGHT>
287sc_big_or( RESULT& result,
const LEFT& left,
const RIGHT& right )
289 if ( 0 == RESULT::HOD ) {
290 *result.get_digits() = *left.get_digits() | *right.get_digits();
292 else if ( 1 == RESULT::HOD ) {
293 const sc_digit* left_p = left.get_digits();
295 sc_digit* result_p = result.get_digits();
297 const sc_digit* right_p = right.get_digits();
299 if ( 1 == LEFT::HOD ) {
302 else if ( LEFT::SIGNED ) {
303 left_value = (
int64)(
int)*left_p;
306 left_value = (
int64)*left_p;
308 if ( 1 == RIGHT::HOD ) {
311 else if ( RIGHT::SIGNED ) {
312 right_value = (
int64)(
int)*right_p;
315 right_value = (
int64)*right_p;
317 result_value = left_value | right_value;
318 *result_p = result_value;
321 else if ( (
const int)LEFT::HOD >= (
const int)RIGHT::HOD ) {
322 vector_or<LEFT::SIGNED,RIGHT::SIGNED>( LEFT::HOD,
326 result.get_digits() );
329 vector_or<RIGHT::SIGNED,LEFT::SIGNED>( RIGHT::HOD,
333 result.get_digits() );
337template<
int WL,
int WR>
347template<
int WL,
int WR>
357template<
int WL,
int WR>
367template<
int WL,
int WR>
390template<
typename RESULT,
typename LEFT,
typename RIGHT>
393sc_big_xor( RESULT& result,
const LEFT& left,
const RIGHT& right )
395 if ( 0 == RESULT::HOD ) {
396 *result.get_digits() = *left.get_digits() ^ *right.get_digits();
398 else if ( 1 == RESULT::HOD ) {
399 const sc_digit* left_p = left.get_digits();
401 sc_digit* result_p = result.get_digits();
403 const sc_digit* right_p = right.get_digits();
405 if ( 1 == LEFT::HOD ) {
408 else if ( LEFT::SIGNED ) {
409 left_value = (
int64)(
int)*left_p;
412 left_value = (
int64)*left_p;
414 if ( 1 == RIGHT::HOD ) {
417 else if ( RIGHT::SIGNED ) {
418 right_value = (
int64)(
int)*right_p;
421 right_value = (
int64)*right_p;
423 result_value = left_value ^ right_value;
424 *result_p = result_value;
427 else if ( (
const int)LEFT::HOD >= (
const int)RIGHT::HOD ) {
428 vector_xor<LEFT::SIGNED,RIGHT::SIGNED>( LEFT::HOD,
432 result.get_digits() );
435 vector_xor<RIGHT::SIGNED,LEFT::SIGNED>( RIGHT::HOD,
439 result.get_digits() );
444template<
int WL,
int WR>
454template<
int WL,
int WR>
464template<
int WL,
int WR>
474template<
int WL,
int WR>
497template<
typename RESULT,
typename LEFT,
typename RIGHT>
504 if ( 0 == RESULT::HOD ) {
505 typename LEFT::HOD_TYPE left_value = *left.get_digits();
506 typename RIGHT::HOD_TYPE right_value = *right.get_digits();
507 if ( 0 != right_value ) {
508 *result.get_digits() = left_value / right_value;
515 else if ( 1 == RESULT::HOD && 2 > LEFT::HOD && 2 > RIGHT::HOD ) {
516 const sc_digit* left_p = left.get_digits();
518 sc_digit* result_p = result.get_digits();
520 const sc_digit* right_p = right.get_digits();
522 if ( 1 == LEFT::HOD ) {
526 left_value = (
typename LEFT::HOD_TYPE)*left_p;
528 if ( 1 == RIGHT::HOD ) {
532 right_value = (
typename RIGHT::HOD_TYPE)*right_p;
534 if ( right_value != 0 ) {
535 result_value = left_value / right_value;
545 ok = vector_divide<LEFT::SIGNED,RIGHT::SIGNED>( LEFT::DIGITS_N,
556 "division by zero detected" );
560template<
int WL,
int WR>
570template<
int WL,
int WR>
580template<
int WL,
int WR>
590template<
int WL,
int WR>
613template<
typename RESULT,
typename LEFT,
typename RIGHT>
620 if ( 0 == RESULT::HOD ) {
621 typename LEFT::HOD_TYPE left_value = *left.get_digits();
622 typename RIGHT::HOD_TYPE right_value = *right.get_digits();
623 if ( right_value != 0 ) {
624 *result.get_digits() = left_value % right_value;
631 else if ( 1 == RESULT::HOD && 2 > LEFT::HOD && 2 > RIGHT::HOD ) {
632 const sc_digit* left_p = left.get_digits();
634 sc_digit* result_p = result.get_digits();
636 const sc_digit* right_p = right.get_digits();
638 if ( 1 == LEFT::HOD ) {
642 left_value = (
typename LEFT::HOD_TYPE)*left_p;
644 if ( 1 == RIGHT::HOD ) {
648 right_value = (
typename RIGHT::HOD_TYPE)*right_p;
650 if ( 0 != right_value ) {
651 result_value = left_value % right_value;
662 ok = vector_divide<LEFT::SIGNED,RIGHT::SIGNED>( LEFT::DIGITS_N,
669 result.get_digits() );
673 "division by zero detected" );
677template<
int WL,
int WR>
687template<
int WL,
int WR>
697template<
int WL,
int WR>
707template<
int WL,
int WR>
731template<
typename RESULT,
typename LEFT,
typename RIGHT>
736 if ( 0 == RESULT::HOD ) {
737 *result.get_digits() = *left.get_digits() * *right.get_digits();
739 else if ( 1 == RESULT::HOD ) {
740 const sc_digit* left_p = left.get_digits();
742 sc_digit* result_p = result.get_digits();
744 const sc_digit* right_p = right.get_digits();
746 if ( 1 == LEFT::HOD ) {
749 else if ( LEFT::SIGNED ) {
750 left_value = (
int64)(
int)*left_p;
753 left_value = (
int64)*left_p;
755 if ( 1 == RIGHT::HOD ) {
758 else if ( RIGHT::SIGNED ) {
759 right_value = (
int64)(
int)*right_p;
762 right_value = (
int64)*right_p;
764 result_value = left_value * right_value;
769 RIGHT::HOD, right.get_digits(),
770 RESULT::HOD, result.get_digits() );
773template<
int WL,
int WR>
783template<
int WL,
int WR>
793template<
int WL,
int WR>
803template<
int WL,
int WR>
826template<
typename RESULT,
typename LEFT,
typename RIGHT>
831 if ( 0 == RESULT::HOD ) {
832 *result.get_digits() = *left.get_digits() - *right.get_digits();
834 else if ( 1 == RESULT::HOD ) {
835 const sc_digit* left_p = left.get_digits();
837 sc_digit* result_p = result.get_digits();
839 const sc_digit* right_p = right.get_digits();
841 if ( 1 == LEFT::HOD ) {
844 else if ( LEFT::SIGNED ) {
845 left_value = (
int64)(
int)*left_p;
848 left_value = (
int64)*left_p;
850 if ( 1 == RIGHT::HOD ) {
853 else if ( RIGHT::SIGNED ) {
854 right_value = (
int64)(
int)*right_p;
857 right_value = (
int64)*right_p;
859 result_value = left_value - right_value;
863 else if ( (
const int)LEFT::HOD > (
const int)RIGHT::HOD ) {
869 result.get_digits() );
877 result.get_digits() );
881template<
int WL,
int WR>
891template<
int WL,
int WR>
901template<
int WL,
int WR>
911template<
int WL,
int WR>
#define SC_REPORT_ERROR(msg_type, msg)
const char SC_ID_OPERATION_FAILED_[]
void sc_big_or(RESULT &result, const LEFT &left, const RIGHT &right)
void vector_subtract_shorter(const int longer_hod, const sc_digit *longer_p, const int shorter_hod, const sc_digit *shorter_p, const int result_hod, sc_digit *result_p)
sc_bit operator&(const sc_bit &a, const sc_bit &b)
sc_bit operator^(const sc_bit &a, const sc_bit &b)
const sc_big_op_info< WL, true, WR, true >::add_result operator+(const sc_bigint< WL > &left, const sc_bigint< WR > &right)
void sc_big_and(RESULT &result, const LEFT &left, const RIGHT &right)
void vector_add(const int longer_hod, const sc_digit *longer_p, const int shorter_hod, const sc_digit *shorter_p, const int result_hod, sc_digit *result_p)
sc_fxval operator/(const sc_fxnum &a, const sc_fxnum &b)
const sc_big_op_info< WL, true, WR, true >::mod_result operator%(const sc_bigint< WL > &numer, const sc_bigint< WR > &denom)
void sc_big_add(RESULT &result, const LEFT &left, const RIGHT &right)
const sc_big_op_info< WL, true, WR, true >::sub_result operator-(const sc_bigint< WL > &left, const sc_bigint< WR > &right)
void sc_big_modulo(RESULT &result, const LEFT &left, const RIGHT &right)
void vector_dump(int source_hod, sc_digit *source_p)
void sc_big_divide(RESULT &result, const LEFT &left, const RIGHT &right)
void vector_multiply(int left_hod, const sc_digit *left_p, int right_hod, const sc_digit *right_p, int result_hod, sc_digit *result_p)
void sc_big_xor(RESULT &result, const LEFT &left, const RIGHT &right)
void sc_big_multiply(RESULT &result, const LEFT &left, const RIGHT &right)
const sc_big_op_info< WL, true, WR, true >::mul_result operator*(const sc_bigint< WL > &left, const sc_bigint< WR > &right)
void sc_big_subtract(RESULT &result, const LEFT &left, const RIGHT &right)
sc_bit operator|(const sc_bit &a, const sc_bit &b)
void vector_subtract_longer(const int longer_hod, const sc_digit *longer_p, const int shorter_hod, const sc_digit *shorter_p, const int result_hod, sc_digit *result_p)
sc_big_op_type< sub_bits, signed_result >::top_type sub_result
sc_big_op_type< mod_bits, signed_result >::top_type mod_result
sc_big_op_type< div_bits, signed_result >::top_type div_result
sc_big_op_type< add_bits, signed_result >::top_type add_result
sc_big_op_type< mul_bits, signed_result >::top_type mul_result
sc_big_op_type< bit_bits, signed_result >::top_type bit_result