39 unsigned _add(uint32_t *
const m,
40 uint32_t
const *
const m1,
41 uint32_t
const *
const m2,
47 unsigned const size =
std::min(size1, size2);
48 for (; i < size; ++i) {
49 sum =
static_cast<uint64_t
>(m1[i]) + (sum >> 32) +
50 static_cast<uint64_t
>(m2[i]);
51 m[i] =
static_cast<uint32_t
>(sum);
53 for (; i < size1; ++i) {
54 sum =
static_cast<uint64_t
>(m1[i]) + (sum >> 32);
55 m[i] =
static_cast<uint32_t
>(sum);
57 for (; i < size2; ++i) {
58 sum =
static_cast<uint64_t
>(m2[i]) + (sum >> 32);
59 m[i] =
static_cast<uint32_t
>(sum);
61 uint32_t carry =
static_cast<uint32_t
>(sum >> 32);
72 unsigned _sub(uint32_t *
const m,
73 uint32_t
const *
const m1,
74 uint32_t
const *
const m2,
86 for (; i < size2; ++i) {
87 diff =
static_cast<int64_t
>(m1[i]) + (diff >> 32) -
88 static_cast<int64_t
>(m2[i]);
89 m[i] =
static_cast<uint32_t
>(diff);
92 for (; diff < 0; ++i) {
93 diff =
static_cast<int64_t
>(m1[i]) - 1;
94 m[i] =
static_cast<uint32_t
>(diff);
99 while (m1[i - 1] == 0) { --i; }
103 for (; i < size1; ++i) {
112 unsigned _mul(uint32_t *
const m,
113 uint32_t
const *
const m1,
114 uint32_t
const *
const m2,
115 unsigned const size1,
116 unsigned const size2)
125 unsigned const size = size1 + size2;
126 for (
unsigned i = size1; i < size; ++i) {
129 for (
unsigned i = size1; i > 0; --i) {
130 uint64_t digit = m1[i - 1];
131 uint64_t carry =
static_cast<uint64_t
>(m2[0]) * digit;
133 m[i - 1] =
static_cast<uint32_t
>(carry);
135 for (; j < size2; ++j) {
136 carry =
static_cast<uint64_t
>(m2[j]) * digit +
137 static_cast<uint64_t
>(
m[i + j - 1]) +
139 m[i + j - 1] =
static_cast<uint32_t
>(carry);
142 for (; carry != 0; ++j) {
143 carry +=
static_cast<uint64_t
>(
m[i + j - 1]);
144 m[i + j - 1] =
static_cast<uint32_t
>(carry);
150 return m[size - 1] == 0 ? size - 1 : size;
170 _checkCapacity(
std::max(_size,
b._size) + 1);
171 if (_sign ==
b._sign) {
173 _size = _add(_digits, _digits,
b._digits, _size,
b._size);
178 if (_size >
b._size) {
179 _size = _sub(_digits, _digits,
b._digits, _size,
b._size);
180 }
else if (_size <
b._size) {
181 _size = _sub(_digits,
b._digits, _digits,
b._size, _size);
188 for (; i > 0 && _digits[i - 1] ==
b._digits[i - 1]; --i) {}
191 }
else if (_digits[i - 1] >
b._digits[i - 1]) {
192 _size = _sub(_digits, _digits,
b._digits, i, i);
194 _size = _sub(_digits,
b._digits, _digits, i, i);
215 if (_sign == 0 ||
n == 0) {
220 unsigned const z = (
n >> 5);
221 unsigned const s = (
n & 0x1f);
222 unsigned const size = _size +
z;
223 _checkCapacity(size + 1);
227 for (
unsigned i = _size; i != 0; --i) {
228 _digits[i +
z - 1] = _digits[i - 1];
230 for (
unsigned i =
z; i != 0; --i) {
235 uint32_t low, high = 0;
236 for (
unsigned i = _size; i != 0; --i, high = low) {
237 low = _digits[i - 1];
238 _digits[i +
z] = (high << s) | (low >> (32 - s));
240 _digits[
z] = high << s;
241 for (
unsigned i =
z; i != 0; --i) {
244 _size = (_digits[size] == 0) ? size: size + 1;
255 _checkCapacity(_size +
b._size);
256 if (_size >=
b._size) {
257 _size = _mul(_digits, _digits,
b._digits, _size,
b._size);
259 _size = _mul(_digits,
b._digits, _digits,
b._size, _size);