X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Farbint.cpp;h=8af84f951f39694ad309e9ab96cb28a693ddd39b;hp=12cf18db0ba74130252c3ce7d148097d54f58cbd;hb=dfd021b1505fb3924ae103d8aa27c6200d6ec3fd;hpb=68dfceb76cbc78e1e0dd529dd0c14be116528353 diff --git a/src/arbint.cpp b/src/arbint.cpp index 12cf18d..8af84f9 100644 --- a/src/arbint.cpp +++ b/src/arbint.cpp @@ -203,19 +203,28 @@ Arbint & Arbint::operator-=(const Arbint & sub) Arbint & Arbint::AddBasic(const Arbint & add) { + // Add any leading zeros to this number while (m_digits.size() < add.m_digits.size()) { - - Debug("Size is %u, add's size is %u", m_digits.size(), add.m_digits.size()); GrowDigit(0L); } //m_digits.resize(add.m_digits.size()+1,0L); digit_t carry = add_digits((digit_t*)m_digits.data(), (digit_t*)add.m_digits.data(), add.m_digits.size()); + + // This number had more digits but there is a carry left over + if (carry != 0L && m_digits.size() > add.m_digits.size()) + { + vector carry_digits(m_digits.size() - add.m_digits.size(), 0L); + carry_digits[0] = carry; + carry = add_digits((digit_t*)m_digits.data()+add.m_digits.size(), + (digit_t*)carry_digits.data(), m_digits.size()-add.m_digits.size()); + } + + // There is still a carry left over if (carry != 0L) { - Debug("Grow carry %lu", carry); GrowDigit(carry); } Shrink(); @@ -224,51 +233,36 @@ Arbint & Arbint::AddBasic(const Arbint & add) Arbint & Arbint::SubBasic(const Arbint & sub) { - bool fith = false; + // Add leading zeros while (sub.m_digits.size() > m_digits.size()) { - fith = false; GrowDigit(0L); } - if (fith) - { - Debug("START sub was %c%s, I am %c%s", SignChar(), sub.DigitStr().c_str(), SignChar(), DigitStr().c_str()); - } + // Do subtraction on digits digit_t borrow = sub_digits((digit_t*)m_digits.data(), (digit_t*)sub.m_digits.data(), sub.m_digits.size()); - - if (fith) + + // This number had more digits but there is a borrow left over + if (borrow != 0L && m_digits.size() > sub.m_digits.size()) { - Debug("SUB_DIGITS -> sub was %c%s, I am %c%s, borrow is %lu", SignChar(), sub.DigitStr().c_str(), SignChar(), DigitStr().c_str(), borrow); + vector borrow_digits(m_digits.size()-sub.m_digits.size(), 0L); + borrow_digits[0] = borrow; + borrow = sub_digits((digit_t*)m_digits.data()+sub.m_digits.size(), + (digit_t*)borrow_digits.data(), m_digits.size()-sub.m_digits.size()); } - - //TODO: Write ASM to do this bit? + + // borrow is still set => number is negative if (borrow != 0L) { - if (sub.m_digits.size() < m_digits.size()) - { - m_digits[m_digits.size()-1] -= borrow; - } - else - { - m_sign = !m_sign; - for (unsigned i = 0; i < m_digits.size(); ++i) - m_digits[i] = (~m_digits[i]); - vector one_digits(m_digits.size(), 0L); - one_digits[0] = 1L; - add_digits((digit_t*)m_digits.data(), (digit_t*)one_digits.data(), m_digits.size()); - } - } - if (fith) - { - Debug("END -> sub was %c%s, I am %c%s", sub.SignChar(), sub.DigitStr().c_str(), SignChar(), DigitStr().c_str()); + m_sign = !m_sign; + for (unsigned i = 0; i < m_digits.size(); ++i) + m_digits[i] = (~m_digits[i]); + vector one_digits(m_digits.size(), 0L); + one_digits[0] = 1L; + add_digits((digit_t*)m_digits.data(), (digit_t*)one_digits.data(), m_digits.size()); } Shrink(); - if (fith) - { - Debug("SHRUNK -> sub was %c%s, I am %c%s", sub.SignChar(), sub.DigitStr().c_str(), SignChar(), DigitStr().c_str()); - } return *this; } @@ -277,7 +271,16 @@ string Arbint::Str(const string & base) const { string s(""); Arbint cpy(*this); - + unsigned b = base.size(); + while (cpy > Arbint(0L)) + { + //Debug("cpy is %s", cpy.DigitStr().c_str()); + unsigned c = (unsigned)(cpy % Arbint(b)).AsDigit(); + s += base[c]; + cpy /= Arbint(b); + } + if (m_sign) + s += '-'; reverse(s.begin(), s.end()); return s; }