3 * @brief Arbitrary sized integer declarations
17 typedef uint64_t digit_t;
20 Arbint(const std::vector<digit_t> & digits);
21 Arbint(unsigned n, digit_t d0, ...);
22 Arbint(const std::string & str, const std::string & base="0123456789");
24 Arbint(const Arbint & cpy);
26 int64_t AsDigit() const
28 int64_t digit = (m_digits.size() == 1) ? m_digits[0] : 0x7FFFFFFFFFFFFFFF;
29 return (m_sign) ? -digit : digit;
32 inline bool Sign() const {return m_sign;}
33 inline char SignChar() const {return (m_sign) ? '-' : '+';}
34 std::string DigitStr() const;
36 std::string Str(const std::string & base="0123456789") const;
37 inline std::string Str(const char * base) const
39 return Str(std::string(base));
42 Arbint & operator=(const Arbint & equ);
43 Arbint & operator+=(const Arbint & add);
44 Arbint & operator-=(const Arbint & sub);
45 Arbint & operator*=(const Arbint & mul);
46 void Division(const Arbint & div, Arbint & result, Arbint & modulo) const;
48 Arbint & operator<<=(unsigned amount);
49 Arbint & operator>>=(unsigned amount);
51 inline Arbint operator+(const Arbint & add) const
57 inline Arbint operator-(const Arbint & add) const
64 inline Arbint operator*(const Arbint & mul) const
71 inline Arbint & operator/=(const Arbint & div)
75 this->Division(div, result, remainder);
76 this->operator=(result);
79 inline Arbint operator/(const Arbint & div)
85 inline Arbint operator%(const Arbint & div)
89 this->Division(div, result, remainder);
93 bool operator==(const Arbint & equ) const;
94 bool operator<(const Arbint & less) const;
96 inline bool operator!=(const Arbint & equ) const
98 return !(this->operator==(equ));
100 inline bool operator<=(const Arbint & leq) const
102 return (this->operator==(leq) || this->operator<(leq));
105 inline bool operator>=(const Arbint & leq) const
107 return (this->operator==(leq) || this->operator>(leq));
109 inline bool operator>(const Arbint & grea) const
111 return !(this->operator<=(grea));
113 inline Arbint operator>>(unsigned amount) const
115 Arbint result(*this);
119 inline Arbint operator<<(unsigned amount) const
121 Arbint result(*this);
127 //inline operator double() const {return double(AsDigit());}
128 inline operator int64_t() const {return AsDigit();}
129 //inline operator int() const {return int(AsDigit());}
133 inline Arbint Abs() const {Arbint a(*this); a.m_sign = false; return a;}
136 Arbint & AddBasic(const Arbint & add);
137 Arbint & SubBasic(const Arbint & sub);
139 bool GetBit(unsigned i) const;
140 void BitClear(unsigned i);
141 void BitSet(unsigned i);
144 std::vector<digit_t> m_digits;
154 typedef uint64_t digit_t;
155 digit_t add_digits(digit_t * dst, digit_t * add, digit_t size);
156 digit_t sub_digits(digit_t * dst, digit_t * add, digit_t size);
157 digit_t mul_digits(digit_t * dst, digit_t mul, digit_t size);
158 digit_t div_digits(digit_t * dst, digit_t div, digit_t size, digit_t * rem);