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

test07
n = 0: 
n = 1: 0:3,
07 Complete.

test08
equal: n = 1: 0:0,
equal: n = 1: 0:1,
equal: n = 1: 0:2,
equal: n = 1: 0:3,
equal: n = 1: 0:4,
equal: n = 1: 0:5,
equal: n = 1: 0:6,
equal: n = 1: 0:7,
equal: n = 2: 0:0,1:1,
equal: n = 2: 0:1,1:1,
equal: n = 2: 0:2,1:1,
equal: n = 1: 0:1,
equal: n = 1: 0:2,
equal: n = 1: 0:3,
equal: n = 1: 0:4,
equal: n = 1: 0:5,
equal: n = 1: 0:6,
equal: n = 1: 0:7,
equal: n = 2: 0:0,1:1,
equal: n = 2: 0:1,1:1,
equal: n = 2: 0:2,1:1,
equal: n = 2: 0:3,1:1,
equal: n = 1: 0:2,
equal: n = 1: 0:3,
equal: n = 1: 0:4,
equal: n = 1: 0:5,
equal: n = 1: 0:6,
equal: n = 1: 0:7,
equal: n = 2: 0:0,1:1,
equal: n = 2: 0:1,1:1,
equal: n = 2: 0:2,1:1,
equal: n = 2: 0:3,1:1,
equal: n = 2: 0:4,1:1,
equal: n = 1: 0:3,
equal: n = 1: 0:4,
equal: n = 1: 0:5,
equal: n = 1: 0:6,
equal: n = 1: 0:7,
equal: n = 2: 0:0,1:1,
equal: n = 2: 0:1,1:1,
equal: n = 2: 0:2,1:1,
equal: n = 2: 0:3,1:1,
equal: n = 2: 0:4,1:1,
equal: n = 2: 0:5,1:1,
equal: n = 1: 0:4,
equal: n = 1: 0:5,
equal: n = 1: 0:6,
equal: n = 1: 0:7,
equal: n = 2: 0:0,1:1,
equal: n = 2: 0:1,1:1,
equal: n = 2: 0:2,1:1,
equal: n = 2: 0:3,1:1,
equal: n = 2: 0:4,1:1,
equal: n = 2: 0:5,1:1,
equal: n = 2: 0:6,1:1,
equal: n = 1: 0:5,
equal: n = 1: 0:6,
equal: n = 1: 0:7,
equal: n = 2: 0:0,1:1,
equal: n = 2: 0:1,1:1,
equal: n = 2: 0:2,1:1,
equal: n = 2: 0:3,1:1,
equal: n = 2: 0:4,1:1,
equal: n = 2: 0:5,1:1,
equal: n = 2: 0:6,1:1,
equal: n = 2: 0:7,1:1,
equal: n = 1: 0:6,
equal: n = 1: 0:7,
equal: n = 2: 0:0,1:1,
equal: n = 2: 0:1,1:1,
equal: n = 2: 0:2,1:1,
equal: n = 2: 0:3,1:1,
equal: n = 2: 0:4,1:1,
equal: n = 2: 0:5,1:1,
equal: n = 2: 0:6,1:1,
equal: n = 2: 0:7,1:1,
equal: n = 2: 0:0,1:2,
equal: n = 1: 0:7,
equal: n = 2: 0:0,1:1,
equal: n = 2: 0:1,1:1,
equal: n = 2: 0:2,1:1,
equal: n = 2: 0:3,1:1,
equal: n = 2: 0:4,1:1,
equal: n = 2: 0:5,1:1,
equal: n = 2: 0:6,1:1,
equal: n = 2: 0:7,1:1,
equal: n = 2: 0:0,1:2,
equal: n = 2: 0:1,1:2,
equal: n = 2: 0:0,1:1,
equal: n = 2: 0:1,1:1,
equal: n = 2: 0:2,1:1,
equal: n = 2: 0:3,1:1,
equal: n = 2: 0:4,1:1,
equal: n = 2: 0:5,1:1,
equal: n = 2: 0:6,1:1,
equal: n = 2: 0:7,1:1,
equal: n = 2: 0:0,1:2,
equal: n = 2: 0:1,1:2,
equal: n = 2: 0:2,1:2,
equal: n = 2: 0:1,1:1,
equal: n = 2: 0:2,1:1,
equal: n = 2: 0:3,1:1,
equal: n = 2: 0:4,1:1,
equal: n = 2: 0:5,1:1,
equal: n = 2: 0:6,1:1,
equal: n = 2: 0:7,1:1,
equal: n = 2: 0:0,1:2,
equal: n = 2: 0:1,1:2,
equal: n = 2: 0:2,1:2,
equal: n = 2: 0:3,1:2,
equal: n = 2: 0:2,1:1,
equal: n = 2: 0:3,1:1,
equal: n = 2: 0:4,1:1,
equal: n = 2: 0:5,1:1,
equal: n = 2: 0:6,1:1,
equal: n = 2: 0:7,1:1,
equal: n = 2: 0:0,1:2,
equal: n = 2: 0:1,1:2,
equal: n = 2: 0:2,1:2,
equal: n = 2: 0:3,1:2,
equal: n = 2: 0:4,1:2,
08 Complete.

test09()
n = 0: 
a = 0
n = 1: 0:0,
b = 0
n = 1: 0:1,
c = 1
i + j = 0, z = 0 
i + j = 1, z = 1 
i + j = 2, z = 2 
i + j = 3, z = 3 
i + j = 4, z = 4 
i + j = 5, z = 5 
i + j = 6, z = 6 
i + j = 7, z = 7 
i + j = 8, z = 8 
i + j = 9, z = 9 
i + j = 10, z = 10 
i + j = 11, z = 11 
i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 

i + j = 1, z = 1 
i + j = 2, z = 2 
i + j = 3, z = 3 
i + j = 4, z = 4 
i + j = 5, z = 5 
i + j = 6, z = 6 
i + j = 7, z = 7 
i + j = 8, z = 8 
i + j = 9, z = 9 
i + j = 10, z = 10 
i + j = 11, z = 11 
i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 

i + j = 2, z = 2 
i + j = 3, z = 3 
i + j = 4, z = 4 
i + j = 5, z = 5 
i + j = 6, z = 6 
i + j = 7, z = 7 
i + j = 8, z = 8 
i + j = 9, z = 9 
i + j = 10, z = 10 
i + j = 11, z = 11 
i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 

i + j = 3, z = 3 
i + j = 4, z = 4 
i + j = 5, z = 5 
i + j = 6, z = 6 
i + j = 7, z = 7 
i + j = 8, z = 8 
i + j = 9, z = 9 
i + j = 10, z = 10 
i + j = 11, z = 11 
i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 

i + j = 4, z = 4 
i + j = 5, z = 5 
i + j = 6, z = 6 
i + j = 7, z = 7 
i + j = 8, z = 8 
i + j = 9, z = 9 
i + j = 10, z = 10 
i + j = 11, z = 11 
i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 

i + j = 5, z = 5 
i + j = 6, z = 6 
i + j = 7, z = 7 
i + j = 8, z = 8 
i + j = 9, z = 9 
i + j = 10, z = 10 
i + j = 11, z = 11 
i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 

i + j = 6, z = 6 
i + j = 7, z = 7 
i + j = 8, z = 8 
i + j = 9, z = 9 
i + j = 10, z = 10 
i + j = 11, z = 11 
i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 

i + j = 7, z = 7 
i + j = 8, z = 8 
i + j = 9, z = 9 
i + j = 10, z = 10 
i + j = 11, z = 11 
i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 

i + j = 8, z = 8 
i + j = 9, z = 9 
i + j = 10, z = 10 
i + j = 11, z = 11 
i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 

i + j = 9, z = 9 
i + j = 10, z = 10 
i + j = 11, z = 11 
i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 

i + j = 10, z = 10 
i + j = 11, z = 11 
i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 

i + j = 11, z = 11 
i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 

i + j = 12, z = 12 
i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 

i + j = 13, z = 13 
i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 

i + j = 14, z = 14 
i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 

i + j = 15, z = 15 
i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 

i + j = 16, z = 16 
i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 

i + j = 17, z = 17 
i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 

i + j = 18, z = 18 
i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 

i + j = 19, z = 19 
i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 

i + j = 20, z = 20 
i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 

i + j = 21, z = 21 
i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 

i + j = 22, z = 22 
i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 

i + j = 23, z = 23 
i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 

i + j = 24, z = 24 
i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 

i + j = 25, z = 25 
i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 

i + j = 26, z = 26 
i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 

i + j = 27, z = 27 
i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 

i + j = 28, z = 28 
i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 

i + j = 29, z = 29 
i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 

i + j = 30, z = 30 
i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 

i + j = 31, z = 31 
i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 

i + j = 32, z = 32 
i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 

i + j = 33, z = 33 
i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 

i + j = 34, z = 34 
i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 

i + j = 35, z = 35 
i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 

i + j = 36, z = 36 
i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 

i + j = 37, z = 37 
i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 

i + j = 38, z = 38 
i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 

i + j = 39, z = 39 
i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 
i + j = 89, z = 89 

i + j = 40, z = 40 
i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 
i + j = 89, z = 89 
i + j = 90, z = 90 

i + j = 41, z = 41 
i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 
i + j = 89, z = 89 
i + j = 90, z = 90 
i + j = 91, z = 91 

i + j = 42, z = 42 
i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 
i + j = 89, z = 89 
i + j = 90, z = 90 
i + j = 91, z = 91 
i + j = 92, z = 92 

i + j = 43, z = 43 
i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 
i + j = 89, z = 89 
i + j = 90, z = 90 
i + j = 91, z = 91 
i + j = 92, z = 92 
i + j = 93, z = 93 

i + j = 44, z = 44 
i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 
i + j = 89, z = 89 
i + j = 90, z = 90 
i + j = 91, z = 91 
i + j = 92, z = 92 
i + j = 93, z = 93 
i + j = 94, z = 94 

i + j = 45, z = 45 
i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 
i + j = 89, z = 89 
i + j = 90, z = 90 
i + j = 91, z = 91 
i + j = 92, z = 92 
i + j = 93, z = 93 
i + j = 94, z = 94 
i + j = 95, z = 95 

i + j = 46, z = 46 
i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 
i + j = 89, z = 89 
i + j = 90, z = 90 
i + j = 91, z = 91 
i + j = 92, z = 92 
i + j = 93, z = 93 
i + j = 94, z = 94 
i + j = 95, z = 95 
i + j = 96, z = 96 

i + j = 47, z = 47 
i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 
i + j = 89, z = 89 
i + j = 90, z = 90 
i + j = 91, z = 91 
i + j = 92, z = 92 
i + j = 93, z = 93 
i + j = 94, z = 94 
i + j = 95, z = 95 
i + j = 96, z = 96 
i + j = 97, z = 97 

i + j = 48, z = 48 
i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 
i + j = 89, z = 89 
i + j = 90, z = 90 
i + j = 91, z = 91 
i + j = 92, z = 92 
i + j = 93, z = 93 
i + j = 94, z = 94 
i + j = 95, z = 95 
i + j = 96, z = 96 
i + j = 97, z = 97 
i + j = 98, z = 98 

i + j = 49, z = 49 
i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 
i + j = 89, z = 89 
i + j = 90, z = 90 
i + j = 91, z = 91 
i + j = 92, z = 92 
i + j = 93, z = 93 
i + j = 94, z = 94 
i + j = 95, z = 95 
i + j = 96, z = 96 
i + j = 97, z = 97 
i + j = 98, z = 98 
i + j = 99, z = 99 

i + j = 50, z = 50 
i + j = 51, z = 51 
i + j = 52, z = 52 
i + j = 53, z = 53 
i + j = 54, z = 54 
i + j = 55, z = 55 
i + j = 56, z = 56 
i + j = 57, z = 57 
i + j = 58, z = 58 
i + j = 59, z = 59 
i + j = 60, z = 60 
i + j = 61, z = 61 
i + j = 62, z = 62 
i + j = 63, z = 63 
i + j = 64, z = 64 
i + j = 65, z = 65 
i + j = 66, z = 66 
i + j = 67, z = 67 
i + j = 68, z = 68 
i + j = 69, z = 69 
i + j = 70, z = 70 
i + j = 71, z = 71 
i + j = 72, z = 72 
i + j = 73, z = 73 
i + j = 74, z = 74 
i + j = 75, z = 75 
i + j = 76, z = 76 
i + j = 77, z = 77 
i + j = 78, z = 78 
i + j = 79, z = 79 
i + j = 80, z = 80 
i + j = 81, z = 81 
i + j = 82, z = 82 
i + j = 83, z = 83 
i + j = 84, z = 84 
i + j = 85, z = 85 
i + j = 86, z = 86 
i + j = 87, z = 87 
i + j = 88, z = 88 
i + j = 89, z = 89 
i + j = 90, z = 90 
i + j = 91, z = 91 
i + j = 92, z = 92 
i + j = 93, z = 93 
i + j = 94, z = 94 
i + j = 95, z = 95 
i + j = 96, z = 96 
i + j = 97, z = 97 
i + j = 98, z = 98 
i + j = 99, z = 99 
i + j = 100, z = 100 

09 Complete.

test10()
10 Complete.

test11()
n = 1: 0:2,
n = 0: 
n = 1: 0:5,
11 Complete.

test12()
12 Complete.

test13()
5>7?
c > a == 0
!(5<7)?
a > c == 1
13 Complete.

test14()
n = 0: 
sign = 0
n = 1: 0:0,
0 0 0 0 0 0 0 0 0 0 0 
0 1 2 3 4 5 6 7 8 9 10 
0 2 4 6 8 10 12 14 16 18 20 
0 3 6 9 12 15 18 21 24 27 30 
0 4 8 12 16 20 24 28 32 36 40 
0 5 10 15 20 25 30 35 40 45 50 
0 6 12 18 24 30 36 42 48 54 60 
0 7 14 21 28 35 42 49 56 63 70 
0 8 16 24 32 40 48 56 64 72 80 
0 9 18 27 36 45 54 63 72 81 90 
0 10 20 30 40 50 60 70 80 90 100 
14 Complete.

test15()
15 Complete.

test16()
(1,0) (0,1) (0,1) (0,1) (0,1) (0,1) (0,1) (0,1) (0,1) (0,1) 
(2,0) (1,0) (0,2) (0,2) (0,2) (0,2) (0,2) (0,2) (0,2) (0,2) 
(3,0) (1,1) (1,0) (0,3) (0,3) (0,3) (0,3) (0,3) (0,3) (0,3) 
(4,0) (2,0) (1,1) (1,0) (0,4) (0,4) (0,4) (0,4) (0,4) (0,4) 
(5,0) (2,1) (1,2) (1,1) (1,0) (0,5) (0,5) (0,5) (0,5) (0,5) 
(6,0) (3,0) (2,0) (1,2) (1,1) (1,0) (0,6) (0,6) (0,6) (0,6) 
(7,0) (3,1) (2,1) (1,3) (1,2) (1,1) (1,0) (0,7) (0,7) (0,7) 
(8,0) (4,0) (2,2) (2,0) (1,3) (1,2) (1,1) (1,0) (0,8) (0,8) 
(9,0) (4,1) (3,0) (2,1) (1,4) (1,3) (1,2) (1,1) (1,0) (0,9) 
(10,0) (5,0) (3,1) (2,2) (2,0) (1,4) (1,3) (1,2) (1,1) (1,0) 
16 Complete.

test17()
17 Complete.

test18()
18 Complete.

test19()
3,11,19,27,35,43,51,59,67,75,83,91,99,
123,115,107,99,91,83,75,67,59,51,43,35,27,
7,21,63,189,567,1701,5103,15309,45927,137781,413343,
500000,166666,55555,18518,6172,2057,685,228,
500095,
19 Complete.

16777216
8388608
4194304
2097152
1048576
524288
262144
131072
65536
32768
16384
8192
4096
2048
1024
512
256
128
64
32
16
8
4
2
1
1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
20 Complete.

(-)
(1)
(-)
(1)
(1)
(-)
(1)
(-)
(-)
(1)
(-)
(1)
(1)
(-)
(1)
(-)
21 Complete.

22 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.

test40
i = 0, m = 1, s = 1
i = 1, m = 2, s = 2
i = 2, m = 4, s = 4
i = 3, m = 8, s = 8
i = 4, m = 16, s = 16
i = 5, m = 32, s = 32
i = 6, m = 64, s = 64
i = 7, m = 128, s = 128
i = 8, m = 256, s = 256
i = 9, m = 512, s = 512
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.

stderr
xmallocdump(): root is NULL.