16 Arbint::Arbint(digit_t i) : m_digits(1), m_sign(i < 0)
21 Arbint::Arbint(unsigned n, digit_t d0, ...) : m_digits(n), m_sign(false)
27 for (unsigned i = 1; i < n; ++i)
29 m_digits[i] = va_arg(ap, digit_t);
34 Arbint::Arbint(const Arbint & cpy) : m_digits(cpy.m_digits.size()), m_sign(cpy.m_sign)
36 memcpy(m_digits.data(), cpy.m_digits.data(),
37 sizeof(digit_t)*m_digits.size());
40 Arbint & Arbint::operator=(const Arbint & cpy)
42 memmove(m_digits.data(), cpy.m_digits.data(),
43 sizeof(digit_t)*min(m_digits.size(), cpy.m_digits.size()));
44 if (cpy.m_digits.size() > m_digits.size())
46 unsigned old_size = m_digits.size();
47 m_digits.resize(cpy.m_digits.size());
48 memset(m_digits.data()+old_size, 0, sizeof(digit_t)*m_digits.size()-old_size);
55 memset(m_digits.data(), 0, sizeof(digit_t)*m_digits.size());
58 unsigned Arbint::Shrink()
60 if (m_digits.size() <= 1)
63 for (i = m_digits.size()-1; (i > 0 && m_digits[i] != 0L); --i);
64 unsigned result = m_digits.size() - i;
69 Arbint & Arbint::operator+=(const Arbint & add)
71 if (m_sign == add.m_sign)
73 // -a + -b == -(a + b)
92 Arbint & Arbint::operator-=(const Arbint & sub)
94 if (m_sign == sub.m_sign)
99 Arbint & Arbint::AddBasic(const Arbint & add)
101 if (add.m_digits.size() >= m_digits.size())
103 m_digits.resize(add.m_digits.size()+1,0L);
106 digit_t carry = add_digits((digit_t*)m_digits.data(),
107 (digit_t*)add.m_digits.data(), add.m_digits.size());
109 m_digits[m_digits.size()-1] = carry;
110 else if (m_digits.back() == 0L)
111 m_digits.resize(m_digits.size()-1);
115 Arbint & Arbint::SubBasic(const Arbint & sub)
117 if (sub.m_digits.size() >= m_digits.size())
119 m_digits.resize(sub.m_digits.size(),0L);
121 digit_t borrow = sub_digits((digit_t*)m_digits.data(),
122 (digit_t*)sub.m_digits.data(), sub.m_digits.size());
125 //TODO: Write ASM to do this bit?
129 for (unsigned i = 0; i < m_digits.size(); ++i)
130 m_digits[i] = -m_digits[i];
137 string Arbint::Str(const string & base) const
140 for (unsigned i = 0; i < m_digits.size(); ++i)
142 digit_t w = m_digits[i];
150 if (i+1 < m_digits.size()) s += ",";
152 reverse(s.begin(), s.end());
156 bool Arbint::operator==(const Arbint & equ) const
158 if (m_sign != equ.m_sign) return false;
159 unsigned min_size = m_digits.size();
160 const Arbint * larger = &equ;
161 if (m_digits.size() > equ.m_digits.size())
163 min_size = equ.m_digits.size();
167 if (memcmp(m_digits.data(), equ.m_digits.data(), min_size) != 0)
170 for (unsigned i = min_size; i < larger->m_digits.size(); ++i)
172 if (larger->m_digits[i] != 0L)
178 string Arbint::DigitStr() const
181 //ss << std::hex << std::setfill('0');
182 for (unsigned i = 0; i < m_digits.size(); ++i)
184 if (i != 0) ss << ',';
185 ss << std::setw(2*sizeof(digit_t)) << static_cast<digit_t>(m_digits[i]);