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