InfInt InfInt::operator*(ELEM_TYPE rhs) const {//PROFILED_SCOPE InfInt result = *this; ELEM_TYPE factor = rhs < 0 ? -rhs : rhs; multiplyByDigit(factor, result.val); result.correct(); result.pos = (result.val.size() == 1 && result.val[0] == 0) ? true : (pos == (rhs >= 0)); return result; }
InfInt InfInt::operator-(const InfInt& rhs) const {//PROFILED_SCOPE InfInt result; result.val.resize(val.size() > rhs.val.size() ? val.size() : rhs.val.size(), 0); for (size_t i = 0; i < val.size() || i < rhs.val.size(); ++i) { result.val[i] = (i < val.size() ? (pos ? val[i] : -val[i]) : 0) - (i < rhs.val.size() ? (rhs.pos ? rhs.val[i] : -rhs.val[i]) : 0); } result.correct(); return result; }
InfInt InfInt::operator*(const InfInt& rhs) const {//PROFILED_SCOPE InfInt result; result.val.resize(val.size() + rhs.val.size(), 0); PRODUCT_TYPE carry = 0; size_t digit = 0; for (;; ++digit) {//PROFILED_SCOPE //result.val[digit] = (ELEM_TYPE) (carry % BASE); //carry /= BASE; PRODUCT_TYPE oldcarry = carry; carry /= BASE; result.val[digit] = (ELEM_TYPE)(oldcarry - carry * BASE); bool found = false; for (size_t i = digit < rhs.val.size() ? 0 : digit - rhs.val.size() + 1; i < val.size() && i <= digit; ++i) {//PROFILED_SCOPE PRODUCT_TYPE pval = result.val[digit] + val[i] * (PRODUCT_TYPE)rhs.val[digit - i]; if (pval >= BASE || pval <= -BASE) {//PROFILED_SCOPE //carry += pval / BASE; //pval %= BASE; PRODUCT_TYPE quot = pval / BASE; carry += quot; pval -= quot * BASE; } result.val[digit] = (ELEM_TYPE)pval; found = true; } if (!found) {//PROFILED_SCOPE break; } } for (; carry > 0; ++digit) {//PROFILED_SCOPE result.val[digit] = (ELEM_TYPE)(carry % BASE); carry /= BASE; } result.correct(); result.pos = (result.val.size() == 1 && result.val[0] == 0) ? true : (pos == rhs.pos); return result; }