QtBigInt
Loading...
Searching...
No Matches
bigint.cpp
Go to the documentation of this file.
1//#
2//# Copyright (C) 2018-2021 QuasarApp.
3//# Distributed under the lgplv3 software license, see the accompanying
4//# Everyone is permitted to copy and distribute verbatim copies
5//# of this license document, but changing it is not allowed.
6//#
7
8#include "bigint.h"
9#include <limits>
10#include <cstring>
11#include <cmath>
12#include <cstdlib>
13
14// constructors
16 mpz_init(data);
17}
18
19BigInt::BigInt(const BigInt &val, int bitCount) {
20 if (bitCount > 0) {
21 mpz_init2(data, static_cast<unsigned int>(bitCount));
22 } else {
23 mpz_init(data);
24 }
25
26 mpz_set(data, val.data);
27
28}
29
30BigInt::BigInt(const std::string &str, int base):
31 BigInt() {
32 mpz_set_str(data, str.c_str(), base);
33}
34
36 BigInt() {
37 mpz_set_si(data, val);
38}
39
40BigInt::BigInt(char item, unsigned int size, int base = 2):
41 BigInt(std::string(size, item),base) {
42}
43
44std::string BigInt::getString(int base) const {
45 char *str = mpz_get_str(nullptr, base, data); // mpz_get_str allocates memory - it must be freed
46 std::string result = str;
47 free(str);
48 return result;
49}
50
52 mpz_clear(data);
53}
54
55BigInt &BigInt::powm(const BigInt &pow, const BigInt &mod) {
56 mpz_powm(data, data, pow.data, mod.data);
57 return *this;
58}
59
60BigInt BigInt::powm(BigInt val, const BigInt &pow, const BigInt &mod) {
61 return val.powm(pow, mod);
62}
63
65 mpz_pow_ui(data, data, pow);
66 return *this;
67}
68
69int BigInt::sizeBits() const {
70 return sizeBytes() * 8;
71}
72
73int BigInt::sizeBytes() const {
74 return static_cast<int>(mpz_size(data) * sizeof ((*data->_mp_d)));
75}
76
77int BigInt::longBits() const {
78 return static_cast<int>(getString(2).size());
79}
80
81int BigInt::longBytes() const {
82 return static_cast<int>(std::ceil(static_cast<double>(longBits()) / 8));
83}
84
85#define GMP_ABS(x) ((x) >= 0 ? (x) : -(x))
86int BigInt::sizeType() const {
87 return static_cast<int>(static_cast<size_t>(GMP_ABS( data->_mp_alloc)) *
88 sizeof ((*data->_mp_d)));
89
90}
91
92bool BigInt::isPrime(bool absalut) const {
93 return (mpz_probab_prime_p(data, 50) - (absalut? 1: 0)) > 0;
94}
95
96BigInt& BigInt::gcd(const BigInt &a, const BigInt &b) {
97 mpz_gcd(data, a.data, b.data);
98 return *this;
99
100}
101
102void BigInt::fromHex(const std::string &hex) {
103 mpz_set_str(data, hex.c_str(), 16);
104}
105
106BigInt BigInt::bigPow10(unsigned short pow) {
107 return "1" + std::string(pow, '0');
108}
109
111 mpz_neg(data, data);
112 return *this;
113}
114
116 mpz_set(data, val.data);
117 return *this;
118}
119
120BigInt &BigInt::operator =(const std::string &imput) {
121 mpz_set_str(data, imput.c_str(), 10);
122 return *this;
123}
124
126 mpz_set_si(data, val);
127 return *this;
128}
129
130// add operators
131
133 if (right >= 0) {
134 mpz_add_ui(left.data, left.data, static_cast<uIntMpz>(right));
135 return left;
136 }
137
138 return left -= std::abs(right);
139}
140
142 return right += left;
143}
144
145BigInt operator +(BigInt left, const BigInt &right) {
146 mpz_add(left.data, left.data, right.data);
147 return left;
148}
149
150BigInt operator +(BigInt left, const std::string &right) {
151 return left += BigInt(right);
152}
153
154BigInt operator +(const std::string &left, const BigInt &right) {
155 return BigInt(left) + right;
156}
157
159 if (right >= 0) {
160 mpz_add_ui(left.data, left.data, static_cast<uIntMpz>(right));
161 return left;
162 }
163 return left -= std::abs(right);
164}
165
166BigInt& operator +=(BigInt &left, const BigInt &right) {
167 mpz_add(left.data, left.data, right.data);
168 return left;
169}
170
171BigInt& operator +=(BigInt &left, const std::string &right) {
172 return left += BigInt(right);
173}
174
175// sub operators
176
177BigInt operator -(BigInt left, const BigInt &right) {
178 mpz_sub(left.data, left.data, right.data);
179 return left;
180}
181
183 if (right >= 0) {
184 mpz_sub_ui(left.data, left.data, static_cast<uIntMpz>(right));
185 return left;
186 }
187 return left += std::abs(right);
188}
189
191 if (left >= 0) {
192 mpz_ui_sub(right.data, static_cast<uIntMpz>(left), right.data);
193 return right;
194 }
195 return right += std::abs(left);
196}
197
199 mpz_neg(val.data, val.data);
200 return val;
201}
202
203BigInt operator -(BigInt left, const std::string &right) {
204 return left -= BigInt(right);
205}
206
207BigInt operator -(const std::string & left, const BigInt &right) {
208 return BigInt(left) - right;
209}
210
211BigInt& operator -=(BigInt &left, const BigInt &right) {
212 mpz_sub(left.data, left.data, right.data);
213 return left;
214}
215
216BigInt& operator -=(BigInt &left, const std::string &right) {
217 return left -= BigInt(right);
218}
219
221 if (right >= 0) {
222 mpz_sub_ui(left.data, left.data, static_cast<uIntMpz>(right));
223 return left;
224 }
225 return left += std::abs(right);
226}
227
228// div operators
229
230BigInt operator /(BigInt left, const BigInt &right) {
231 mpz_tdiv_q(left.data, left.data, right.data);
232 return left;
233}
234
236 mpz_tdiv_q_ui(left.data, left.data, static_cast<uIntMpz>(std::abs(right)));
237
238 if (right >= 0) {
239 return left;
240 }
241 return -left;
242}
243
244BigInt operator /(BigInt left, const std::string &right) {
245 return left /= BigInt(right);
246}
247
249 return BigInt(left) / right;
250}
251
252BigInt operator /(const std::string & left, const BigInt &right) {
253 return BigInt(left) / right;
254}
255
256BigInt& operator /=(BigInt &left, const BigInt &right) {
257 mpz_tdiv_q(left.data, left.data, right.data);
258 return left;
259}
260
261BigInt& operator /=(BigInt &left, const std::string &right) {
262 return left /= BigInt(right);
263}
264
266 mpz_tdiv_q_ui(left.data, left.data, static_cast<uIntMpz>(std::abs(right)));
267
268 if (right >= 0) {
269 return left;
270 }
271 return left.toNegative();
272}
273
274// mul operators
275BigInt operator *(BigInt left, const BigInt &right) {
276 mpz_mul(left.data, left.data, right.data);
277 return left;
278}
279
281 mpz_mul_ui(left.data, left.data, static_cast<uIntMpz>(std::abs(right)));
282
283 if (right >= 0) {
284 return left;
285 }
286 return -left;
287}
288
290 return right *= left;
291}
292
293BigInt operator *(const std::string & left, BigInt right) {
294 return right *= BigInt(left);
295}
296
297BigInt operator *(BigInt left, const std::string &right) {
298 return left *= BigInt(right);
299}
300
301BigInt& operator *=(BigInt &left, const BigInt &right) {
302 mpz_mul(left.data, left.data, right.data);
303 return left;
304}
305
306BigInt& operator *=(BigInt &left, const std::string &right) {
307 return left *= BigInt(right);
308}
309
311 mpz_mul_ui(left.data, left.data, static_cast<uIntMpz>(std::abs(right)));
312
313 if (right >= 0) {
314 return left;
315 }
316 return left.toNegative();
317}
318
319//mod operations
320BigInt operator %(BigInt left, const BigInt &right) {
321 mpz_tdiv_r(left.data, left.data, right.data);
322 return left;
323}
324
326 mpz_tdiv_r_ui(left.data, left.data, static_cast<uIntMpz>(std::abs(right)));
327 return left;
328}
329
331 return BigInt(left) % right;
332}
333
334BigInt operator %(BigInt left, const std::string & right) {
335 return left %= BigInt(right);
336}
337
338BigInt operator %(const std::string & left, const BigInt &right) {
339 return BigInt(left) % right;
340}
341
342BigInt& operator %=(BigInt& left, const BigInt &right) {
343 mpz_tdiv_r(left.data, left.data, right.data);
344 return left;
345}
346
348 mpz_tdiv_r_ui(left.data, left.data, static_cast<uIntMpz>(std::abs(right)));
349 return left;
350}
351
352BigInt& operator %=(BigInt &left, const std::string &right) {
353 return left %= BigInt(right);
354}
355
356// incriment and dicriment
358 *this -= 1;
359 return *this;
360}
361
363 *this += 1;
364 return *this;
365}
366
368 BigInt temp(*this);
369 --*this;
370 return temp;
371}
372
374 BigInt temp(*this);
375 ++*this;
376 return temp;
377}
378
379// move operators
380
381BigInt operator >>(BigInt left, int right) {
382 if (right >= 0) {
383 mpn_rshift(left.data->_mp_d,
384 left.data->_mp_d,
385 left.data->_mp_size,
386 static_cast<unsigned int>(std::abs(right)));
387 return left;
388 }
389
390 return left << right;
391}
392
393BigInt operator <<(BigInt left, int right) {
394 if (right >= 0) {
395 mpn_lshift(left.data->_mp_d,
396 left.data->_mp_d,
397 left.data->_mp_size,
398 static_cast<unsigned int>(std::abs(right)));
399 return left;
400 }
401
402 return left >> right;
403}
404
405BigInt& operator >>=(BigInt &left, int right) {
406 if (right >= 0) {
407 mpn_rshift(left.data->_mp_d,
408 left.data->_mp_d,
409 left.data->_mp_size,
410 static_cast<unsigned int>(std::abs(right)));
411 return left;
412 }
413
414 return left <<= right;
415}
416
417BigInt& operator <<=(BigInt &left, int right) {
418 if (right >= 0) {
419 mpn_lshift(left.data->_mp_d,
420 left.data->_mp_d,
421 left.data->_mp_size,
422 static_cast<unsigned int>(std::abs(right)));
423 return left;
424 }
425
426 return left >>= right;
427}
428
429// other bin operators
431 mpz_com(left.data, left.data);
432 return left;
433}
434
435BigInt operator |(BigInt left, const BigInt &right) {
436 mpz_ior(left.data, left.data, right.data);
437 return left;
438}
439
440BigInt operator |(const BigInt &left, intMpz right) {
441 return left | BigInt(right);
442}
443
444BigInt& operator |=(BigInt &left, const BigInt &right) {
445 mpz_ior(left.data, left.data, right.data);
446 return left;
447}
448
450 return left |= BigInt(right);
451}
452
453BigInt operator &(BigInt left, const BigInt &right) {
454 mpz_and(left.data, left.data, right.data);
455 return left;
456}
457
458BigInt operator &(const BigInt &left, intMpz right) {
459 return left & BigInt(right);
460}
461
462
463BigInt& operator &=(BigInt &left, const BigInt &right) {
464 mpz_and(left.data, left.data, right.data);
465 return left;
466}
467
469 return left &= BigInt(right);
470}
471
472BigInt operator ^(BigInt left, const BigInt &right) {
473 mpz_xor(left.data, left.data, right.data);
474 return left;
475}
476
477BigInt operator ^(const BigInt &left, intMpz right) {
478 return left ^ BigInt(right);
479}
480
481BigInt& operator ^=(BigInt &left, const BigInt &right) {
482 mpz_xor(left.data, left.data, right.data);
483 return left;
484}
485
487 return left ^= BigInt(right);
488}
489
490
491// logic operators
492
493bool operator!(const BigInt &val) {
494 return val == 0;
495}
496
497bool operator == (const BigInt& left, const BigInt& right) {
498 return mpz_cmp(left.data, right.data) == 0;
499}
500
501bool operator == (const BigInt& left, intMpz right) {
502 return mpz_cmp_si(left.data, right) == 0;
503}
504
505bool operator == (const BigInt &left, const std::string &right) {
506 return left == BigInt(right);
507}
508
509bool operator == ( intMpz left, const BigInt & right) {
510 return right == left;
511}
512
513bool operator == ( const std::string & left, const BigInt & right) {
514 return right == BigInt(left);
515}
516
517bool operator != (const BigInt &left, const BigInt& right) {
518 return !(left == right);
519}
520
521bool operator != (const BigInt &left, intMpz right) {
522 return !(left == right);
523}
524
525bool operator != (const BigInt &left, const std::string &right) {
526 return left != BigInt(right);
527}
528
529bool operator != ( intMpz left, const BigInt & right) {
530 return right != left;
531}
532
533bool operator != ( const std::string & left, const BigInt & right) {
534 return right != BigInt(left);
535}
536
537bool operator < ( const BigInt &left, const BigInt& right) {
538 return mpz_cmp(left.data, right.data) < 0;
539}
540
541bool operator < ( const BigInt &left, intMpz right) {
542 return mpz_cmp_si(left.data, right) < 0;
543}
544
545bool operator < ( const BigInt &left, const std::string &right) {
546 return left < BigInt(right);
547}
548
549bool operator < ( intMpz left, const BigInt & right) {
550 return right > left;
551}
552
553bool operator < ( const std::string & left, const BigInt & right) {
554 return right > BigInt(left);
555}
556
557bool operator > ( const BigInt &left, const BigInt& right) {
558 return mpz_cmp(left.data, right.data) > 0;
559}
560
561bool operator > ( const BigInt &left, intMpz right) {
562 return mpz_cmp_si(left.data, right) > 0;
563}
564
565bool operator > ( const BigInt &left, const std::string &right) {
566 return left > BigInt(right);
567}
568
569bool operator > ( intMpz left, const BigInt & right) {
570 return right < left;
571}
572
573bool operator > ( const std::string & left, const BigInt & right) {
574 return right < BigInt(left);
575}
576
577bool operator <= ( const BigInt &left, const BigInt& right) {
578 return mpz_cmp(left.data, right.data) <= 0;
579}
580
581bool operator <= ( const BigInt &left, intMpz right) {
582 return mpz_cmp_si(left.data, right) <= 0;
583}
584
585bool operator <= ( const BigInt &left, const std::string &right) {
586 return left <= BigInt(right);
587}
588
589bool operator <= ( intMpz left, const BigInt & right) {
590 return right >= left;
591}
592
593bool operator <= ( const std::string & left, const BigInt & right) {
594 return right >= BigInt(left);
595}
596
597bool operator >= ( const BigInt &left, const BigInt& right) {
598 return mpz_cmp(left.data, right.data) >= 0;
599}
600
601bool operator >= ( const BigInt &left, intMpz right) {
602 return mpz_cmp_si(left.data, right) >= 0;
603}
604
605bool operator >= ( const BigInt &left, const std::string &right) {
606 return left >= BigInt(right);
607}
608
609bool operator >= ( intMpz left, const BigInt & right) {
610 return right <= left;
611}
612
613bool operator >= ( const std::string & left, const BigInt & right) {
614 return right <= BigInt(left);
615}
616
618
619//BigInt::operator bool() const {
620// return *this != 0;
621//}
BigInt operator*(BigInt left, const BigInt &right)
Definition bigint.cpp:275
bool operator==(const BigInt &left, const BigInt &right)
Definition bigint.cpp:497
BigInt & operator+=(BigInt &left, intMpz right)
Definition bigint.cpp:158
BigInt & operator<<=(BigInt &left, int right)
Definition bigint.cpp:417
bool operator<=(const BigInt &left, const BigInt &right)
Definition bigint.cpp:577
BigInt & operator&=(BigInt &left, const BigInt &right)
Definition bigint.cpp:463
BigInt operator%(BigInt left, const BigInt &right)
Definition bigint.cpp:320
BigInt operator~(BigInt left)
Definition bigint.cpp:430
BigInt operator<<(BigInt left, int right)
Definition bigint.cpp:393
BigInt operator+(BigInt left, intMpz right)
Definition bigint.cpp:132
bool operator>(const BigInt &left, const BigInt &right)
Definition bigint.cpp:557
BigInt & operator|=(BigInt &left, const BigInt &right)
Definition bigint.cpp:444
bool operator<(const BigInt &left, const BigInt &right)
Definition bigint.cpp:537
BigInt & operator^=(BigInt &left, const BigInt &right)
Definition bigint.cpp:481
BigInt operator|(BigInt left, const BigInt &right)
Definition bigint.cpp:435
BigInt & operator/=(BigInt &left, const BigInt &right)
Definition bigint.cpp:256
BigInt & operator*=(BigInt &left, const BigInt &right)
Definition bigint.cpp:301
BigInt & operator>>=(BigInt &left, int right)
Definition bigint.cpp:405
BigInt & operator%=(BigInt &left, const BigInt &right)
Definition bigint.cpp:342
bool operator>=(const BigInt &left, const BigInt &right)
Definition bigint.cpp:597
BigInt operator/(BigInt left, const BigInt &right)
Definition bigint.cpp:230
BigInt operator>>(BigInt left, int right)
Definition bigint.cpp:381
BigInt operator^(BigInt left, const BigInt &right)
Definition bigint.cpp:472
bool operator!=(const BigInt &left, const BigInt &right)
Definition bigint.cpp:517
BigInt & operator-=(BigInt &left, const BigInt &right)
Definition bigint.cpp:211
BigInt operator&(BigInt left, const BigInt &right)
Definition bigint.cpp:453
#define GMP_ABS(x)
Definition bigint.cpp:85
BigInt operator-(BigInt left, const BigInt &right)
Definition bigint.cpp:177
bool operator!(const BigInt &val)
Definition bigint.cpp:493
The BigInt class - c++ minigmp wrapper.
Definition bigint.h:21
BigInt & operator=(const BigInt &val)
Definition bigint.cpp:115
BigInt & operator++()
Definition bigint.cpp:362
BigInt & powm(const BigInt &pow, const BigInt &mod)
Definition bigint.cpp:55
BigInt & gcd(const BigInt &a, const BigInt &b)
Definition bigint.cpp:96
~BigInt()
Definition bigint.cpp:51
BigInt & toNegative()
Definition bigint.cpp:110
bool isPrime(bool absalut=false) const
Definition bigint.cpp:92
std::string getString(int base=10) const
Definition bigint.cpp:44
int sizeBytes() const
Definition bigint.cpp:73
int longBits() const
Returns the current length of the number in bits.
Definition bigint.cpp:77
static BigInt bigPow10(unsigned short pow)
Returns 10 raised to the power of pow (10 ^ pow).
Definition bigint.cpp:106
BigInt & pow(uIntMpz pow)
Definition bigint.cpp:64
int sizeBits() const
Returns the size of the number in bits.
Definition bigint.cpp:69
int longBytes() const
Definition bigint.cpp:81
void fromHex(const std::string &hex)
Definition bigint.cpp:102
BigInt & operator--()
Definition bigint.cpp:357
BigInt()
Definition bigint.cpp:15
int sizeType() const
Definition bigint.cpp:86
void mpz_and(mpz_t r, const mpz_t u, const mpz_t v)
Definition mini-gmp.c:3634
uIntMpz mpz_tdiv_q_ui(mpz_t q, const mpz_t n, uIntMpz d)
Definition mini-gmp.c:2623
void mpz_tdiv_r(mpz_t r, const mpz_t n, const mpz_t d)
Definition mini-gmp.c:2335
void mpz_ui_sub(mpz_t r, uIntMpz a, const mpz_t b)
Definition mini-gmp.c:1937
void mpz_sub_ui(mpz_t r, const mpz_t a, uIntMpz b)
Definition mini-gmp.c:1928
void mpz_pow_ui(mpz_t r, const mpz_t b, uIntMpz e)
Definition mini-gmp.c:3078
int mpz_set_str(mpz_t r, const char *sp, int base)
Definition mini-gmp.c:4127
int mpz_cmp_si(const mpz_t u, intMpz v)
Definition mini-gmp.c:1786
void mpz_init2(mpz_t r, mp_bitcnt_t bits)
Definition mini-gmp.c:1437
void mpz_add(mpz_t r, const mpz_t a, const mpz_t b)
Definition mini-gmp.c:1993
uIntMpz mpz_tdiv_r_ui(mpz_t r, const mpz_t n, uIntMpz d)
Definition mini-gmp.c:2639
mp_limb_t mpn_rshift(mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
Definition mini-gmp.c:643
void mpz_gcd(mpz_t g, const mpz_t u, const mpz_t v)
Definition mini-gmp.c:2762
void mpz_set_si(mpz_t r, intMpz x)
Definition mini-gmp.c:1480
void mpz_init(mpz_t r)
Definition mini-gmp.c:1425
void mpz_powm(mpz_t r, const mpz_t b, const mpz_t e, const mpz_t m)
Definition mini-gmp.c:3106
void mpz_ior(mpz_t r, const mpz_t u, const mpz_t v)
Definition mini-gmp.c:3706
void mpz_mul(mpz_t r, const mpz_t u, const mpz_t v)
Definition mini-gmp.c:2058
mp_limb_t mpn_lshift(mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
Definition mini-gmp.c:613
char * mpz_get_str(char *sp, int base, const mpz_t u)
Definition mini-gmp.c:4062
void mpz_com(mpz_t r, const mpz_t u)
Definition mini-gmp.c:3627
void mpz_clear(mpz_t r)
Definition mini-gmp.c:1450
int mpz_probab_prime_p(const mpz_t n, int reps)
Definition mini-gmp.c:3413
void mpz_sub(mpz_t r, const mpz_t a, const mpz_t b)
Definition mini-gmp.c:2006
void mpz_add_ui(mpz_t r, const mpz_t a, uIntMpz b)
Definition mini-gmp.c:1919
size_t mpz_size(const mpz_t u)
Definition mini-gmp.c:1579
void mpz_set(mpz_t r, const mpz_t x)
Definition mini-gmp.c:1504
void mpz_neg(mpz_t r, const mpz_t u)
Definition mini-gmp.c:1851
void mpz_mul_ui(mpz_t r, const mpz_t u, uIntMpz v)
Definition mini-gmp.c:2033
void mpz_xor(mpz_t r, const mpz_t u, const mpz_t v)
Definition mini-gmp.c:3779
void mpz_tdiv_q(mpz_t q, const mpz_t n, const mpz_t d)
Definition mini-gmp.c:2317
int mpz_cmp(const mpz_t a, const mpz_t b)
Definition mini-gmp.c:1814
unsigned long long uIntMpz
Definition mini-gmp.h:58
long long intMpz
Definition mini-gmp.h:59