fork download
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. //#include <stdlib.h>
  5. #include <cstdint>
  6. #include <cassert>
  7. #include <string>
  8.  
  9. typedef int64_t CONTAINER; /* not uint64_t, because using minus-number in mpz_class::operator-() */
  10. unsigned int BIT = 3; /* BIT <= 64bit - 2bit = 62bit */
  11.  
  12. CONTAINER CMASK = 1ULL << BIT;
  13. CONTAINER BMASK = CMASK - 1;
  14.  
  15. namespace QZ {
  16. class mpz_base_class {
  17.  
  18. private:
  19. unsigned int n;
  20. CONTAINER *b;
  21.  
  22. private:
  23. static void LeftShift(mpz_base_class &a);
  24. static void RightShift(mpz_base_class &a, int &lsb_out);
  25. static void LeftShift2(int &msb, mpz_base_class &a);
  26. static void LeftShift3(mpz_base_class &a, int msb);
  27.  
  28. protected:
  29.  
  30.  
  31. public:
  32. static bool iszero(mpz_base_class const &n);
  33. static void div2(mpz_base_class const &a, mpz_base_class const &b, mpz_base_class &q, mpz_base_class &r);
  34.  
  35. mpz_base_class(); //
  36. virtual ~mpz_base_class();
  37. mpz_base_class(const unsigned long c);
  38. mpz_base_class(mpz_base_class const &ob);
  39. mpz_base_class &operator=(mpz_base_class const &ob);
  40. // mpz_base_class &operator=(mpz_base_class const &&ob);
  41.  
  42. friend bool operator==(mpz_base_class const &a, mpz_base_class const &b);
  43. friend bool operator!=(mpz_base_class const &a, mpz_base_class const &b) { return !(a == b); }
  44.  
  45. friend std::ostream &operator<<(std::ostream &stream, mpz_base_class c);
  46.  
  47. friend mpz_base_class operator+(mpz_base_class const &a, mpz_base_class const &b);
  48. friend mpz_base_class operator-(mpz_base_class const &a, mpz_base_class const &b);
  49. mpz_base_class operator++(int dmy) { mpz_base_class r = *this; *this = *this + 1; return r; }
  50. mpz_base_class operator--(int dmy) { mpz_base_class r = *this; *this = *this - 1; return r; }
  51. mpz_base_class &operator++() { *this = *this + 1; return *this; }
  52. mpz_base_class &operator--() { *this = *this - 1; return *this; }
  53. mpz_base_class &operator+() { return *this; }
  54. mpz_base_class operator-() = delete;
  55.  
  56. mpz_base_class operator~() = delete;
  57. explicit operator bool() const { return *this != 0; }
  58. bool operator!() const { return !static_cast<bool>(*this); }
  59.  
  60. friend bool operator<(mpz_base_class const &a, mpz_base_class const &b);
  61. friend bool operator<=(mpz_base_class const &a, mpz_base_class const &b) { return (a < b) ? true : (a == b) ? true : false; }
  62. friend bool operator>(mpz_base_class const &a, mpz_base_class const &b) { return (a < b) ? false : (a == b) ? false : true; }
  63. friend bool operator>=(mpz_base_class const &a, mpz_base_class const &b) { return (a < b) ? false : (a == b) ? true : true; }
  64.  
  65. friend mpz_base_class operator*(mpz_base_class const &a, mpz_base_class const &b);
  66. friend mpz_base_class operator/(mpz_base_class const &a, mpz_base_class const &b) { mpz_base_class q, r; div2(a, b, q, r); return q; }
  67. friend mpz_base_class operator%(mpz_base_class const &a, mpz_base_class const &b) { mpz_base_class q, r; div2(a, b, q, r); return r; }
  68.  
  69. mpz_base_class &operator+=(mpz_base_class const &ob) { *this = *this + ob; return *this; }
  70. mpz_base_class &operator-=(mpz_base_class const &ob) { *this = *this - ob; return *this; }
  71. mpz_base_class &operator*=(mpz_base_class const &ob) { *this = *this * ob; return *this; }
  72. mpz_base_class &operator/=(mpz_base_class const &ob) { *this = *this / ob; return *this; }
  73. mpz_base_class &operator%=(mpz_base_class const &ob) { *this = *this % ob; return *this; }
  74. mpz_base_class &operator&=(mpz_base_class const &ob) = delete;
  75. mpz_base_class &operator|=(mpz_base_class const &ob) = delete;
  76. mpz_base_class &operator^=(mpz_base_class const &ob) = delete;
  77.  
  78. bool testBit(int n);
  79. mpz_base_class operator>>(int n) const { int dmy; mpz_base_class r = *this; for (int i = 0; i < n; i++) RightShift(r, dmy); return r; }
  80. mpz_base_class operator<<(int n) const { mpz_base_class r = *this; for (int i = 0; i < n; i++) LeftShift(r); return r; }
  81. mpz_base_class &operator>>=(int n) { *this = *this >> n; return *this; }
  82. mpz_base_class &operator<<=(int n) { *this = *this << n; return *this; }
  83.  
  84. int bitLength();
  85.  
  86. /* for test */
  87. unsigned int get_mpzclass_n() { return this->n; }
  88. CONTAINER *get_mpzclass_b() { return this->b; }
  89. virtual void dump() const {
  90. std::cout << "n = " << this->n << ": ";
  91. for (unsigned int i = 0; i < this->n; i++)
  92. std::cout << i << ":" << this->b[i] << ",";
  93. std::cout << std::endl;
  94. }
  95.  
  96. void test42() {
  97. // *this == 4 + 256;
  98. this->b[2] = 0;
  99. }
  100. };
  101.  
  102. class mpz_class {
  103. private:
  104. mpz_base_class base;
  105. bool negative;
  106.  
  107. public:
  108. mpz_class();
  109. ~mpz_class();
  110. mpz_class(const signed long c);
  111. mpz_class(mpz_class const &ob);
  112. mpz_class &operator=(mpz_class const &ob);
  113. // mpz_class &operator=(mpz_class const &&ob);
  114. // mpz_class &operator=(mpz_base_class const &ob); // mpz_base_class と mpz_class の関係を、継承から委譲に変更した時に不要となった
  115.  
  116. friend bool operator==(mpz_class const &a, mpz_class const &b) { return (a.base == b.base) && (a.negative == b.negative); }
  117. friend bool operator!=(mpz_class const &a, mpz_class const &b) { return !(a == b); }
  118.  
  119. friend std::ostream &operator<<(std::ostream &stream, mpz_class c);
  120.  
  121. mpz_class operator-() const { mpz_class r = *this; r.negative = !r.negative; return r; }
  122. mpz_class &operator+() { return *this; }
  123.  
  124. friend bool operator<(mpz_class const &a, mpz_class const &b);
  125. friend bool operator<=(mpz_class const &a, mpz_class const &b) { return (a < b) ? true : (a == b) ? true : false; }
  126. friend bool operator>(mpz_class const &a, mpz_class const &b) { return (a < b) ? false : (a == b) ? false : true; }
  127. friend bool operator>=(mpz_class const &a, mpz_class const &b) { return (a < b) ? false : (a == b) ? true : true; }
  128.  
  129. friend mpz_class operator+(mpz_class const &a, mpz_class const &b);
  130. friend mpz_class operator-(mpz_class const &a, mpz_class const &b);
  131. mpz_class operator++(int dmy) { mpz_class r = *this; *this = *this + 1; return r; }
  132. mpz_class operator--(int dmy) { mpz_class r = *this; *this = *this - 1; return r; }
  133. mpz_class &operator++() { *this = *this + 1; return *this; }
  134. mpz_class &operator--() { *this = *this - 1; return *this; }
  135.  
  136. mpz_class operator~() = delete;
  137. explicit operator bool() const { return *this != 0; }
  138. bool operator!() const { return !static_cast<bool>(*this); }
  139.  
  140. friend mpz_class operator*(mpz_class const &a, mpz_class const &b);
  141. friend mpz_class operator/(mpz_class const &a, mpz_class const &b);
  142. friend mpz_class operator%(mpz_class const &a, mpz_class const &b);
  143.  
  144. mpz_class &operator+=(mpz_class const &n) { *this = *this + n; return *this; }
  145. mpz_class &operator-=(mpz_class const &n) { *this = *this - n; return *this; }
  146. mpz_class &operator*=(mpz_class const &n) { *this = *this * n; return *this; }
  147. mpz_class &operator/=(mpz_class const &n) { *this = *this / n; return *this; }
  148. mpz_class &operator%=(mpz_class const &n) { *this = *this % n; return *this; }
  149. mpz_class &operator&=(mpz_class const &ob) = delete;
  150. mpz_class &operator|=(mpz_class const &ob) = delete;
  151. mpz_class &operator^=(mpz_class const &ob) = delete;
  152.  
  153. mpz_class operator>>(int n) { mpz_class r = *this; r.base >>= n; return r; }
  154. mpz_class operator<<(int n) { mpz_class r = *this; r.base <<= n; return r; }
  155. mpz_class &operator>>=(int n) { *this = *this >> n; return *this; }
  156. mpz_class &operator<<=(int n) { *this = *this << n; return *this; }
  157.  
  158. int bitLength();
  159.  
  160. bool get_mpzclass_negative() { return this->negative; }
  161.  
  162. virtual void dump() const {
  163. this->base.dump();
  164. std::cout << "sign = " << this->negative << std::endl;
  165. }
  166.  
  167. /* for test */
  168. mpz_base_class get_mpzclass_base() { return this->base; }
  169.  
  170. };
  171.  
  172. mpz_base_class::mpz_base_class() {
  173. // std::cout << "mpz_base_class constructor1" << std::endl;
  174. this->n = 0;
  175. this->b = 0;
  176. }
  177. mpz_base_class::~mpz_base_class() {
  178. // std::cout << "mpz_base_class destructor" << std::endl;
  179. if (this->b) delete [] this->b;
  180. this->n = 0;
  181. this->b = 0;
  182. }
  183. mpz_base_class::mpz_base_class(const unsigned long c) {
  184. // std::cout << "mpz_base_class constructor2" << std::endl;
  185. CONTAINER cc;
  186. cc = c;
  187. if (c == 0) {
  188. this->n = 1;
  189. this->b = new CONTAINER [1];
  190. this->b[0] = 0;
  191. return;
  192. }
  193.  
  194. assert(cc > 0);
  195.  
  196. CONTAINER *newbody;
  197. unsigned int i, j, r, pos;
  198.  
  199. this->b = 0;
  200. this->n = 0;
  201.  
  202. while (cc > 0) {
  203. r = 0;
  204. pos = 1;
  205. for (i = 0; i < BIT; i++) {
  206. if ((cc & 1) != 0) {
  207. r = (r | pos);
  208. } else {
  209. }
  210. pos = pos * 2;
  211. cc = cc / 2;
  212. }
  213. newbody = new CONTAINER [this->n + 1];
  214. for (j = 0; j < this->n; j++)
  215. newbody[j] = this->b[j];
  216. newbody[j] = r;
  217. delete [] this->b;
  218. this->b = newbody;
  219. this->n++;
  220. }
  221. assert(this->n != 0);
  222. }
  223.  
  224. mpz_base_class::mpz_base_class(const mpz_base_class &ob) {
  225. // std::cout << "mpz_base_class constructor3" << std::endl;
  226. this->n = ob.n;
  227. if (ob.n == 0) {
  228. this->b = 0;
  229. } else {
  230. this->b = new CONTAINER [ob.n];
  231. for (unsigned int i = 0; i < ob.n; i++)
  232. this->b[i] = ob.b[i];
  233. }
  234. assert((this->n == 0 && this->b == 0) || (this->n > 0 && this->b != 0));
  235. }
  236.  
  237. mpz_base_class &mpz_base_class::operator=(const mpz_base_class &ob) {
  238. // std::cout << "mpz_base_class operator=" << std::endl;
  239. CONTAINER *org_b = this->b; // for checking self-assignment
  240. this->n = ob.n;
  241. if (ob.n == 0) {
  242. this->b = 0;
  243. delete [] org_b;
  244. } else {
  245. this->b = new CONTAINER [ob.n];
  246. for (unsigned int i = 0; i < ob.n; i++)
  247. this->b[i] = ob.b[i];
  248. delete [] org_b;
  249. }
  250. assert((this->n == 0 && this->b == 0) || (this->n > 0 && this->b != 0));
  251. return *this;
  252. }
  253.  
  254. bool operator==(mpz_base_class const &a, mpz_base_class const &b) {
  255. // std::cout << "mpz_base_class operator==" << std::endl;
  256. unsigned int i, less;
  257. bool isEqual = true;
  258.  
  259. if (a.n < b.n)
  260. less = a.n;
  261. else
  262. less = b.n;
  263. for (i = 0; i < less; i++)
  264. if (a.b[i] != b.b[i]) {
  265. isEqual = false;
  266. goto label;
  267. }
  268. if (a.n < b.n) {
  269. for (; i < b.n; i++)
  270. if (b.b[i] != 0) {
  271. isEqual = false;
  272. goto label;
  273. }
  274. } else {
  275. for (; i < a.n; i++)
  276. if (a.b[i] != 0) { // be carefull! not b.b[] but a.b[]
  277. isEqual = false;
  278. goto label;
  279. }
  280. }
  281. label:
  282. return isEqual;
  283. }
  284.  
  285.  
  286. std::ostream &operator<<(std::ostream &stream, mpz_base_class c) {
  287. // std::cout << "mpz_base_class operator<<" << std::endl;
  288. std::basic_string<char> mod10;
  289. mpz_base_class q, n;
  290. int mod;
  291. bool fzero;
  292.  
  293. fzero = true;
  294. n = c;
  295. for(;;) {
  296. /* div10(n, q, mod); */
  297. {
  298. q = n;
  299. mod = 0;
  300. for (unsigned int i = 0; i < n.n * BIT; i++) {
  301. /* shift_div(mod, q); */
  302. {
  303. unsigned int cy, i;
  304.  
  305. cy = 0;
  306. for (i = 0; i < n.n; i++) {
  307. q.b[i] = q.b[i] << 1;
  308. if (cy)
  309. q.b[i] = q.b[i] | 0x01;
  310. cy = (q.b[i] >> BIT);
  311. q.b[i] = q.b[i] & BMASK;
  312. }
  313. mod = mod << 1;
  314. if (cy)
  315. mod = mod | 0x01;
  316.  
  317. }
  318. if (mod >= 10) {
  319. q.b[0] = q.b[0] | 0x01;
  320. mod = mod - 10;
  321. }
  322. }
  323. }
  324. if (mpz_base_class::iszero(q) && mod == 0)
  325. break;
  326. mod10 = (char)('0' + mod) + mod10;
  327. fzero = false;
  328. n = q;
  329. }
  330.  
  331. if (fzero)
  332. stream << '0';
  333. else
  334. stream << mod10;
  335. return stream;
  336. }
  337.  
  338. mpz_base_class operator+(mpz_base_class const &a, mpz_base_class const &b) {
  339. mpz_base_class r;
  340. mpz_base_class const * more_ab;
  341. unsigned int less_n;
  342. if (a.n > b.n) {
  343. r.n = a.n;
  344. more_ab = &a;
  345. less_n = b.n;
  346. } else {
  347. r.n = b.n;
  348. more_ab = &b;
  349. less_n = a.n;
  350. }
  351. r.b = new CONTAINER [r.n];
  352. unsigned int i, carry = 0;
  353. for (i = 0; i < less_n; i++) {
  354. CONTAINER s = a.b[i] + b.b[i] + carry;
  355. if (s >= CMASK) {
  356. carry = 1;
  357. r.b[i] = (s & BMASK);
  358. } else {
  359. carry = 0;
  360. r.b[i] = s; /* need */
  361. }
  362. }
  363. for (;i < r.n; i++) {
  364. CONTAINER s = more_ab->b[i] + carry;
  365. if (s >= CMASK) {
  366. carry = 1;
  367. r.b[i] = (s & BMASK); /* need */
  368. } else {
  369. carry = 0;
  370. r.b[i] = (s & BMASK); /* need */ /* do not to insert break keyword.*/
  371. }
  372. }
  373. if (carry) {
  374. CONTAINER *new_body = new CONTAINER [r.n + 1];
  375. for (i = 0; i < r.n; i++)
  376. new_body[i] = r.b[i];
  377. new_body[i] = carry;
  378. delete [] r.b;
  379. r.b = new_body;
  380. // r.b[r.n] = 1; /* NOT need */
  381. r.n++;
  382. }
  383. return r;
  384. }
  385.  
  386.  
  387. bool mpz_base_class::iszero(mpz_base_class const &n) {
  388. bool isZero = true;
  389. for (unsigned int i = 0; i < n.n; i++)
  390. if (n.b[i] != 0) {
  391. isZero = false;
  392. break;
  393. }
  394. return isZero;
  395. }
  396.  
  397. mpz_base_class operator-(mpz_base_class const &a, mpz_base_class const &b) {
  398. int vCount, moreCount, i;
  399. CONTAINER diff;
  400. int borrowR = 0;
  401. bool flagMore, flagLess;
  402. mpz_base_class r;
  403. flagMore = false;
  404. flagLess = false;
  405. moreCount = a.n;
  406. vCount = a.n;
  407. r = a;
  408. if (a.n > b.n) {
  409. flagMore = true;
  410. vCount = b.n;
  411. moreCount = a.n;
  412. r = a;
  413. }
  414. if (a.n < b.n) {
  415. flagLess = true;
  416. vCount = a.n;
  417. moreCount = b.n;
  418. r = b;
  419. }
  420.  
  421. borrowR = 0;
  422. for (i = 0; i < vCount; i++) {
  423. diff = a.b[i] - b.b[i] - borrowR;
  424. if (diff < 0) {
  425. borrowR = 1;
  426. r.b[i] = diff + CMASK;
  427. } else {
  428. borrowR = 0;
  429. r.b[i] = diff;
  430. }
  431. }
  432. if (flagMore) {
  433. for (;i < moreCount; i++) {
  434. diff = a.b[i] - borrowR;
  435. if (diff < 0) {
  436. borrowR = 1;
  437. r.b[i] = diff + CMASK;
  438. } else {
  439. borrowR = 0;
  440. r.b[i] = diff;
  441. }
  442. }
  443. }
  444. if (flagLess) {
  445. for (;i < moreCount; i++) {
  446. if (b.b[i] > 0) {
  447. borrowR = 1;
  448. }
  449. }
  450. }
  451. if (borrowR > 0) throw std::underflow_error("negative value.");
  452. return r;
  453. }
  454.  
  455. bool operator<(mpz_base_class const &a, mpz_base_class const &b) { // if a < b then true
  456. try {
  457. mpz_base_class r = a - b;
  458. } catch (std::underflow_error &e) {
  459. return true;
  460. }
  461. return false;
  462. }
  463.  
  464. mpz_base_class operator*(mpz_base_class const &a, mpz_base_class const &b) {
  465. mpz_base_class Rshift = b;
  466. mpz_base_class Lshift = a;
  467. mpz_base_class r = 0;
  468. int lsb;
  469. while (!mpz_base_class::iszero(Rshift)) {
  470. mpz_base_class::RightShift(Rshift, lsb);
  471. if (lsb) {
  472. r = r + Lshift;
  473. }
  474. mpz_base_class::LeftShift(Lshift);
  475. }
  476. return r;
  477. }
  478.  
  479. void mpz_base_class::LeftShift(mpz_base_class &a) {
  480. unsigned int i, msb;
  481. msb = 0;
  482. for (i = 0; i < a.n; i++) {
  483. a.b[i] *= 2;
  484. if (msb > 0)
  485. a.b[i] = (a.b[i] | 0x01);
  486.  
  487. if (a.b[i] > BMASK) {
  488. msb = 1;
  489. a.b[i] -= CMASK;
  490. } else {
  491. msb = 0;
  492. }
  493. }
  494. if (msb > 0) {
  495. CONTAINER *newbody;
  496. newbody = new CONTAINER [a.n + 1];
  497. newbody[a.n] = 1;
  498. for (unsigned int i = 0; i < a.n; i++) {
  499. newbody[i] = a.b[i];
  500. }
  501. a.n++;
  502. delete [] a.b;
  503. a.b = newbody;
  504. }
  505. }
  506.  
  507. void mpz_base_class::RightShift(mpz_base_class &a, int &lsb_out) {
  508. int i, lsb;
  509. lsb = 0;
  510. for (i = a.n - 1; i >= 0; --i) {
  511. if (lsb > 0)
  512. a.b[i] = (a.b[i] | CMASK);
  513.  
  514. if ((a.b[i] & 0x01) > 0)
  515. lsb = 1;
  516. else
  517. lsb = 0;
  518. a.b[i] /= 2;
  519. }
  520. lsb_out = lsb;
  521. if (a.b[a.n - 1] == 0) {
  522. CONTAINER *newbody;
  523. newbody = new CONTAINER [a.n - 1];
  524. for (unsigned int i = 0; i < a.n - 1; i++)
  525. newbody[i] = a.b[i];
  526. a.n--;
  527. delete [] a.b;
  528. a.b = newbody;
  529. }
  530. }
  531.  
  532. void mpz_base_class::LeftShift2(int &msb, mpz_base_class &a) {
  533. unsigned int i, msb_v;
  534. msb_v = 0;
  535. for (i = 0; i < a.n; i++) {
  536. a.b[i] *= 2;
  537. if (msb_v > 0)
  538. a.b[i] = (a.b[i] | 0x01);
  539.  
  540. if (a.b[i] > BMASK) {
  541. msb_v = 1;
  542. a.b[i] -= CMASK;
  543. } else {
  544. msb_v = 0;
  545. }
  546. }
  547. msb = msb_v;
  548. }
  549.  
  550. void mpz_base_class::LeftShift3(mpz_base_class &a, int msb) {
  551. unsigned int i, msb_v;
  552. msb_v = msb;
  553. for (i = 0; i < a.n; i++) {
  554. a.b[i] *= 2;
  555. if (msb_v > 0)
  556. a.b[i] = (a.b[i] | 0x01);
  557.  
  558. if (a.b[i] > BMASK) {
  559. msb_v = 1;
  560. a.b[i] -= CMASK;
  561. } else {
  562. msb_v = 0;
  563. }
  564. }
  565. if (msb_v > 0) {
  566. CONTAINER *newbody;
  567. newbody = new CONTAINER [a.n + 1];
  568. newbody[a.n] = 1;
  569. for (unsigned int i = 0; i < a.n; i++) {
  570. newbody[i] = a.b[i];
  571. }
  572. a.n++;
  573. delete [] a.b;
  574. a.b = newbody;
  575. }
  576. }
  577. void mpz_base_class::div2(mpz_base_class const &a, mpz_base_class const &b, mpz_base_class &q, mpz_base_class &r) {
  578. if (b == mpz_base_class(0)) {
  579. std::cout << "null devided." << std::endl;
  580. return;
  581. }
  582.  
  583. /* LeftRest <- LeftShiftBuff */
  584. mpz_base_class LeftRest(0);
  585. mpz_base_class LeftShiftBuff = a;
  586. mpz_base_class Quotient(0);
  587. int msb, lsb;
  588. msb = 0;
  589. int n = a.n * BIT;
  590. while (n > 0) {
  591. // std::cout << "LeftShiftBuff=" << LeftShiftBuff << std::endl;
  592. // std::cout << "LeftRest=" << LeftRest << std::endl;
  593. mpz_base_class::LeftShift2(msb, LeftShiftBuff);
  594. mpz_base_class::LeftShift3(LeftRest, msb);
  595. lsb = 0;
  596. if (b < LeftRest || b == LeftRest) {
  597. LeftRest = LeftRest - b;
  598. lsb = 1;
  599. }
  600. mpz_base_class::LeftShift3(Quotient, lsb);
  601. // std::cout << "Quotient=" << Quotient << std::endl;
  602. n--;
  603. }
  604. q = Quotient;
  605. r = LeftRest;
  606. }
  607.  
  608. bool mpz_base_class::testBit(int n) {
  609. unsigned int test_byte = n / BIT;
  610. int test_mask = 1 << (n % BIT);
  611. if (test_byte >= this->n) return false;
  612. if ((this->b[test_byte] & test_mask) > 0) return true;
  613. return false;
  614. }
  615.  
  616. /*----------------------------------------------*/
  617. mpz_class::mpz_class() {
  618. // std::cout << "mpz_class constructor1" << std::endl;
  619. this->base = mpz_base_class();
  620. this->negative = false;
  621. }
  622.  
  623. mpz_class::~mpz_class() {
  624. // std::cout << "mpz_class destructor1" << std::endl;
  625. this->negative = false;
  626. }
  627.  
  628. mpz_class::mpz_class(const signed long c) {
  629. // std::cout << "mpz_class costructor2" << std::endl;
  630. if (c >= 0) {
  631. this->base = mpz_base_class(c);
  632. this->negative = false;
  633. } else {
  634. this->base = mpz_base_class(-c);
  635. this->negative = true;
  636. }
  637. }
  638.  
  639. mpz_class::mpz_class(const mpz_class &ob) {
  640. // std::cout << "mpz_class constructor3" << std::endl;
  641. this->base = ob.base;
  642. this->negative = ob.negative;
  643. }
  644.  
  645. mpz_class &mpz_class::operator=(mpz_class const &ob) {
  646. // std::cout << "mpz_class operator=(mpz_class&)" << std::endl;
  647. this->base = ob.base;
  648. this->negative = ob.negative;
  649. return *this;
  650. }
  651.  
  652. // mpz_class &mpz_class::operator=(mpz_base_class const &ob) {
  653. // std::cout << "mpz_class operator=(mpz_base_class&)" << std::endl;
  654. // this->mpz_base_class::operator=(ob);
  655. // this->negative = false;
  656. // return *this;
  657. // }
  658.  
  659. // bool operator==(mpz_class const &a, mpz_class const &b) {
  660. // std::cout << "mpz_class::operator==" << std::endl;
  661. // if (a.negative == b.negative)
  662. // return operator==(a.base, b.base);
  663. // return false;
  664. // }
  665.  
  666. std::ostream &operator<<(std::ostream &stream, mpz_class c) {
  667. if (c.negative)
  668. stream << '-';
  669. return operator<<(stream, c.base);
  670. }
  671.  
  672. mpz_class operator+(mpz_class const &a, mpz_class const &b) {
  673. mpz_class r;
  674. if (!a.negative && !b.negative) {
  675. r.base = a.base + b.base; /* old.comment: operator=(mpz_class, mpz_base_class) */
  676. r.negative = false;
  677. } else if (a.negative && !b.negative) {
  678. mpz_class t = -a; assert(t.negative == false);
  679. if (t.base < b.base) { /* t < b */
  680. r.base = b.base - t.base;
  681. r.negative = false;
  682. } else { /* b < t */
  683. r.base = t.base - b.base;
  684. r.negative = true;
  685. }
  686. if (mpz_base_class::iszero(r.base))
  687. r.negative = false;
  688. } else if (!a.negative && b.negative) {
  689. mpz_class t = -b; assert(t.negative == false);
  690. if (operator<(t.base, a.base) == true) { /* t < a */
  691. r.base = a.base - t.base;
  692. r.negative = false;
  693. } else { /* a < t */
  694. r.base = t.base - a.base;
  695. r.negative = true;
  696. }
  697. if (mpz_base_class::iszero(r.base))
  698. r.negative = false;
  699. } else if (a.negative && b.negative) {
  700. QZ::mpz_class aa = a, bb = b;
  701. aa = -aa; bb = -bb;
  702. r.base = aa.base + bb.base;
  703. r.negative = true;
  704. if (mpz_base_class::iszero(r.base))
  705. r.negative = false;
  706. }
  707. return r;
  708. }
  709.  
  710. mpz_class operator-(mpz_class const &a, mpz_class const &b) {
  711. QZ::mpz_class r = -b;
  712. return a + r;
  713. }
  714.  
  715. bool operator<(mpz_class const &a, mpz_class const &b) {
  716. QZ::mpz_class r = a - b;
  717. if (r.negative)
  718. return true;
  719. return false;
  720. }
  721.  
  722. mpz_class operator*(mpz_class const &a, mpz_class const &b) {
  723. mpz_class x = (a > 0) ? a : -a;
  724. mpz_class y = (b > 0) ? b : -b;
  725. assert(x >= 0 && y >= 0);
  726. mpz_class r;
  727. r.base = x.base * y.base;
  728.  
  729. if (a >= 0 && b >= 0) {
  730. } else if (a < 0 && b >= 0) {
  731. r = -r;
  732. } else if (a >= 0 && b < 0) {
  733. r = -r;
  734. } if (a < 0 && b < 0) {
  735. }
  736. if (mpz_base_class::iszero(r.base)) r.negative = false;
  737. return r;
  738. }
  739.  
  740. mpz_class operator/(mpz_class const &a, mpz_class const &b) {
  741. mpz_class x = (a >= 0) ? a : -a;
  742. mpz_class y = (b >= 0) ? b : -b;
  743. mpz_class q, r;
  744. mpz_base_class::div2(x.base, y.base, q.base, r.base);
  745. if (a >= 0 && b >= 0) {
  746. } else if (a < 0 && b >= 0) {
  747. q = -q; r = -r;
  748. if (mpz_base_class::iszero(q.base)) q.negative = false;
  749. if (mpz_base_class::iszero(r.base)) r.negative = false;
  750. } else if (a >= 0 && b < 0) {
  751. q = -q;
  752. if (mpz_base_class::iszero(q.base)) q.negative = false;
  753. if (mpz_base_class::iszero(r.base)) r.negative = false;
  754. } else if (a < 0 && b < 0) {
  755. r = -r;
  756. if (mpz_base_class::iszero(q.base)) q.negative = false;
  757. if (mpz_base_class::iszero(r.base)) q.negative = false;
  758. }
  759. return q;
  760. }
  761.  
  762. mpz_class operator%(mpz_class const &a, mpz_class const &b) {
  763. mpz_class x = (a >= 0) ? a : -a;
  764. mpz_class y = (b >= 0) ? b : -b;
  765. mpz_class q, r;
  766. mpz_base_class::div2(x.base, y.base, q.base, r.base);
  767. if (a >= 0 && b >= 0) {
  768. } else if (a < 0 && b >= 0) {
  769. q = -q; r = -r;
  770. if (mpz_base_class::iszero(q.base)) q.negative = false;
  771. if (mpz_base_class::iszero(r.base)) r.negative = false;
  772. } else if (a >= 0 && b < 0) {
  773. q = -q;
  774. if (mpz_base_class::iszero(q.base)) q.negative = false;
  775. if (mpz_base_class::iszero(r.base)) r.negative = false;
  776. } else if (a < 0 && b < 0) {
  777. r = -r;
  778. if (mpz_base_class::iszero(q.base)) q.negative = false;
  779. if (mpz_base_class::iszero(r.base)) r.negative = false;
  780. }
  781. return r;
  782. }
  783.  
  784. int mpz_base_class::bitLength() {
  785. if (this->n == 0)
  786. return 0;
  787.  
  788. int n = this->n;
  789. int i;
  790. for (i = n - 1; !(b[i] > 0); --i) {}
  791.  
  792. CONTAINER msb = this->b[i];
  793.  
  794. int j = 0;
  795. while (msb > 0) {
  796. j++;
  797. msb = msb >> 1;
  798. }
  799. return BIT * i + j;
  800. }
  801.  
  802. int mpz_class::bitLength() {
  803. return this->base.bitLength();
  804. }
  805.  
  806. } /* namespace QZ */
  807.  
  808. bool test00() {
  809. std::cout << "test00" << std::endl;
  810. return true;
  811. }
  812. bool test01() {
  813. /* constructor1, destructor */
  814. std::cout << "test01" << std::endl;
  815. QZ::mpz_base_class a;
  816. a.dump();
  817. if (a.get_mpzclass_n() != 0) return false;
  818. if (a.get_mpzclass_b() != 0) return false;
  819. return true;
  820. }
  821.  
  822. bool test02() {
  823. /* constructor2 */
  824. std::cout << "test02" << std::endl;
  825. std::cout << "test02:0" << std::endl;
  826. QZ::mpz_base_class a(0);
  827. a.dump();
  828. if (a.get_mpzclass_n() != 1) return false;
  829. if (*a.get_mpzclass_b() != 0) return false;
  830.  
  831. std::cout << "test02:1" << std::endl;
  832. QZ::mpz_base_class b(1);
  833. b.dump();
  834. if (b.get_mpzclass_n() != 1) return false;
  835. if (*b.get_mpzclass_b() != 1) return false;
  836.  
  837. std::cout << "test02:2" << std::endl;
  838. QZ::mpz_base_class c(2);
  839. c.dump();
  840. if (c.get_mpzclass_n() != 1) return false;
  841. if (*c.get_mpzclass_b() != 2) return false;
  842.  
  843. std::cout << "test02:4" << std::endl;
  844. QZ::mpz_base_class d(4);
  845. d.dump();
  846. if (d.get_mpzclass_n() != 1) return false;
  847. if (*d.get_mpzclass_b() != 4) return false;
  848.  
  849. std::cout << "test02:8" << std::endl;
  850. QZ::mpz_base_class e(8);
  851. e.dump();
  852. if (e.get_mpzclass_n() != 2) return false;
  853. if (*e.get_mpzclass_b() != 0) return false;
  854. if (*(e.get_mpzclass_b() + 1) != 1) return false;
  855.  
  856. std::cout << "test02:10" << std::endl;
  857. QZ::mpz_base_class f(10);
  858. f.dump();
  859. if (f.get_mpzclass_n() != 2) return false;
  860. if (*f.get_mpzclass_b() != 2) return false;
  861. if (*(f.get_mpzclass_b() + 1) != 1) return false;
  862.  
  863. std::cout << "test02:16" << std::endl;
  864. QZ::mpz_base_class g(16);
  865. g.dump();
  866. if (g.get_mpzclass_n() != 2) return false;
  867. if (*g.get_mpzclass_b() != 0) return false;
  868. if (*(g.get_mpzclass_b() + 1) != 2) return false;
  869.  
  870. std::cout << "test02:32" << std::endl;
  871. QZ::mpz_base_class h(32);
  872. h.dump();
  873. if (h.get_mpzclass_n() != 2) return false;
  874. if (*h.get_mpzclass_b() != 0) return false;
  875. if (*(h.get_mpzclass_b() + 1) != 4) return false;
  876.  
  877. std::cout << "test02:64" << std::endl;
  878. QZ::mpz_base_class i(64);
  879. i.dump();
  880. if (i.get_mpzclass_n() != 3) return false;
  881. if (*i.get_mpzclass_b() != 0) return false;
  882. if (*(i.get_mpzclass_b() + 1) != 0) return false;
  883. if (*(i.get_mpzclass_b() + 2) != 1) return false;
  884. return true;
  885. }
  886.  
  887. bool test03() {
  888. /* constructor3 */
  889. std::cout << "test03" << std::endl;
  890. QZ::mpz_base_class a;
  891. QZ::mpz_base_class b = a;
  892. b.dump();
  893. if (b.get_mpzclass_n() != 0) return false;
  894. if (b.get_mpzclass_b() != 0) return false;
  895. QZ::mpz_base_class c = 1;
  896. QZ::mpz_base_class d = c;
  897. d.dump();
  898. if (d.get_mpzclass_n() != 1) return false;
  899. if (*d.get_mpzclass_b() != 1) return false;
  900. return true;
  901. }
  902.  
  903. bool test04() {
  904. /* operator= */
  905. std::cout << "test04" << std::endl;
  906. QZ::mpz_base_class a;
  907. QZ::mpz_base_class b;
  908. b = a;
  909. a.dump();
  910. b.dump();
  911. if (b.get_mpzclass_n() != 0) return false;
  912. if (b.get_mpzclass_b() != 0) return false;
  913. QZ::mpz_base_class c = 1;
  914. c.dump();
  915. QZ::mpz_base_class d;
  916. d = c;
  917. d.dump();
  918. if (d.get_mpzclass_n() != 1) return false;
  919. if (*d.get_mpzclass_b() != 1) return false;
  920. return true;
  921. }
  922.  
  923. bool test05() {
  924. /* operator== */
  925. std::cout << "test05" << std::endl;
  926. QZ::mpz_base_class a = 1;
  927. QZ::mpz_base_class b = 1;
  928. if (!(a == b)) return false;
  929. QZ::mpz_base_class x = 100;
  930. QZ::mpz_base_class y = 100;
  931. if (!(x == y)) return false;
  932. QZ::mpz_base_class u;
  933. QZ::mpz_base_class v;
  934. if (!(u == v)) return false;
  935. QZ::mpz_base_class w = 0;
  936. if (!(u == w)) return false;
  937. return true;
  938. }
  939.  
  940. bool test06() {
  941. /* operator==, operator!= */
  942. std::cout << "test06" << std::endl;
  943. QZ::mpz_base_class a = 0;
  944. QZ::mpz_base_class b = 1;
  945. QZ::mpz_base_class c = 1;
  946. if (!(a != b)) return false;
  947. if (b != c) return false;
  948. if (a == b) return false;
  949. if (!(b == c)) return false;
  950. return true;
  951. }
  952.  
  953. /*---------------------------------------------------------*/
  954.  
  955. bool test23() {
  956. /* addition sign flag to mpz_class */
  957. /* constructor1 */
  958. std::cout << "test23" << std::endl;
  959. QZ::mpz_class x;
  960. x.dump();
  961. if (x.get_mpzclass_base().get_mpzclass_n() != 0) return false;
  962. if (x.get_mpzclass_base().get_mpzclass_b() != 0) return false;
  963. if (x.get_mpzclass_negative() != 0) return false;
  964.  
  965. return true;
  966. }
  967.  
  968. bool test24() {
  969. std::cout << "test24" << std::endl;
  970. QZ::mpz_class a1(0);
  971. a1.dump();
  972. if (a1.get_mpzclass_base().get_mpzclass_n() != 1) return false;
  973. if (*a1.get_mpzclass_base().get_mpzclass_b() != 0) return false;
  974. if (a1.get_mpzclass_negative() != 0) return false;
  975. QZ::mpz_class a2(1);
  976. a2.dump();
  977. if (a2.get_mpzclass_base().get_mpzclass_n() != 1) return false;
  978. if (*a2.get_mpzclass_base().get_mpzclass_b() != 1) return false;
  979. if (a2.get_mpzclass_negative() != 0) return false;
  980. QZ::mpz_class a3(2);
  981. a3.dump();
  982. if (a3.get_mpzclass_base().get_mpzclass_n() != 1) return false;
  983. if (*a3.get_mpzclass_base().get_mpzclass_b() != 2) return false;
  984. if (a3.get_mpzclass_negative() != 0) return false;
  985. QZ::mpz_class a4(4);
  986. a4.dump();
  987. if (a4.get_mpzclass_base().get_mpzclass_n() != 1) return false;
  988. if (*a4.get_mpzclass_base().get_mpzclass_b() != 4) return false;
  989. if (a4.get_mpzclass_negative() != 0) return false;
  990. QZ::mpz_class a5(8);
  991. a5.dump();
  992. if (a5.get_mpzclass_base().get_mpzclass_n() != 2) return false;
  993. if (*a5.get_mpzclass_base().get_mpzclass_b() != 0) return false;
  994. if (*(a5.get_mpzclass_base().get_mpzclass_b() + 1) != 1) return false;
  995. if (a5.get_mpzclass_negative() != 0) return false;
  996.  
  997. std::cout << "test24:-1" << std::endl;
  998. QZ::mpz_class a6(-1);
  999. a6.dump();
  1000. if (a6.get_mpzclass_base().get_mpzclass_n() != 1) return false;
  1001. if (*a6.get_mpzclass_base().get_mpzclass_b() != 1) return false;
  1002. if (a6.get_mpzclass_negative() != 1) return false;
  1003.  
  1004. std::cout << "test24:-2" << std::endl;
  1005. QZ::mpz_class a7(-2);
  1006. a7.dump();
  1007. if (a7.get_mpzclass_base().get_mpzclass_n() != 1) return false;
  1008. if (*a7.get_mpzclass_base().get_mpzclass_b() != 2) return false;
  1009. if (a7.get_mpzclass_negative() != 1) return false;
  1010.  
  1011. std::cout << "test24:-4" << std::endl;
  1012. QZ::mpz_class a8(-4);
  1013. a8.dump();
  1014. if (a8.get_mpzclass_base().get_mpzclass_n() != 1) return false;
  1015. if (*a8.get_mpzclass_base().get_mpzclass_b() != 4) return false;
  1016. if (a8.get_mpzclass_negative() != 1) return false;
  1017.  
  1018. std::cout << "test24:-8" << std::endl;
  1019. QZ::mpz_class a9(-8);
  1020. a9.dump();
  1021. if (a9.get_mpzclass_base().get_mpzclass_n() != 2) return false;
  1022. if (*a9.get_mpzclass_base().get_mpzclass_b() != 0) return false;
  1023. if (*(a9.get_mpzclass_base().get_mpzclass_b() + 1) != 1) return false;
  1024. if (a9.get_mpzclass_negative() != 1) return false;
  1025.  
  1026. return true;
  1027. }
  1028.  
  1029. bool test25() {
  1030. std::cout << "test25" << std::endl;
  1031. QZ::mpz_class a;
  1032. QZ::mpz_class b = a;
  1033. b.dump();
  1034. if (b.get_mpzclass_base().get_mpzclass_n() != 0) return false;
  1035. if (b.get_mpzclass_base().get_mpzclass_b() != 0) return false;
  1036. if (b.get_mpzclass_negative() != 0) return false;
  1037.  
  1038. QZ::mpz_class c = 8;
  1039. QZ::mpz_class d = c;
  1040. d.dump();
  1041. if (d.get_mpzclass_base().get_mpzclass_n() != 2) return false;
  1042. if (*(d.get_mpzclass_base().get_mpzclass_b()) != 0) return false;
  1043. if (*(d.get_mpzclass_base().get_mpzclass_b() + 1) != 1) return false;
  1044. if (b.get_mpzclass_negative() != 0) return false;
  1045.  
  1046. QZ::mpz_class e = -8;
  1047. QZ::mpz_class f = e;
  1048. f.dump();
  1049. if (f.get_mpzclass_base().get_mpzclass_n() != 2) return false;
  1050. if (*f.get_mpzclass_base().get_mpzclass_b() != 0) return false;
  1051. if (*(f.get_mpzclass_base().get_mpzclass_b() + 1) != 1) return false;
  1052. if (f.get_mpzclass_negative() != 1) return false;
  1053.  
  1054. return true;
  1055. }
  1056.  
  1057. bool test26() {
  1058. std::cout << "test26" << std::endl;
  1059.  
  1060. QZ::mpz_class a;
  1061. QZ::mpz_class b;
  1062. b = a;
  1063. a.dump();
  1064. b.dump();
  1065. if (b.get_mpzclass_base().get_mpzclass_n() != 0) return false;
  1066. if (b.get_mpzclass_base().get_mpzclass_b() != 0) return false;
  1067. if (b.get_mpzclass_negative() != 0) return false;
  1068.  
  1069. QZ::mpz_class c = 1;
  1070. c.dump();
  1071. QZ::mpz_class d;
  1072. d = c;
  1073. d.dump();
  1074. if (d.get_mpzclass_base().get_mpzclass_n() != 1) return false;
  1075. if (*(d.get_mpzclass_base().get_mpzclass_b()) != 1) return false;
  1076. if (d.get_mpzclass_negative() != 0) return false;
  1077.  
  1078. QZ::mpz_class e = -1;
  1079. e.dump();
  1080. QZ::mpz_class f;
  1081. f = e;
  1082. f.dump();
  1083. if (f.get_mpzclass_base().get_mpzclass_n() != 1) return false;
  1084. if (*(f.get_mpzclass_base().get_mpzclass_b()) != 1) return false;
  1085. if (f.get_mpzclass_negative() != 1) return false;
  1086.  
  1087. return true;
  1088. }
  1089.  
  1090. bool test27() {
  1091. std::cout << "test27:1" << std::endl;
  1092. QZ::mpz_class a = 1;
  1093. QZ::mpz_class b = 1;
  1094. if (!(a == b)) return false;
  1095.  
  1096. std::cout << "test27:100" << std::endl;
  1097. QZ::mpz_class x = 100;
  1098. QZ::mpz_class y = 100;
  1099. if (!(x == y)) return false;
  1100.  
  1101. std::cout << "test27:0" << std::endl;
  1102. QZ::mpz_class u;
  1103. QZ::mpz_class v;
  1104. if (!(u == v)) return false;
  1105. QZ::mpz_class w = 0;
  1106. if (!(u == w)) return false;
  1107.  
  1108. std::cout << "test27:-100" << std::endl;
  1109. QZ::mpz_class i = -100;
  1110. QZ::mpz_class j = -100;
  1111. if (!(i == j)) return false;
  1112. QZ::mpz_class k = 100;
  1113. if (i == k) return false;
  1114.  
  1115. return true;
  1116. }
  1117.  
  1118. bool test28() {
  1119. std::cout << "test28" << std::endl;
  1120. QZ::mpz_class a = 0;
  1121. QZ::mpz_class b = -1;
  1122. QZ::mpz_class c = -1;
  1123.  
  1124. if (!(a != b)) return false;
  1125. if (b != c) return false;
  1126. if (a == b) return false;
  1127. if (!(b == c)) return false;
  1128.  
  1129. return true;
  1130. }
  1131.  
  1132. bool test29() {
  1133. /* operator-() */
  1134. std::cout << "test29" << std::endl;
  1135. QZ::mpz_class x = 1;
  1136. QZ::mpz_class y = -x;
  1137. if (y != -1) return false;
  1138. x = QZ::mpz_class(-1);
  1139. y = -x;
  1140. if (y != 1) return false;
  1141. return true;
  1142. }
  1143.  
  1144. bool test30() {
  1145. std::cout << "test30" << std::endl;
  1146. QZ::mpz_class x = -1;
  1147. std::cout << "x = " << x << std::endl;
  1148. x = -x;
  1149. std::cout << "x = " << x << std::endl;
  1150. if (x.get_mpzclass_base().get_mpzclass_n() != 1) return false;
  1151. if (*(x.get_mpzclass_base().get_mpzclass_b()) != 1) return false;
  1152. if (x.get_mpzclass_negative() != false) return false;
  1153.  
  1154. QZ::mpz_class y = -100;
  1155. std::cout << "y = " << y << std::endl;
  1156. y = -y;
  1157. std::cout << "y = " << y << std::endl;
  1158. if (x.get_mpzclass_negative() != false) return false;
  1159.  
  1160. return true;
  1161. }
  1162.  
  1163. bool test31() {
  1164. std::cout << "test31" << std::endl;
  1165. std::cout << "3+5=8" << std::endl;
  1166. QZ::mpz_class a = 3;
  1167. QZ::mpz_class b = 5;
  1168. QZ::mpz_class c = 8;
  1169. if (a + b != c) return false;
  1170. std::cout << "-------------" << std::endl;
  1171. std::cout << "-3+(-5)=-8" << std::endl;
  1172. a = QZ::mpz_class(-3);
  1173. b = QZ::mpz_class(-5);
  1174. c = QZ::mpz_class(-8);
  1175. if (a + b != c) return false;
  1176. std::cout << "-------------" << std::endl;
  1177. std::cout << "-3+5=2" << std::endl;
  1178. a = QZ::mpz_class(-3);
  1179. b = QZ::mpz_class(5);
  1180. c = QZ::mpz_class(2);
  1181. if (a + b != c) return false;
  1182. std::cout << "-------------" << std::endl;
  1183. std::cout << "-3+1=-2" << std::endl;
  1184. a = QZ::mpz_class(-3);
  1185. b = QZ::mpz_class(1);
  1186. c = QZ::mpz_class(-2);
  1187. if (a + b != c) return false;
  1188. std::cout << "-------------" << std::endl;
  1189. std::cout << "5+(-3)=+2" << std::endl;
  1190. a = QZ::mpz_class(5);
  1191. b = QZ::mpz_class(-3);
  1192. c = QZ::mpz_class(2);
  1193. if (a + b != c) return false;
  1194. std::cout << "-------------" << std::endl;
  1195. std::cout << "5+(-8)=-3" << std::endl;
  1196. a = QZ::mpz_class(5);
  1197. b = QZ::mpz_class(-8);
  1198. c = QZ::mpz_class(-3);
  1199. if (a + b != c) return false;
  1200. std::cout << "-------------" << std::endl;
  1201. return true;
  1202. }
  1203.  
  1204. bool test32() {
  1205. std::cout << "test32" << std::endl;
  1206. for (int i = -10; i <= +10; i++) {
  1207. for (int j = -10; j <= +10; j++) {
  1208. QZ::mpz_class z1 = i + j;
  1209. QZ::mpz_class x(i);
  1210. QZ::mpz_class y(j);
  1211. QZ::mpz_class z2 = x + y;
  1212. // std::cout << "z1 = " << i + j << std::endl;
  1213. if (z1 != z2) {
  1214. std:: cout << "i = " << i << ", j = " << j << std::endl;
  1215. std:: cout << "not equal!!" << std::endl;
  1216. return false;
  1217. }
  1218. }
  1219. }
  1220. return true;
  1221. }
  1222.  
  1223. bool test33() {
  1224. std::cout << "test33" << std::endl;
  1225. for (int i = -10; i <= +10; i++) {
  1226. for (int j = -10; j <= +10; j++) {
  1227. QZ::mpz_class z1 = i - j;
  1228. QZ::mpz_class x(i);
  1229. QZ::mpz_class y(j);
  1230. QZ::mpz_class z2 = x - y;
  1231. // std::cout << "z1 = " << i - j << std::endl;
  1232. if (z1 != z2) {
  1233. std:: cout << "i = " << i << ", j = " << j << std::endl;
  1234. std:: cout << "not equal!!" << std::endl;
  1235. return false;
  1236. }
  1237. }
  1238. }
  1239. return true;
  1240. }
  1241. bool test34() {
  1242. std::cout << "test34" << std::endl;
  1243. for (int i = -10; i <= 10; i++) {
  1244. for (int j = -10; j <= 10; j++) {
  1245. QZ::mpz_class x = i;
  1246. QZ::mpz_class y = j;
  1247.  
  1248. // std::cout << "i=" << i << ",j=" << j << ",x=" << x << ",y=" << y << std::endl;
  1249. // std::cout << i << "==" << j << ": " << (i==j) << std::endl;
  1250. // std::cout << x << "==" << y << ": " << (x==y) << std::endl;
  1251. if ((i == j) ^ (x == j)) { std::cout << "i==j" << std::endl; return false; }
  1252.  
  1253. // std::cout << i << "!=" << j << ": " << (i!=j) << std::endl;
  1254. // std::cout << x << "!=" << y << ": " << (x!=y) << std::endl;
  1255. if ((i != j) ^ (x != y)) { std::cout << "i!=j" << std::endl; return false; }
  1256.  
  1257. if ((i < j) ^ (x < y)) { std::cout << "i<j" << std::endl; return false; }
  1258. if ((i <= j) ^ (x <= y)) { std::cout << "i<=j" << std::endl; return false; }
  1259. if ((i > j) ^ (x > y)) { std::cout << "i>j" << std::endl; return false; }
  1260. if ((i >= j) ^ (x >= y)) { std::cout << "i>=j" << std::endl; return false; }
  1261. }
  1262. }
  1263. return true;
  1264. }
  1265.  
  1266. bool test35() {
  1267. std::cout << "test35" << std::endl;
  1268. for (int i = -10; i <= +10; i++) {
  1269. for (int j = -10; j <= +10; j++) {
  1270. // std::cout << "i = " << i << ", j = " << j << std::endl;
  1271. QZ::mpz_class z1 = i * j;
  1272. QZ::mpz_class x(i);
  1273. QZ::mpz_class y(j);
  1274. // std::cout << "z1 = " << i * j << std::endl;
  1275. QZ::mpz_class z2 = x * y;
  1276. // std::cout << "z2 = " << z2 << std::endl;
  1277.  
  1278. if (z1 != z2) {
  1279. std:: cout << "i = " << i << ", j = " << j << std::endl;
  1280. std:: cout << "not equal!!" << std::endl;
  1281. return false;
  1282. }
  1283. }
  1284. }
  1285. return true;
  1286. }
  1287.  
  1288. int seed = 31415926;
  1289. int const n11 = 1000;
  1290. bool test36() {
  1291. std::cout << "test36" << std::endl;
  1292. srand(seed);
  1293. for (int i = 0; i < n11; i++) {
  1294. int a, b;
  1295. a = (rand() >> 16);
  1296. b = (rand() >> 16);
  1297. if (rand() % 2 == 1) a = -a;
  1298. if (rand() % 2 == 1) b = -b;
  1299. QZ::mpz_class x(a);
  1300. QZ::mpz_class y(b);
  1301. QZ::mpz_class z = x * y;
  1302. // std::cout << "x = " << x << std::endl;
  1303.  
  1304. if (z != a * b) {
  1305. std::cout << "i = " << i << std::endl;
  1306. std::cout << "NOT EQUAL: x = " << x << ", y = " << y << ", a = " << a << ", b = " << b << ", a * b = " << a * b << std::endl;
  1307. std::cout << "z = " << z << std::endl;
  1308. z.dump();
  1309. return false;
  1310. }
  1311. }
  1312. return true;
  1313. }
  1314.  
  1315. int const n12 = 50;
  1316. bool test37() {
  1317. std::cout << "test37" << std::endl;
  1318. for (int i = -n12; i <= +n12; i++) {
  1319. for (int j = -n12; j <= +n12; j++) {
  1320. // std::cout << "i = " << i << ", j = " << j << std::endl;
  1321. if (j == 0) continue;
  1322. QZ::mpz_class q1 = i / j;
  1323. QZ::mpz_class r1 = i % j;
  1324. QZ::mpz_class x(i);
  1325. QZ::mpz_class y(j);
  1326. // std::cout << "q1 = " << i / j << std::endl;
  1327. QZ::mpz_class q2 = x / y;
  1328. // std::cout << "q2 = " << q2 << std::endl;
  1329. // std::cout << "r1 = " << i % j << std::endl;
  1330. QZ::mpz_class r2 = x % y;
  1331. // std::cout << "r2 = " << r2 << std::endl;
  1332.  
  1333. if (q1 != q2 || r1 != r2) {
  1334. std:: cout << "i = " << i << ", j = " << j << std::endl;
  1335. std:: cout << "not equal!!" << std::endl;
  1336. return false;
  1337. }
  1338. }
  1339. }
  1340. return true;
  1341. }
  1342.  
  1343. int const n14 = 1000;
  1344. bool test38() {
  1345. std::cout << "test38" << std::endl;
  1346. srand(seed);
  1347. for (int i = 0; i < n14; i++) {
  1348. QZ::mpz_class x(rand());
  1349. QZ::mpz_class y(rand());
  1350. if (rand() % 2 == 1) x = -x;
  1351. if (rand() % 2 == 1) y = -y;
  1352. // std::cout << "x = " << x << std::endl;
  1353. QZ::mpz_class q = x / y;
  1354. QZ::mpz_class r = x % y;
  1355. if (!(q * y + r == x)) {
  1356. std::cout << "x = " << x << ",y = " << y << ",q = " << q << ",r = " << r << std::endl;
  1357. std::cout << "q * y = " << q * y << std::endl;
  1358. std::cout << "q * y + r = " << q * y + r << std::endl;
  1359. std::cout << "x = " << q * y + r << std::endl;
  1360. std::cout << "not equal!" << std::endl;
  1361. return false;
  1362. }
  1363. }
  1364. return true;
  1365. }
  1366.  
  1367. bool test39() {
  1368. std::cout << "test39" << std::endl;
  1369. QZ::mpz_class t = 2;
  1370. QZ::mpz_class s = 3;
  1371. t += s;
  1372. std::cout << "t = " << t << std::endl;
  1373. if (t != 5) return false;
  1374.  
  1375. int n = 5;
  1376. int d = 7;
  1377. t = QZ::mpz_class(5);
  1378. for (; n < 100; n += d, t += d) {
  1379. std::cout << "n = " << n << ", t = " << t << std::endl;
  1380. if (n != t) {
  1381. std::cout << "n = " << n << ", t = " << t << std::endl;
  1382. return false;
  1383. }
  1384. }
  1385.  
  1386. return true;
  1387. }
  1388.  
  1389. bool test40() {
  1390. std::cout << "test40A" << std::endl;
  1391. QZ::mpz_base_class a = 2;
  1392. a = a << 1;
  1393. std::cout << "a = " << a << std::endl;
  1394. a.dump();
  1395. if (a != 4) return false;
  1396.  
  1397. QZ::mpz_base_class b = 2;
  1398. b = b >> 1;
  1399. std::cout << "b = " << b << std::endl;
  1400. b.dump();
  1401. if (b != 1) return false;
  1402.  
  1403. int m = 3;
  1404. QZ::mpz_base_class M = m;
  1405. for (int n = 0; n < 8; n++) {
  1406. std::cout << "n = " << n << std::endl;
  1407. std::cout << "m << " << n << " = " << (m << n) << std::endl;
  1408. std::cout << "M << " << n << " = " << (M << n) << std::endl;
  1409. if ((m << n) != (M << n)) return false;
  1410. }
  1411.  
  1412. m = 1024;
  1413. M = m;
  1414. for (int n = 0; n < 8; n++) {
  1415. std::cout << "n = " << n << std::endl;
  1416. std::cout << "m >> " << n << " = " << (m >> n) << std::endl;
  1417. std::cout << "M >> " << n << " = " << (M >> n) << std::endl;
  1418. if ((m >> n) != (M >> n)) return false;
  1419. }
  1420.  
  1421. QZ::mpz_base_class c = 3;
  1422. std::cout << "c = " << c << std::endl; // 3
  1423. c <<= 1;
  1424. std::cout << "c = " << c << std::endl; //6
  1425. if (c != 6) return false;
  1426. c <<= 1;
  1427. std::cout << "c = " << c << std::endl; //12
  1428. if (c != 12) return false;
  1429. c <<= 1;
  1430. std::cout << "c = " << c << std::endl;//24
  1431. if (c != 24) return false;
  1432.  
  1433. c = 1024;
  1434. std::cout << "c = " << c << std::endl; // 1024
  1435. c >>= 1;
  1436. std::cout << "c = " << c << std::endl; // 512
  1437. if (c != 512) return false;
  1438. c >>= 1;
  1439. std::cout << "c = " << c << std::endl; // 256
  1440. if (c != 256) return false;
  1441. c >>= 1;
  1442. std::cout << "c = " << c << std::endl;//128
  1443. if (c != 128) return false;
  1444.  
  1445. /* ---------------- */
  1446. std::cout << std::endl << "test40B" << std::endl;
  1447.  
  1448. QZ::mpz_class x = 2;
  1449. std::cout << "x = " << x << std::endl;
  1450. x = x << 1;
  1451. std::cout << "x = " << x << std::endl;
  1452. x.dump();
  1453. if (x != 4) return false;
  1454.  
  1455. QZ::mpz_base_class y = 2;
  1456. std::cout << "y = " << y << std::endl;
  1457. y = y >> 1;
  1458. std::cout << "y = " << y << std::endl;
  1459. y.dump();
  1460. if (y != 1) return false;
  1461.  
  1462. int z = 3;
  1463. QZ::mpz_base_class Z = z;
  1464. for (int n = 0; n < 8; n++) {
  1465. std::cout << "n = " << n << std::endl;
  1466. std::cout << "z << " << n << " = " << (z << n) << std::endl;
  1467. std::cout << "Z << " << n << " = " << (Z << n) << std::endl;
  1468. if ((z << n) != (Z << n)) return false;
  1469. }
  1470.  
  1471. z = 1024;
  1472. Z = m;
  1473. for (int n = 0; n < 8; n++) {
  1474. std::cout << "n = " << n << std::endl;
  1475. std::cout << "z >> " << n << " = " << (z >> n) << std::endl;
  1476. std::cout << "Z >> " << n << " = " << (Z >> n) << std::endl;
  1477. if ((z >> n) != (Z >> n)) return false;
  1478. }
  1479.  
  1480. QZ::mpz_class w = 3;
  1481. std::cout << "w = " << w << std::endl; // 3
  1482. w <<= 1;
  1483. std::cout << "w = " << w << std::endl; //6
  1484. if (w != 6) return false;
  1485. w <<= 1;
  1486. std::cout << "w = " << w << std::endl; //12
  1487. if (w != 12) return false;
  1488. w <<= 1;
  1489. std::cout << "w = " << w << std::endl;//24
  1490. if (w != 24) return false;
  1491.  
  1492. w = 1024;
  1493. std::cout << "w = " << w << std::endl; // 1024
  1494. w >>= 1;
  1495. std::cout << "w = " << w << std::endl; // 512
  1496. if (w != 512) return false;
  1497. w >>= 1;
  1498. std::cout << "w = " << w << std::endl; // 256
  1499. if (w != 256) return false;
  1500. w >>= 1;
  1501. std::cout << "w = " << w << std::endl;//128
  1502. if (w != 128) return false;
  1503.  
  1504. std::cout << std::endl << "test40C" << std::endl;
  1505.  
  1506. int n = 1;
  1507. QZ::mpz_class t = 1;
  1508. for (int i = 0; i < 10; i++) {
  1509. int m = n << i;
  1510. QZ::mpz_class s = t << i;
  1511. std::cout << "i = " << i << ", m = " << m << ", s = " << s << std::endl;
  1512. std::cout << "s: "; s.dump();
  1513. if (m != s) {
  1514. std::cout << "bad!" << std::endl;
  1515. return false;
  1516. }
  1517. }
  1518.  
  1519. n = 0x1000;
  1520. t = QZ::mpz_class(n);
  1521. for (int i = 0; i < 10; i++) {
  1522. int m = n >> i;
  1523. QZ::mpz_class s = t >> i;
  1524. std::cout << "i = " << i << ", m = " << m << ", s = " << s << std::endl;
  1525. if (m != s) {
  1526. std::cout << "bad!" << std::endl;
  1527. return false;
  1528. }
  1529. }
  1530. return true;
  1531. }
  1532.  
  1533. bool test41() {
  1534. std::cout << "test41" << std::endl;
  1535. QZ::mpz_class n;
  1536. int m;
  1537. n = QZ::mpz_class(1);
  1538. m = n.bitLength();
  1539. if (m != 1) return false;
  1540. n = QZ::mpz_class(2);
  1541. m = n.bitLength();
  1542. if (m != 2) return false;
  1543. n = QZ::mpz_class(3);
  1544. m = n.bitLength();
  1545. if (m != 2) return false;
  1546. n = QZ::mpz_class(4);
  1547. m = n.bitLength();
  1548. if (m != 3) return false;
  1549. n = QZ::mpz_class(8);
  1550. m = n.bitLength();
  1551. if (m != 4) return false;
  1552. n = QZ::mpz_class(16);
  1553. m = n.bitLength();
  1554. if (m != 5) return false;
  1555. n = QZ::mpz_class(32);
  1556. m = n.bitLength();
  1557. if (m != 6) return false;
  1558. n = QZ::mpz_class(64);
  1559. m = n.bitLength();
  1560. if (m != 7) return false;
  1561. n = QZ::mpz_class(128);
  1562. m = n.bitLength();
  1563. if (m != 8) return false;
  1564. n = QZ::mpz_class(256);
  1565. m = n.bitLength();
  1566. if (m != 9) return false;
  1567. return true;
  1568. }
  1569.  
  1570. bool test42() {
  1571. std::cout << "test42" << std::endl;
  1572. QZ::mpz_base_class r(4 + 256);
  1573. r.test42();
  1574. int m = r.bitLength();
  1575. std::cout << "r = " << r << std::endl;
  1576. std::cout << "m = " << m << std::endl;
  1577. if (m != 3) return false;
  1578. return true;
  1579. }
  1580.  
  1581. bool test43() {// 2018/8/25
  1582. std::cout << "test43" << std::endl;
  1583.  
  1584. QZ::mpz_base_class a = 5, b;
  1585. b = a++;
  1586. std::cout << "a = " << a << std::endl;
  1587. std::cout << "b = " << b << std::endl;
  1588. if (a != 6) return false;
  1589. if (b != 5) return false;
  1590.  
  1591. QZ::mpz_class A = 7, B;
  1592. B = A++;
  1593. std::cout << "A = " << A << std::endl;
  1594. std::cout << "B = " << B << std::endl;
  1595. if (A != 8) return false;
  1596. if (B != 7) return false;
  1597.  
  1598. QZ::mpz_class x = -1;
  1599. x++;
  1600. std::cout << "x = " << x << std::endl;
  1601. if (x != 0) return false;
  1602.  
  1603. QZ::mpz_base_class k, K;
  1604. QZ::mpz_class d, D;
  1605. k = K = 35; d = D = 68;
  1606. for (int n = 0; n < 100; n++) {
  1607. k++;
  1608. d++;
  1609. if (k != K + n + 1) return false;
  1610. if (d != D + n + 1) return false;
  1611. }
  1612. return true;
  1613. }
  1614.  
  1615. bool test44() {// 2018/8/25
  1616. std::cout << "test44" << std::endl;
  1617.  
  1618. QZ::mpz_base_class a = 5, b;
  1619. b = a--;
  1620. std::cout << "a = " << a << std::endl;
  1621. std::cout << "b = " << b << std::endl;
  1622. if (a != 4) return false;
  1623. if (b != 5) return false;
  1624.  
  1625. QZ::mpz_class A = 7, B;
  1626. B = A--;
  1627. std::cout << "A = " << A << std::endl;
  1628. std::cout << "B = " << B << std::endl;
  1629. if (A != 6) return false;
  1630. if (B != 7) return false;
  1631.  
  1632. QZ::mpz_class x = 0;
  1633. x--;
  1634. std::cout << "x = " << x << std::endl;
  1635. x.dump();
  1636. if (x != -1) return false;
  1637. std::cout << "test44 continue." << std::endl;
  1638.  
  1639. QZ::mpz_base_class k, K;
  1640. QZ::mpz_class d, D;
  1641. k = K = 135; d = D = 48;
  1642. for (int n = 0; n < 100; n++) {
  1643. k--;
  1644. d--;
  1645. if (k != K - n - 1) return false;
  1646. if (d != D - n - 1) return false;
  1647. }
  1648.  
  1649. // QZ::mpz_base_class p = 0;
  1650. // p--;
  1651. // std::cout << "p = " << p << std::endl; // p = -1
  1652. // p.dump();
  1653.  
  1654. return true;
  1655. }
  1656.  
  1657. bool test45() {// 2018/8/25
  1658. std::cout << "test45" << std::endl;
  1659.  
  1660. QZ::mpz_base_class a = 5, b;
  1661. b = ++a;
  1662. std::cout << "a = " << a << std::endl;
  1663. std::cout << "b = " << b << std::endl;
  1664. if (a != 6) return false;
  1665. if (b != 6) return false;
  1666.  
  1667. QZ::mpz_class A = 7, B;
  1668. B = ++A;
  1669. std::cout << "A = " << A << std::endl;
  1670. std::cout << "B = " << B << std::endl;
  1671. if (A != 8) return false;
  1672. if (B != 8) return false;
  1673.  
  1674. QZ::mpz_class x = -1;
  1675. ++x;
  1676. std::cout << "x = " << x << std::endl;
  1677. if (x != 0) return false;
  1678.  
  1679. QZ::mpz_base_class k, K;
  1680. QZ::mpz_class d, D;
  1681. k = K = 35; d = D = 68;
  1682. for (int n = 0; n < 100; n++) {
  1683. ++k;
  1684. ++d;
  1685. if (k != K + n + 1) return false;
  1686. if (d != D + n + 1) return false;
  1687. }
  1688.  
  1689. std::cout << "test45 continue." << std::endl;
  1690.  
  1691. a = 5;
  1692. b = --a;
  1693. std::cout << "a = " << a << std::endl;
  1694. std::cout << "b = " << b << std::endl;
  1695. if (a != 4) return false;
  1696. if (b != 4) return false;
  1697.  
  1698. A = 7;
  1699. B = --A;
  1700. std::cout << "A = " << A << std::endl;
  1701. std::cout << "B = " << B << std::endl;
  1702. if (A != 6) return false;
  1703. if (B != 6) return false;
  1704.  
  1705. x = 0;
  1706. --x;
  1707. std::cout << "x = " << x << std::endl;
  1708. x.dump();
  1709. if (x != -1) return false;
  1710.  
  1711. k = K = 135; d = D = 48;
  1712. for (int n = 0; n < 100; n++) {
  1713. std::cout << "n = " << n << std::endl;
  1714. --k;
  1715. --d;
  1716. if (k != K - n - 1) return false;
  1717. if (d != D - n - 1) return false;
  1718. }
  1719.  
  1720. return true;
  1721. }
  1722.  
  1723. bool test46() {// 2018/8/25
  1724. std::cout << "test46" << std::endl;
  1725. QZ::mpz_base_class x = 1;
  1726. bool b;
  1727. b = !x;
  1728. if (b != false) return false;
  1729. x = 0;
  1730. b = !x;
  1731. if (b != true) return false;
  1732. return true;
  1733. }
  1734.  
  1735. bool test47() {
  1736. std::cout << "test47" << std::endl;
  1737. QZ::mpz_base_class x = 5;
  1738. if ((+x) != 5) return false;
  1739. QZ::mpz_class y = 3;
  1740. if ((+y) != 3) return false;
  1741. if ((-y) != -3) return false;
  1742. y = -8;
  1743. if ((+y) != -8) return false;
  1744. if ((-y) != 8) return false;
  1745. /* generalize -> abbrev. */
  1746.  
  1747. return true;
  1748. }
  1749.  
  1750. bool test48() { /* bool() */
  1751. std::cout << "test48" << std::endl;
  1752. QZ::mpz_base_class x = 5;
  1753. if (x) ; else return false;
  1754. x = 0;
  1755. if (x) return false;
  1756.  
  1757. QZ::mpz_class y = 5;
  1758. if (y) ; else return false;
  1759. y = 0;
  1760. if (y) return false;
  1761. /* generalize -> abbrev. */
  1762.  
  1763. return true;
  1764. }
  1765.  
  1766. bool test49() {
  1767. std::cout << "test49" << std::endl;
  1768. int a = 123, b = 45;
  1769. QZ::mpz_base_class x, y;
  1770. /* * * * */
  1771. x = a; y = (x += b); if (x != a + b) return false; if (y != a + b) return false;
  1772. x = a; y = (x -= b); if (x != a - b) return false; if (y != a - b) return false;
  1773. x = a; y = (x *= b); if (x != a * b) return false; if (y != a * b) return false;
  1774. x = a; y = (x /= b); if (x != a / b) return false; if (y != a / b) return false;
  1775. x = a; y = (x %= b); if (x != a % b) return false; if (y != a % b) return false;
  1776. return true;
  1777. }
  1778.  
  1779. bool test50() {
  1780. std::cout << "test50" << std::endl;
  1781. int a = 123, b = 45;
  1782. QZ::mpz_class x, y;
  1783. /* * * * */
  1784. x = a; y = (x += b); if (x != a + b) return false; if (y != a + b) return false;
  1785. x = a; y = (x -= b); if (x != a - b) return false; if (y != a - b) return false;
  1786. x = a; y = (x *= b); if (x != a * b) return false; if (y != a * b) return false;
  1787. x = a; y = (x /= b); if (x != a / b) return false; if (y != a / b) return false;
  1788. x = a; y = (x %= b); if (x != a % b) return false; if (y != a % b) return false;
  1789. return true;
  1790. }
  1791.  
  1792. void test() {
  1793. if (test00() == true) std::cout << "00 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1794. if (test01() == true) std::cout << "01 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1795. if (test02() == true) std::cout << "02 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1796. if (test03() == true) std::cout << "03 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1797. if (test04() == true) std::cout << "04 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1798. if (test05() == true) std::cout << "05 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1799. if (test06() == true) std::cout << "06 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1800. // if (test07() == true) std::cout << "07 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1801. // if (test08() == true) std::cout << "08 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1802. // if (test09() == true) std::cout << "09 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1803. // if (test10() == true) std::cout << "10 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1804. // if (test11() == true) std::cout << "11 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1805. // if (test12() == true) std::cout << "12 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1806. // if (test13() == true) std::cout << "13 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1807. // if (test14() == true) std::cout << "14 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1808. // if (test15() == true) std::cout << "15 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1809. // if (test16() == true) std::cout << "16 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1810. // if (test17() == true) std::cout << "17 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1811. // if (test18() == true) std::cout << "18 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1812. // if (test19() == true) std::cout << "19 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1813. // if (test20() == true) std::cout << "20 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1814. // if (test21() == true) std::cout << "21 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1815. // if (test22() == true) std::cout << "22 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1816. if (test23() == true) std::cout << "23 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1817. if (test24() == true) std::cout << "24 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1818. if (test25() == true) std::cout << "25 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1819. if (test26() == true) std::cout << "26 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1820. if (test27() == true) std::cout << "27 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1821. if (test28() == true) std::cout << "28 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1822. if (test29() == true) std::cout << "29 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1823. if (test30() == true) std::cout << "30 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1824. if (test31() == true) std::cout << "31 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1825. if (test32() == true) std::cout << "32 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1826. if (test33() == true) std::cout << "33 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1827. if (test34() == true) std::cout << "34 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1828. if (test35() == true) std::cout << "35 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1829. if (test36() == true) std::cout << "36 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1830. if (test37() == true) std::cout << "37 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1831. if (test38() == true) std::cout << "38 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1832. if (test39() == true) std::cout << "39 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1833. if (test40() == true) std::cout << "40 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1834. if (test41() == true) std::cout << "41 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1835. if (test42() == true) std::cout << "42 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1836. if (test43() == true) std::cout << "43 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1837. if (test44() == true) std::cout << "44 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1838. if (test45() == true) std::cout << "45 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1839. if (test46() == true) std::cout << "46 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1840. if (test47() == true) std::cout << "47 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1841. if (test48() == true) std::cout << "48 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1842. if (test49() == true) std::cout << "49 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1843. if (test50() == true) std::cout << "50 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
  1844. return;
  1845. }
  1846.  
  1847. int main() {
  1848. test();
  1849. return 0;
  1850. }
  1851. /* end */
  1852.  
Success #stdin #stdout 0.31s 5596KB
stdin
Standard input is empty
stdout
test00
00 Complete.

test01
n = 0: 
01 Complete.

test02
test02:0
n = 1: 0:0,
test02:1
n = 1: 0:1,
test02:2
n = 1: 0:2,
test02:4
n = 1: 0:4,
test02:8
n = 2: 0:0,1:1,
test02:10
n = 2: 0:2,1:1,
test02:16
n = 2: 0:0,1:2,
test02:32
n = 2: 0:0,1:4,
test02:64
n = 3: 0:0,1:0,2:1,
02 Complete.

test03
n = 0: 
n = 1: 0:1,
03 Complete.

test04
n = 0: 
n = 0: 
n = 1: 0:1,
n = 1: 0:1,
04 Complete.

test05
05 Complete.

test06
06 Complete.

test23
n = 0: 
sign = 0
23 Complete.

test24
n = 1: 0:0,
sign = 0
n = 1: 0:1,
sign = 0
n = 1: 0:2,
sign = 0
n = 1: 0:4,
sign = 0
n = 2: 0:0,1:1,
sign = 0
test24:-1
n = 1: 0:1,
sign = 1
test24:-2
n = 1: 0:2,
sign = 1
test24:-4
n = 1: 0:4,
sign = 1
test24:-8
n = 2: 0:0,1:1,
sign = 1
24 Complete.

test25
n = 0: 
sign = 0
n = 2: 0:0,1:1,
sign = 0
n = 2: 0:0,1:1,
sign = 1
25 Complete.

test26
n = 0: 
sign = 0
n = 0: 
sign = 0
n = 1: 0:1,
sign = 0
n = 1: 0:1,
sign = 0
n = 1: 0:1,
sign = 1
n = 1: 0:1,
sign = 1
26 Complete.

test27:1
test27:100
test27:0
test27:-100
27 Complete.

test28
28 Complete.

test29
29 Complete.

test30
x = -1
x = 1
y = -100
y = 100
30 Complete.

test31
3+5=8
-------------
-3+(-5)=-8
-------------
-3+5=2
-------------
-3+1=-2
-------------
5+(-3)=+2
-------------
5+(-8)=-3
-------------
31 Complete.

test32
32 Complete.

test33
33 Complete.

test34
34 Complete.

test35
35 Complete.

test36
36 Complete.

test37
37 Complete.

test38
38 Complete.

test39
t = 5
n = 5, t = 5
n = 12, t = 12
n = 19, t = 19
n = 26, t = 26
n = 33, t = 33
n = 40, t = 40
n = 47, t = 47
n = 54, t = 54
n = 61, t = 61
n = 68, t = 68
n = 75, t = 75
n = 82, t = 82
n = 89, t = 89
n = 96, t = 96
39 Complete.

test40A
a = 4
n = 1: 0:4,
b = 1
n = 1: 0:1,
n = 0
m << 0 = 3
M << 0 = 3
n = 1
m << 1 = 6
M << 1 = 6
n = 2
m << 2 = 12
M << 2 = 12
n = 3
m << 3 = 24
M << 3 = 24
n = 4
m << 4 = 48
M << 4 = 48
n = 5
m << 5 = 96
M << 5 = 96
n = 6
m << 6 = 192
M << 6 = 192
n = 7
m << 7 = 384
M << 7 = 384
n = 0
m >> 0 = 1024
M >> 0 = 1024
n = 1
m >> 1 = 512
M >> 1 = 512
n = 2
m >> 2 = 256
M >> 2 = 256
n = 3
m >> 3 = 128
M >> 3 = 128
n = 4
m >> 4 = 64
M >> 4 = 64
n = 5
m >> 5 = 32
M >> 5 = 32
n = 6
m >> 6 = 16
M >> 6 = 16
n = 7
m >> 7 = 8
M >> 7 = 8
c = 3
c = 6
c = 12
c = 24
c = 1024
c = 512
c = 256
c = 128

test40B
x = 2
x = 4
n = 1: 0:4,
sign = 0
y = 2
y = 1
n = 1: 0:1,
n = 0
z << 0 = 3
Z << 0 = 3
n = 1
z << 1 = 6
Z << 1 = 6
n = 2
z << 2 = 12
Z << 2 = 12
n = 3
z << 3 = 24
Z << 3 = 24
n = 4
z << 4 = 48
Z << 4 = 48
n = 5
z << 5 = 96
Z << 5 = 96
n = 6
z << 6 = 192
Z << 6 = 192
n = 7
z << 7 = 384
Z << 7 = 384
n = 0
z >> 0 = 1024
Z >> 0 = 1024
n = 1
z >> 1 = 512
Z >> 1 = 512
n = 2
z >> 2 = 256
Z >> 2 = 256
n = 3
z >> 3 = 128
Z >> 3 = 128
n = 4
z >> 4 = 64
Z >> 4 = 64
n = 5
z >> 5 = 32
Z >> 5 = 32
n = 6
z >> 6 = 16
Z >> 6 = 16
n = 7
z >> 7 = 8
Z >> 7 = 8
w = 3
w = 6
w = 12
w = 24
w = 1024
w = 512
w = 256
w = 128

test40C
i = 0, m = 1, s = 1
s: n = 1: 0:1,
sign = 0
i = 1, m = 2, s = 2
s: n = 1: 0:2,
sign = 0
i = 2, m = 4, s = 4
s: n = 1: 0:4,
sign = 0
i = 3, m = 8, s = 8
s: n = 2: 0:0,1:1,
sign = 0
i = 4, m = 16, s = 16
s: n = 2: 0:0,1:2,
sign = 0
i = 5, m = 32, s = 32
s: n = 2: 0:0,1:4,
sign = 0
i = 6, m = 64, s = 64
s: n = 3: 0:0,1:0,2:1,
sign = 0
i = 7, m = 128, s = 128
s: n = 3: 0:0,1:0,2:2,
sign = 0
i = 8, m = 256, s = 256
s: n = 3: 0:0,1:0,2:4,
sign = 0
i = 9, m = 512, s = 512
s: n = 4: 0:0,1:0,2:0,3:1,
sign = 0
i = 0, m = 4096, s = 4096
i = 1, m = 2048, s = 2048
i = 2, m = 1024, s = 1024
i = 3, m = 512, s = 512
i = 4, m = 256, s = 256
i = 5, m = 128, s = 128
i = 6, m = 64, s = 64
i = 7, m = 32, s = 32
i = 8, m = 16, s = 16
i = 9, m = 8, s = 8
40 Complete.

test41
41 Complete.

test42
r = 4
m = 3
42 Complete.

test43
a = 6
b = 5
A = 8
B = 7
x = 0
43 Complete.

test44
a = 4
b = 5
A = 6
B = 7
x = -1
n = 1: 0:1,
sign = 1
test44 continue.
44 Complete.

test45
a = 6
b = 6
A = 8
B = 8
x = 0
test45 continue.
a = 4
b = 4
A = 6
B = 6
x = -1
n = 1: 0:1,
sign = 1
n = 0
n = 1
n = 2
n = 3
n = 4
n = 5
n = 6
n = 7
n = 8
n = 9
n = 10
n = 11
n = 12
n = 13
n = 14
n = 15
n = 16
n = 17
n = 18
n = 19
n = 20
n = 21
n = 22
n = 23
n = 24
n = 25
n = 26
n = 27
n = 28
n = 29
n = 30
n = 31
n = 32
n = 33
n = 34
n = 35
n = 36
n = 37
n = 38
n = 39
n = 40
n = 41
n = 42
n = 43
n = 44
n = 45
n = 46
n = 47
n = 48
n = 49
n = 50
n = 51
n = 52
n = 53
n = 54
n = 55
n = 56
n = 57
n = 58
n = 59
n = 60
n = 61
n = 62
n = 63
n = 64
n = 65
n = 66
n = 67
n = 68
n = 69
n = 70
n = 71
n = 72
n = 73
n = 74
n = 75
n = 76
n = 77
n = 78
n = 79
n = 80
n = 81
n = 82
n = 83
n = 84
n = 85
n = 86
n = 87
n = 88
n = 89
n = 90
n = 91
n = 92
n = 93
n = 94
n = 95
n = 96
n = 97
n = 98
n = 99
45 Complete.

test46
46 Complete.

test47
47 Complete.

test48
48 Complete.

test49
49 Complete.

test50
50 Complete.