#include <iostream>
#include <cstdio>
#include <cstdlib>
//#include <stdlib.h>
#include <cstdint>
#include <cassert>
#include <string>
typedef int64_t CONTAINER; /* not uint64_t, because using minus-number in mpz_class::operator-() */
unsigned int BIT = 3; /* BIT <= 64bit - 2bit = 62bit */
CONTAINER CMASK = 1ULL << BIT;
CONTAINER BMASK = CMASK - 1;
namespace QZ {
class mpz_base_class {
private:
unsigned int n;
CONTAINER *b;
private:
static void LeftShift(mpz_base_class &a);
static void RightShift(mpz_base_class &a, int &lsb_out);
static void LeftShift2(int &msb, mpz_base_class &a);
static void LeftShift3(mpz_base_class &a, int msb);
protected:
public:
static bool iszero(mpz_base_class const &n);
static void div2(mpz_base_class const &a, mpz_base_class const &b, mpz_base_class &q, mpz_base_class &r);
mpz_base_class(); //
virtual ~mpz_base_class();
mpz_base_class(const unsigned long c);
mpz_base_class(mpz_base_class const &ob);
mpz_base_class &operator=(mpz_base_class const &ob);
// mpz_base_class &operator=(mpz_base_class const &&ob);
friend bool operator==(mpz_base_class const &a, mpz_base_class const &b);
friend bool operator!=(mpz_base_class const &a, mpz_base_class const &b) { return !(a == b); }
friend std::ostream &operator<<(std::ostream &stream, mpz_base_class c);
friend mpz_base_class operator+(mpz_base_class const &a, mpz_base_class const &b);
friend mpz_base_class operator-(mpz_base_class const &a, mpz_base_class const &b);
mpz_base_class operator++(int dmy) { mpz_base_class r = *this; *this = *this + 1; return r; }
mpz_base_class operator--(int dmy) { mpz_base_class r = *this; *this = *this - 1; return r; }
mpz_base_class &operator++() { *this = *this + 1; return *this; }
mpz_base_class &operator--() { *this = *this - 1; return *this; }
mpz_base_class &operator+() { return *this; }
mpz_base_class operator-() = delete;
mpz_base_class operator~() = delete;
explicit operator bool() const { return *this != 0; }
bool operator!() const { return !static_cast<bool>(*this); }
friend bool operator<(mpz_base_class const &a, mpz_base_class const &b);
friend bool operator<=(mpz_base_class const &a, mpz_base_class const &b) { return (a < b) ? true : (a == b) ? true : false; }
friend bool operator>(mpz_base_class const &a, mpz_base_class const &b) { return (a < b) ? false : (a == b) ? false : true; }
friend bool operator>=(mpz_base_class const &a, mpz_base_class const &b) { return (a < b) ? false : (a == b) ? true : true; }
friend mpz_base_class operator*(mpz_base_class const &a, mpz_base_class const &b);
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; }
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; }
mpz_base_class &operator+=(mpz_base_class const &ob) { *this = *this + ob; return *this; }
mpz_base_class &operator-=(mpz_base_class const &ob) { *this = *this - ob; return *this; }
mpz_base_class &operator*=(mpz_base_class const &ob) { *this = *this * ob; return *this; }
mpz_base_class &operator/=(mpz_base_class const &ob) { *this = *this / ob; return *this; }
mpz_base_class &operator%=(mpz_base_class const &ob) { *this = *this % ob; return *this; }
mpz_base_class &operator&=(mpz_base_class const &ob) = delete;
mpz_base_class &operator|=(mpz_base_class const &ob) = delete;
mpz_base_class &operator^=(mpz_base_class const &ob) = delete;
bool testBit(int n);
mpz_base_class operator>>(int n) const { int dmy; mpz_base_class r = *this; for (int i = 0; i < n; i++) RightShift(r, dmy); return r; }
mpz_base_class operator<<(int n) const { mpz_base_class r = *this; for (int i = 0; i < n; i++) LeftShift(r); return r; }
mpz_base_class &operator>>=(int n) { *this = *this >> n; return *this; }
mpz_base_class &operator<<=(int n) { *this = *this << n; return *this; }
int bitLength();
/* for test */
unsigned int get_mpzclass_n() { return this->n; }
CONTAINER *get_mpzclass_b() { return this->b; }
virtual void dump() const {
std::cout << "n = " << this->n << ": ";
for (unsigned int i = 0; i < this->n; i++)
std::cout << i << ":" << this->b[i] << ",";
std::cout << std::endl;
}
void test42() {
// *this == 4 + 256;
this->b[2] = 0;
}
};
class mpz_class {
private:
mpz_base_class base;
bool negative;
public:
mpz_class();
~mpz_class();
mpz_class(const signed long c);
mpz_class(mpz_class const &ob);
mpz_class &operator=(mpz_class const &ob);
// mpz_class &operator=(mpz_class const &&ob);
// mpz_class &operator=(mpz_base_class const &ob); // mpz_base_class と mpz_class の関係を、継承から委譲に変更した時に不要となった
friend bool operator==(mpz_class const &a, mpz_class const &b) { return (a.base == b.base) && (a.negative == b.negative); }
friend bool operator!=(mpz_class const &a, mpz_class const &b) { return !(a == b); }
friend std::ostream &operator<<(std::ostream &stream, mpz_class c);
mpz_class operator-() const { mpz_class r = *this; r.negative = !r.negative; return r; }
mpz_class &operator+() { return *this; }
friend bool operator<(mpz_class const &a, mpz_class const &b);
friend bool operator<=(mpz_class const &a, mpz_class const &b) { return (a < b) ? true : (a == b) ? true : false; }
friend bool operator>(mpz_class const &a, mpz_class const &b) { return (a < b) ? false : (a == b) ? false : true; }
friend bool operator>=(mpz_class const &a, mpz_class const &b) { return (a < b) ? false : (a == b) ? true : true; }
friend mpz_class operator+(mpz_class const &a, mpz_class const &b);
friend mpz_class operator-(mpz_class const &a, mpz_class const &b);
mpz_class operator++(int dmy) { mpz_class r = *this; *this = *this + 1; return r; }
mpz_class operator--(int dmy) { mpz_class r = *this; *this = *this - 1; return r; }
mpz_class &operator++() { *this = *this + 1; return *this; }
mpz_class &operator--() { *this = *this - 1; return *this; }
mpz_class operator~() = delete;
explicit operator bool() const { return *this != 0; }
bool operator!() const { return !static_cast<bool>(*this); }
friend mpz_class operator*(mpz_class const &a, mpz_class const &b);
friend mpz_class operator/(mpz_class const &a, mpz_class const &b);
friend mpz_class operator%(mpz_class const &a, mpz_class const &b);
mpz_class &operator+=(mpz_class const &n) { *this = *this + n; return *this; }
mpz_class &operator-=(mpz_class const &n) { *this = *this - n; return *this; }
mpz_class &operator*=(mpz_class const &n) { *this = *this * n; return *this; }
mpz_class &operator/=(mpz_class const &n) { *this = *this / n; return *this; }
mpz_class &operator%=(mpz_class const &n) { *this = *this % n; return *this; }
mpz_class &operator&=(mpz_class const &ob) = delete;
mpz_class &operator|=(mpz_class const &ob) = delete;
mpz_class &operator^=(mpz_class const &ob) = delete;
mpz_class operator>>(int n) { mpz_class r = *this; r.base >>= n; return r; }
mpz_class operator<<(int n) { mpz_class r = *this; r.base <<= n; return r; }
mpz_class &operator>>=(int n) { *this = *this >> n; return *this; }
mpz_class &operator<<=(int n) { *this = *this << n; return *this; }
int bitLength();
bool get_mpzclass_negative() { return this->negative; }
virtual void dump() const {
this->base.dump();
std::cout << "sign = " << this->negative << std::endl;
}
/* for test */
mpz_base_class get_mpzclass_base() { return this->base; }
};
mpz_base_class::mpz_base_class() {
// std::cout << "mpz_base_class constructor1" << std::endl;
this->n = 0;
this->b = 0;
}
mpz_base_class::~mpz_base_class() {
// std::cout << "mpz_base_class destructor" << std::endl;
if (this->b) delete [] this->b;
this->n = 0;
this->b = 0;
}
mpz_base_class::mpz_base_class(const unsigned long c) {
// std::cout << "mpz_base_class constructor2" << std::endl;
CONTAINER cc;
cc = c;
if (c == 0) {
this->n = 1;
this->b = new CONTAINER [1];
this->b[0] = 0;
return;
}
assert(cc > 0);
CONTAINER *newbody;
unsigned int i, j, r, pos;
this->b = 0;
this->n = 0;
while (cc > 0) {
r = 0;
pos = 1;
for (i = 0; i < BIT; i++) {
if ((cc & 1) != 0) {
r = (r | pos);
} else {
}
pos = pos * 2;
cc = cc / 2;
}
newbody = new CONTAINER [this->n + 1];
for (j = 0; j < this->n; j++)
newbody[j] = this->b[j];
newbody[j] = r;
delete [] this->b;
this->b = newbody;
this->n++;
}
assert(this->n != 0);
}
mpz_base_class::mpz_base_class(const mpz_base_class &ob) {
// std::cout << "mpz_base_class constructor3" << std::endl;
this->n = ob.n;
if (ob.n == 0) {
this->b = 0;
} else {
this->b = new CONTAINER [ob.n];
for (unsigned int i = 0; i < ob.n; i++)
this->b[i] = ob.b[i];
}
assert((this->n == 0 && this->b == 0) || (this->n > 0 && this->b != 0));
}
mpz_base_class &mpz_base_class::operator=(const mpz_base_class &ob) {
// std::cout << "mpz_base_class operator=" << std::endl;
CONTAINER *org_b = this->b; // for checking self-assignment
this->n = ob.n;
if (ob.n == 0) {
this->b = 0;
delete [] org_b;
} else {
this->b = new CONTAINER [ob.n];
for (unsigned int i = 0; i < ob.n; i++)
this->b[i] = ob.b[i];
delete [] org_b;
}
assert((this->n == 0 && this->b == 0) || (this->n > 0 && this->b != 0));
return *this;
}
bool operator==(mpz_base_class const &a, mpz_base_class const &b) {
// std::cout << "mpz_base_class operator==" << std::endl;
unsigned int i, less;
bool isEqual = true;
if (a.n < b.n)
less = a.n;
else
less = b.n;
for (i = 0; i < less; i++)
if (a.b[i] != b.b[i]) {
isEqual = false;
goto label;
}
if (a.n < b.n) {
for (; i < b.n; i++)
if (b.b[i] != 0) {
isEqual = false;
goto label;
}
} else {
for (; i < a.n; i++)
if (a.b[i] != 0) { // be carefull! not b.b[] but a.b[]
isEqual = false;
goto label;
}
}
label:
return isEqual;
}
std::ostream &operator<<(std::ostream &stream, mpz_base_class c) {
// std::cout << "mpz_base_class operator<<" << std::endl;
std::basic_string<char> mod10;
mpz_base_class q, n;
int mod;
bool fzero;
fzero = true;
n = c;
for(;;) {
/* div10(n, q, mod); */
{
q = n;
mod = 0;
for (unsigned int i = 0; i < n.n * BIT; i++) {
/* shift_div(mod, q); */
{
unsigned int cy, i;
cy = 0;
for (i = 0; i < n.n; i++) {
q.b[i] = q.b[i] << 1;
if (cy)
q.b[i] = q.b[i] | 0x01;
cy = (q.b[i] >> BIT);
q.b[i] = q.b[i] & BMASK;
}
mod = mod << 1;
if (cy)
mod = mod | 0x01;
}
if (mod >= 10) {
q.b[0] = q.b[0] | 0x01;
mod = mod - 10;
}
}
}
if (mpz_base_class::iszero(q) && mod == 0)
break;
mod10 = (char)('0' + mod) + mod10;
fzero = false;
n = q;
}
if (fzero)
stream << '0';
else
stream << mod10;
return stream;
}
mpz_base_class operator+(mpz_base_class const &a, mpz_base_class const &b) {
mpz_base_class r;
mpz_base_class const * more_ab;
unsigned int less_n;
if (a.n > b.n) {
r.n = a.n;
more_ab = &a;
less_n = b.n;
} else {
r.n = b.n;
more_ab = &b;
less_n = a.n;
}
r.b = new CONTAINER [r.n];
unsigned int i, carry = 0;
for (i = 0; i < less_n; i++) {
CONTAINER s = a.b[i] + b.b[i] + carry;
if (s >= CMASK) {
carry = 1;
r.b[i] = (s & BMASK);
} else {
carry = 0;
r.b[i] = s; /* need */
}
}
for (;i < r.n; i++) {
CONTAINER s = more_ab->b[i] + carry;
if (s >= CMASK) {
carry = 1;
r.b[i] = (s & BMASK); /* need */
} else {
carry = 0;
r.b[i] = (s & BMASK); /* need */ /* do not to insert break keyword.*/
}
}
if (carry) {
CONTAINER *new_body = new CONTAINER [r.n + 1];
for (i = 0; i < r.n; i++)
new_body[i] = r.b[i];
new_body[i] = carry;
delete [] r.b;
r.b = new_body;
// r.b[r.n] = 1; /* NOT need */
r.n++;
}
return r;
}
bool mpz_base_class::iszero(mpz_base_class const &n) {
bool isZero = true;
for (unsigned int i = 0; i < n.n; i++)
if (n.b[i] != 0) {
isZero = false;
break;
}
return isZero;
}
mpz_base_class operator-(mpz_base_class const &a, mpz_base_class const &b) {
int vCount, moreCount, i;
CONTAINER diff;
int borrowR = 0;
bool flagMore, flagLess;
mpz_base_class r;
flagMore = false;
flagLess = false;
moreCount = a.n;
vCount = a.n;
r = a;
if (a.n > b.n) {
flagMore = true;
vCount = b.n;
moreCount = a.n;
r = a;
}
if (a.n < b.n) {
flagLess = true;
vCount = a.n;
moreCount = b.n;
r = b;
}
borrowR = 0;
for (i = 0; i < vCount; i++) {
diff = a.b[i] - b.b[i] - borrowR;
if (diff < 0) {
borrowR = 1;
r.b[i] = diff + CMASK;
} else {
borrowR = 0;
r.b[i] = diff;
}
}
if (flagMore) {
for (;i < moreCount; i++) {
diff = a.b[i] - borrowR;
if (diff < 0) {
borrowR = 1;
r.b[i] = diff + CMASK;
} else {
borrowR = 0;
r.b[i] = diff;
}
}
}
if (flagLess) {
for (;i < moreCount; i++) {
if (b.b[i] > 0) {
borrowR = 1;
}
}
}
if (borrowR > 0) throw std::underflow_error("negative value.");
return r;
}
bool operator<(mpz_base_class const &a, mpz_base_class const &b) { // if a < b then true
try {
mpz_base_class r = a - b;
} catch (std::underflow_error &e) {
return true;
}
return false;
}
mpz_base_class operator*(mpz_base_class const &a, mpz_base_class const &b) {
mpz_base_class Rshift = b;
mpz_base_class Lshift = a;
mpz_base_class r = 0;
int lsb;
while (!mpz_base_class::iszero(Rshift)) {
mpz_base_class::RightShift(Rshift, lsb);
if (lsb) {
r = r + Lshift;
}
mpz_base_class::LeftShift(Lshift);
}
return r;
}
void mpz_base_class::LeftShift(mpz_base_class &a) {
unsigned int i, msb;
msb = 0;
for (i = 0; i < a.n; i++) {
a.b[i] *= 2;
if (msb > 0)
a.b[i] = (a.b[i] | 0x01);
if (a.b[i] > BMASK) {
msb = 1;
a.b[i] -= CMASK;
} else {
msb = 0;
}
}
if (msb > 0) {
CONTAINER *newbody;
newbody = new CONTAINER [a.n + 1];
newbody[a.n] = 1;
for (unsigned int i = 0; i < a.n; i++) {
newbody[i] = a.b[i];
}
a.n++;
delete [] a.b;
a.b = newbody;
}
}
void mpz_base_class::RightShift(mpz_base_class &a, int &lsb_out) {
int i, lsb;
lsb = 0;
for (i = a.n - 1; i >= 0; --i) {
if (lsb > 0)
a.b[i] = (a.b[i] | CMASK);
if ((a.b[i] & 0x01) > 0)
lsb = 1;
else
lsb = 0;
a.b[i] /= 2;
}
lsb_out = lsb;
if (a.b[a.n - 1] == 0) {
CONTAINER *newbody;
newbody = new CONTAINER [a.n - 1];
for (unsigned int i = 0; i < a.n - 1; i++)
newbody[i] = a.b[i];
a.n--;
delete [] a.b;
a.b = newbody;
}
}
void mpz_base_class::LeftShift2(int &msb, mpz_base_class &a) {
unsigned int i, msb_v;
msb_v = 0;
for (i = 0; i < a.n; i++) {
a.b[i] *= 2;
if (msb_v > 0)
a.b[i] = (a.b[i] | 0x01);
if (a.b[i] > BMASK) {
msb_v = 1;
a.b[i] -= CMASK;
} else {
msb_v = 0;
}
}
msb = msb_v;
}
void mpz_base_class::LeftShift3(mpz_base_class &a, int msb) {
unsigned int i, msb_v;
msb_v = msb;
for (i = 0; i < a.n; i++) {
a.b[i] *= 2;
if (msb_v > 0)
a.b[i] = (a.b[i] | 0x01);
if (a.b[i] > BMASK) {
msb_v = 1;
a.b[i] -= CMASK;
} else {
msb_v = 0;
}
}
if (msb_v > 0) {
CONTAINER *newbody;
newbody = new CONTAINER [a.n + 1];
newbody[a.n] = 1;
for (unsigned int i = 0; i < a.n; i++) {
newbody[i] = a.b[i];
}
a.n++;
delete [] a.b;
a.b = newbody;
}
}
void mpz_base_class::div2(mpz_base_class const &a, mpz_base_class const &b, mpz_base_class &q, mpz_base_class &r) {
if (b == mpz_base_class(0)) {
std::cout << "null devided." << std::endl;
return;
}
/* LeftRest <- LeftShiftBuff */
mpz_base_class LeftRest(0);
mpz_base_class LeftShiftBuff = a;
mpz_base_class Quotient(0);
int msb, lsb;
msb = 0;
int n = a.n * BIT;
while (n > 0) {
// std::cout << "LeftShiftBuff=" << LeftShiftBuff << std::endl;
// std::cout << "LeftRest=" << LeftRest << std::endl;
mpz_base_class::LeftShift2(msb, LeftShiftBuff);
mpz_base_class::LeftShift3(LeftRest, msb);
lsb = 0;
if (b < LeftRest || b == LeftRest) {
LeftRest = LeftRest - b;
lsb = 1;
}
mpz_base_class::LeftShift3(Quotient, lsb);
// std::cout << "Quotient=" << Quotient << std::endl;
n--;
}
q = Quotient;
r = LeftRest;
}
bool mpz_base_class::testBit(int n) {
unsigned int test_byte = n / BIT;
int test_mask = 1 << (n % BIT);
if (test_byte >= this->n) return false;
if ((this->b[test_byte] & test_mask) > 0) return true;
return false;
}
/*----------------------------------------------*/
mpz_class::mpz_class() {
// std::cout << "mpz_class constructor1" << std::endl;
this->base = mpz_base_class();
this->negative = false;
}
mpz_class::~mpz_class() {
// std::cout << "mpz_class destructor1" << std::endl;
this->negative = false;
}
mpz_class::mpz_class(const signed long c) {
// std::cout << "mpz_class costructor2" << std::endl;
if (c >= 0) {
this->base = mpz_base_class(c);
this->negative = false;
} else {
this->base = mpz_base_class(-c);
this->negative = true;
}
}
mpz_class::mpz_class(const mpz_class &ob) {
// std::cout << "mpz_class constructor3" << std::endl;
this->base = ob.base;
this->negative = ob.negative;
}
mpz_class &mpz_class::operator=(mpz_class const &ob) {
// std::cout << "mpz_class operator=(mpz_class&)" << std::endl;
this->base = ob.base;
this->negative = ob.negative;
return *this;
}
// mpz_class &mpz_class::operator=(mpz_base_class const &ob) {
// std::cout << "mpz_class operator=(mpz_base_class&)" << std::endl;
// this->mpz_base_class::operator=(ob);
// this->negative = false;
// return *this;
// }
// bool operator==(mpz_class const &a, mpz_class const &b) {
// std::cout << "mpz_class::operator==" << std::endl;
// if (a.negative == b.negative)
// return operator==(a.base, b.base);
// return false;
// }
std::ostream &operator<<(std::ostream &stream, mpz_class c) {
if (c.negative)
stream << '-';
return operator<<(stream, c.base);
}
mpz_class operator+(mpz_class const &a, mpz_class const &b) {
mpz_class r;
if (!a.negative && !b.negative) {
r.base = a.base + b.base; /* old.comment: operator=(mpz_class, mpz_base_class) */
r.negative = false;
} else if (a.negative && !b.negative) {
mpz_class t = -a; assert(t.negative == false);
if (t.base < b.base) { /* t < b */
r.base = b.base - t.base;
r.negative = false;
} else { /* b < t */
r.base = t.base - b.base;
r.negative = true;
}
if (mpz_base_class::iszero(r.base))
r.negative = false;
} else if (!a.negative && b.negative) {
mpz_class t = -b; assert(t.negative == false);
if (operator<(t.base, a.base) == true) { /* t < a */
r.base = a.base - t.base;
r.negative = false;
} else { /* a < t */
r.base = t.base - a.base;
r.negative = true;
}
if (mpz_base_class::iszero(r.base))
r.negative = false;
} else if (a.negative && b.negative) {
QZ::mpz_class aa = a, bb = b;
aa = -aa; bb = -bb;
r.base = aa.base + bb.base;
r.negative = true;
if (mpz_base_class::iszero(r.base))
r.negative = false;
}
return r;
}
mpz_class operator-(mpz_class const &a, mpz_class const &b) {
QZ::mpz_class r = -b;
return a + r;
}
bool operator<(mpz_class const &a, mpz_class const &b) {
QZ::mpz_class r = a - b;
if (r.negative)
return true;
return false;
}
mpz_class operator*(mpz_class const &a, mpz_class const &b) {
mpz_class x = (a > 0) ? a : -a;
mpz_class y = (b > 0) ? b : -b;
assert(x >= 0 && y >= 0);
mpz_class r;
r.base = x.base * y.base;
if (a >= 0 && b >= 0) {
} else if (a < 0 && b >= 0) {
r = -r;
} else if (a >= 0 && b < 0) {
r = -r;
} if (a < 0 && b < 0) {
}
if (mpz_base_class::iszero(r.base)) r.negative = false;
return r;
}
mpz_class operator/(mpz_class const &a, mpz_class const &b) {
mpz_class x = (a >= 0) ? a : -a;
mpz_class y = (b >= 0) ? b : -b;
mpz_class q, r;
mpz_base_class::div2(x.base, y.base, q.base, r.base);
if (a >= 0 && b >= 0) {
} else if (a < 0 && b >= 0) {
q = -q; r = -r;
if (mpz_base_class::iszero(q.base)) q.negative = false;
if (mpz_base_class::iszero(r.base)) r.negative = false;
} else if (a >= 0 && b < 0) {
q = -q;
if (mpz_base_class::iszero(q.base)) q.negative = false;
if (mpz_base_class::iszero(r.base)) r.negative = false;
} else if (a < 0 && b < 0) {
r = -r;
if (mpz_base_class::iszero(q.base)) q.negative = false;
if (mpz_base_class::iszero(r.base)) q.negative = false;
}
return q;
}
mpz_class operator%(mpz_class const &a, mpz_class const &b) {
mpz_class x = (a >= 0) ? a : -a;
mpz_class y = (b >= 0) ? b : -b;
mpz_class q, r;
mpz_base_class::div2(x.base, y.base, q.base, r.base);
if (a >= 0 && b >= 0) {
} else if (a < 0 && b >= 0) {
q = -q; r = -r;
if (mpz_base_class::iszero(q.base)) q.negative = false;
if (mpz_base_class::iszero(r.base)) r.negative = false;
} else if (a >= 0 && b < 0) {
q = -q;
if (mpz_base_class::iszero(q.base)) q.negative = false;
if (mpz_base_class::iszero(r.base)) r.negative = false;
} else if (a < 0 && b < 0) {
r = -r;
if (mpz_base_class::iszero(q.base)) q.negative = false;
if (mpz_base_class::iszero(r.base)) r.negative = false;
}
return r;
}
int mpz_base_class::bitLength() {
if (this->n == 0)
return 0;
int n = this->n;
int i;
for (i = n - 1; !(b[i] > 0); --i) {}
CONTAINER msb = this->b[i];
int j = 0;
while (msb > 0) {
j++;
msb = msb >> 1;
}
return BIT * i + j;
}
int mpz_class::bitLength() {
return this->base.bitLength();
}
} /* namespace QZ */
bool test00() {
std::cout << "test00" << std::endl;
return true;
}
bool test01() {
/* constructor1, destructor */
std::cout << "test01" << std::endl;
QZ::mpz_base_class a;
a.dump();
if (a.get_mpzclass_n() != 0) return false;
if (a.get_mpzclass_b() != 0) return false;
return true;
}
bool test02() {
/* constructor2 */
std::cout << "test02" << std::endl;
std::cout << "test02:0" << std::endl;
QZ::mpz_base_class a(0);
a.dump();
if (a.get_mpzclass_n() != 1) return false;
if (*a.get_mpzclass_b() != 0) return false;
std::cout << "test02:1" << std::endl;
QZ::mpz_base_class b(1);
b.dump();
if (b.get_mpzclass_n() != 1) return false;
if (*b.get_mpzclass_b() != 1) return false;
std::cout << "test02:2" << std::endl;
QZ::mpz_base_class c(2);
c.dump();
if (c.get_mpzclass_n() != 1) return false;
if (*c.get_mpzclass_b() != 2) return false;
std::cout << "test02:4" << std::endl;
QZ::mpz_base_class d(4);
d.dump();
if (d.get_mpzclass_n() != 1) return false;
if (*d.get_mpzclass_b() != 4) return false;
std::cout << "test02:8" << std::endl;
QZ::mpz_base_class e(8);
e.dump();
if (e.get_mpzclass_n() != 2) return false;
if (*e.get_mpzclass_b() != 0) return false;
if (*(e.get_mpzclass_b() + 1) != 1) return false;
std::cout << "test02:10" << std::endl;
QZ::mpz_base_class f(10);
f.dump();
if (f.get_mpzclass_n() != 2) return false;
if (*f.get_mpzclass_b() != 2) return false;
if (*(f.get_mpzclass_b() + 1) != 1) return false;
std::cout << "test02:16" << std::endl;
QZ::mpz_base_class g(16);
g.dump();
if (g.get_mpzclass_n() != 2) return false;
if (*g.get_mpzclass_b() != 0) return false;
if (*(g.get_mpzclass_b() + 1) != 2) return false;
std::cout << "test02:32" << std::endl;
QZ::mpz_base_class h(32);
h.dump();
if (h.get_mpzclass_n() != 2) return false;
if (*h.get_mpzclass_b() != 0) return false;
if (*(h.get_mpzclass_b() + 1) != 4) return false;
std::cout << "test02:64" << std::endl;
QZ::mpz_base_class i(64);
i.dump();
if (i.get_mpzclass_n() != 3) return false;
if (*i.get_mpzclass_b() != 0) return false;
if (*(i.get_mpzclass_b() + 1) != 0) return false;
if (*(i.get_mpzclass_b() + 2) != 1) return false;
return true;
}
bool test03() {
/* constructor3 */
std::cout << "test03" << std::endl;
QZ::mpz_base_class a;
QZ::mpz_base_class b = a;
b.dump();
if (b.get_mpzclass_n() != 0) return false;
if (b.get_mpzclass_b() != 0) return false;
QZ::mpz_base_class c = 1;
QZ::mpz_base_class d = c;
d.dump();
if (d.get_mpzclass_n() != 1) return false;
if (*d.get_mpzclass_b() != 1) return false;
return true;
}
bool test04() {
/* operator= */
std::cout << "test04" << std::endl;
QZ::mpz_base_class a;
QZ::mpz_base_class b;
b = a;
a.dump();
b.dump();
if (b.get_mpzclass_n() != 0) return false;
if (b.get_mpzclass_b() != 0) return false;
QZ::mpz_base_class c = 1;
c.dump();
QZ::mpz_base_class d;
d = c;
d.dump();
if (d.get_mpzclass_n() != 1) return false;
if (*d.get_mpzclass_b() != 1) return false;
return true;
}
bool test05() {
/* operator== */
std::cout << "test05" << std::endl;
QZ::mpz_base_class a = 1;
QZ::mpz_base_class b = 1;
if (!(a == b)) return false;
QZ::mpz_base_class x = 100;
QZ::mpz_base_class y = 100;
if (!(x == y)) return false;
QZ::mpz_base_class u;
QZ::mpz_base_class v;
if (!(u == v)) return false;
QZ::mpz_base_class w = 0;
if (!(u == w)) return false;
return true;
}
bool test06() {
/* operator==, operator!= */
std::cout << "test06" << std::endl;
QZ::mpz_base_class a = 0;
QZ::mpz_base_class b = 1;
QZ::mpz_base_class c = 1;
if (!(a != b)) return false;
if (b != c) return false;
if (a == b) return false;
if (!(b == c)) return false;
return true;
}
/*---------------------------------------------------------*/
bool test23() {
/* addition sign flag to mpz_class */
/* constructor1 */
std::cout << "test23" << std::endl;
QZ::mpz_class x;
x.dump();
if (x.get_mpzclass_base().get_mpzclass_n() != 0) return false;
if (x.get_mpzclass_base().get_mpzclass_b() != 0) return false;
if (x.get_mpzclass_negative() != 0) return false;
return true;
}
bool test24() {
std::cout << "test24" << std::endl;
QZ::mpz_class a1(0);
a1.dump();
if (a1.get_mpzclass_base().get_mpzclass_n() != 1) return false;
if (*a1.get_mpzclass_base().get_mpzclass_b() != 0) return false;
if (a1.get_mpzclass_negative() != 0) return false;
QZ::mpz_class a2(1);
a2.dump();
if (a2.get_mpzclass_base().get_mpzclass_n() != 1) return false;
if (*a2.get_mpzclass_base().get_mpzclass_b() != 1) return false;
if (a2.get_mpzclass_negative() != 0) return false;
QZ::mpz_class a3(2);
a3.dump();
if (a3.get_mpzclass_base().get_mpzclass_n() != 1) return false;
if (*a3.get_mpzclass_base().get_mpzclass_b() != 2) return false;
if (a3.get_mpzclass_negative() != 0) return false;
QZ::mpz_class a4(4);
a4.dump();
if (a4.get_mpzclass_base().get_mpzclass_n() != 1) return false;
if (*a4.get_mpzclass_base().get_mpzclass_b() != 4) return false;
if (a4.get_mpzclass_negative() != 0) return false;
QZ::mpz_class a5(8);
a5.dump();
if (a5.get_mpzclass_base().get_mpzclass_n() != 2) return false;
if (*a5.get_mpzclass_base().get_mpzclass_b() != 0) return false;
if (*(a5.get_mpzclass_base().get_mpzclass_b() + 1) != 1) return false;
if (a5.get_mpzclass_negative() != 0) return false;
std::cout << "test24:-1" << std::endl;
QZ::mpz_class a6(-1);
a6.dump();
if (a6.get_mpzclass_base().get_mpzclass_n() != 1) return false;
if (*a6.get_mpzclass_base().get_mpzclass_b() != 1) return false;
if (a6.get_mpzclass_negative() != 1) return false;
std::cout << "test24:-2" << std::endl;
QZ::mpz_class a7(-2);
a7.dump();
if (a7.get_mpzclass_base().get_mpzclass_n() != 1) return false;
if (*a7.get_mpzclass_base().get_mpzclass_b() != 2) return false;
if (a7.get_mpzclass_negative() != 1) return false;
std::cout << "test24:-4" << std::endl;
QZ::mpz_class a8(-4);
a8.dump();
if (a8.get_mpzclass_base().get_mpzclass_n() != 1) return false;
if (*a8.get_mpzclass_base().get_mpzclass_b() != 4) return false;
if (a8.get_mpzclass_negative() != 1) return false;
std::cout << "test24:-8" << std::endl;
QZ::mpz_class a9(-8);
a9.dump();
if (a9.get_mpzclass_base().get_mpzclass_n() != 2) return false;
if (*a9.get_mpzclass_base().get_mpzclass_b() != 0) return false;
if (*(a9.get_mpzclass_base().get_mpzclass_b() + 1) != 1) return false;
if (a9.get_mpzclass_negative() != 1) return false;
return true;
}
bool test25() {
std::cout << "test25" << std::endl;
QZ::mpz_class a;
QZ::mpz_class b = a;
b.dump();
if (b.get_mpzclass_base().get_mpzclass_n() != 0) return false;
if (b.get_mpzclass_base().get_mpzclass_b() != 0) return false;
if (b.get_mpzclass_negative() != 0) return false;
QZ::mpz_class c = 8;
QZ::mpz_class d = c;
d.dump();
if (d.get_mpzclass_base().get_mpzclass_n() != 2) return false;
if (*(d.get_mpzclass_base().get_mpzclass_b()) != 0) return false;
if (*(d.get_mpzclass_base().get_mpzclass_b() + 1) != 1) return false;
if (b.get_mpzclass_negative() != 0) return false;
QZ::mpz_class e = -8;
QZ::mpz_class f = e;
f.dump();
if (f.get_mpzclass_base().get_mpzclass_n() != 2) return false;
if (*f.get_mpzclass_base().get_mpzclass_b() != 0) return false;
if (*(f.get_mpzclass_base().get_mpzclass_b() + 1) != 1) return false;
if (f.get_mpzclass_negative() != 1) return false;
return true;
}
bool test26() {
std::cout << "test26" << std::endl;
QZ::mpz_class a;
QZ::mpz_class b;
b = a;
a.dump();
b.dump();
if (b.get_mpzclass_base().get_mpzclass_n() != 0) return false;
if (b.get_mpzclass_base().get_mpzclass_b() != 0) return false;
if (b.get_mpzclass_negative() != 0) return false;
QZ::mpz_class c = 1;
c.dump();
QZ::mpz_class d;
d = c;
d.dump();
if (d.get_mpzclass_base().get_mpzclass_n() != 1) return false;
if (*(d.get_mpzclass_base().get_mpzclass_b()) != 1) return false;
if (d.get_mpzclass_negative() != 0) return false;
QZ::mpz_class e = -1;
e.dump();
QZ::mpz_class f;
f = e;
f.dump();
if (f.get_mpzclass_base().get_mpzclass_n() != 1) return false;
if (*(f.get_mpzclass_base().get_mpzclass_b()) != 1) return false;
if (f.get_mpzclass_negative() != 1) return false;
return true;
}
bool test27() {
std::cout << "test27:1" << std::endl;
QZ::mpz_class a = 1;
QZ::mpz_class b = 1;
if (!(a == b)) return false;
std::cout << "test27:100" << std::endl;
QZ::mpz_class x = 100;
QZ::mpz_class y = 100;
if (!(x == y)) return false;
std::cout << "test27:0" << std::endl;
QZ::mpz_class u;
QZ::mpz_class v;
if (!(u == v)) return false;
QZ::mpz_class w = 0;
if (!(u == w)) return false;
std::cout << "test27:-100" << std::endl;
QZ::mpz_class i = -100;
QZ::mpz_class j = -100;
if (!(i == j)) return false;
QZ::mpz_class k = 100;
if (i == k) return false;
return true;
}
bool test28() {
std::cout << "test28" << std::endl;
QZ::mpz_class a = 0;
QZ::mpz_class b = -1;
QZ::mpz_class c = -1;
if (!(a != b)) return false;
if (b != c) return false;
if (a == b) return false;
if (!(b == c)) return false;
return true;
}
bool test29() {
/* operator-() */
std::cout << "test29" << std::endl;
QZ::mpz_class x = 1;
QZ::mpz_class y = -x;
if (y != -1) return false;
x = QZ::mpz_class(-1);
y = -x;
if (y != 1) return false;
return true;
}
bool test30() {
std::cout << "test30" << std::endl;
QZ::mpz_class x = -1;
std::cout << "x = " << x << std::endl;
x = -x;
std::cout << "x = " << x << std::endl;
if (x.get_mpzclass_base().get_mpzclass_n() != 1) return false;
if (*(x.get_mpzclass_base().get_mpzclass_b()) != 1) return false;
if (x.get_mpzclass_negative() != false) return false;
QZ::mpz_class y = -100;
std::cout << "y = " << y << std::endl;
y = -y;
std::cout << "y = " << y << std::endl;
if (x.get_mpzclass_negative() != false) return false;
return true;
}
bool test31() {
std::cout << "test31" << std::endl;
std::cout << "3+5=8" << std::endl;
QZ::mpz_class a = 3;
QZ::mpz_class b = 5;
QZ::mpz_class c = 8;
if (a + b != c) return false;
std::cout << "-------------" << std::endl;
std::cout << "-3+(-5)=-8" << std::endl;
a = QZ::mpz_class(-3);
b = QZ::mpz_class(-5);
c = QZ::mpz_class(-8);
if (a + b != c) return false;
std::cout << "-------------" << std::endl;
std::cout << "-3+5=2" << std::endl;
a = QZ::mpz_class(-3);
b = QZ::mpz_class(5);
c = QZ::mpz_class(2);
if (a + b != c) return false;
std::cout << "-------------" << std::endl;
std::cout << "-3+1=-2" << std::endl;
a = QZ::mpz_class(-3);
b = QZ::mpz_class(1);
c = QZ::mpz_class(-2);
if (a + b != c) return false;
std::cout << "-------------" << std::endl;
std::cout << "5+(-3)=+2" << std::endl;
a = QZ::mpz_class(5);
b = QZ::mpz_class(-3);
c = QZ::mpz_class(2);
if (a + b != c) return false;
std::cout << "-------------" << std::endl;
std::cout << "5+(-8)=-3" << std::endl;
a = QZ::mpz_class(5);
b = QZ::mpz_class(-8);
c = QZ::mpz_class(-3);
if (a + b != c) return false;
std::cout << "-------------" << std::endl;
return true;
}
bool test32() {
std::cout << "test32" << std::endl;
for (int i = -10; i <= +10; i++) {
for (int j = -10; j <= +10; j++) {
QZ::mpz_class z1 = i + j;
QZ::mpz_class x(i);
QZ::mpz_class y(j);
QZ::mpz_class z2 = x + y;
// std::cout << "z1 = " << i + j << std::endl;
if (z1 != z2) {
std:: cout << "i = " << i << ", j = " << j << std::endl;
std:: cout << "not equal!!" << std::endl;
return false;
}
}
}
return true;
}
bool test33() {
std::cout << "test33" << std::endl;
for (int i = -10; i <= +10; i++) {
for (int j = -10; j <= +10; j++) {
QZ::mpz_class z1 = i - j;
QZ::mpz_class x(i);
QZ::mpz_class y(j);
QZ::mpz_class z2 = x - y;
// std::cout << "z1 = " << i - j << std::endl;
if (z1 != z2) {
std:: cout << "i = " << i << ", j = " << j << std::endl;
std:: cout << "not equal!!" << std::endl;
return false;
}
}
}
return true;
}
bool test34() {
std::cout << "test34" << std::endl;
for (int i = -10; i <= 10; i++) {
for (int j = -10; j <= 10; j++) {
QZ::mpz_class x = i;
QZ::mpz_class y = j;
// std::cout << "i=" << i << ",j=" << j << ",x=" << x << ",y=" << y << std::endl;
// std::cout << i << "==" << j << ": " << (i==j) << std::endl;
// std::cout << x << "==" << y << ": " << (x==y) << std::endl;
if ((i == j) ^ (x == j)) { std::cout << "i==j" << std::endl; return false; }
// std::cout << i << "!=" << j << ": " << (i!=j) << std::endl;
// std::cout << x << "!=" << y << ": " << (x!=y) << std::endl;
if ((i != j) ^ (x != y)) { std::cout << "i!=j" << std::endl; return false; }
if ((i < j) ^ (x < y)) { std::cout << "i<j" << std::endl; return false; }
if ((i <= j) ^ (x <= y)) { std::cout << "i<=j" << std::endl; return false; }
if ((i > j) ^ (x > y)) { std::cout << "i>j" << std::endl; return false; }
if ((i >= j) ^ (x >= y)) { std::cout << "i>=j" << std::endl; return false; }
}
}
return true;
}
bool test35() {
std::cout << "test35" << std::endl;
for (int i = -10; i <= +10; i++) {
for (int j = -10; j <= +10; j++) {
// std::cout << "i = " << i << ", j = " << j << std::endl;
QZ::mpz_class z1 = i * j;
QZ::mpz_class x(i);
QZ::mpz_class y(j);
// std::cout << "z1 = " << i * j << std::endl;
QZ::mpz_class z2 = x * y;
// std::cout << "z2 = " << z2 << std::endl;
if (z1 != z2) {
std:: cout << "i = " << i << ", j = " << j << std::endl;
std:: cout << "not equal!!" << std::endl;
return false;
}
}
}
return true;
}
int seed = 31415926;
int const n11 = 1000;
bool test36() {
std::cout << "test36" << std::endl;
srand(seed);
for (int i = 0; i < n11; i++) {
int a, b;
a = (rand() >> 16);
b = (rand() >> 16);
if (rand() % 2 == 1) a = -a;
if (rand() % 2 == 1) b = -b;
QZ::mpz_class x(a);
QZ::mpz_class y(b);
QZ::mpz_class z = x * y;
// std::cout << "x = " << x << std::endl;
if (z != a * b) {
std::cout << "i = " << i << std::endl;
std::cout << "NOT EQUAL: x = " << x << ", y = " << y << ", a = " << a << ", b = " << b << ", a * b = " << a * b << std::endl;
std::cout << "z = " << z << std::endl;
z.dump();
return false;
}
}
return true;
}
int const n12 = 50;
bool test37() {
std::cout << "test37" << std::endl;
for (int i = -n12; i <= +n12; i++) {
for (int j = -n12; j <= +n12; j++) {
// std::cout << "i = " << i << ", j = " << j << std::endl;
if (j == 0) continue;
QZ::mpz_class q1 = i / j;
QZ::mpz_class r1 = i % j;
QZ::mpz_class x(i);
QZ::mpz_class y(j);
// std::cout << "q1 = " << i / j << std::endl;
QZ::mpz_class q2 = x / y;
// std::cout << "q2 = " << q2 << std::endl;
// std::cout << "r1 = " << i % j << std::endl;
QZ::mpz_class r2 = x % y;
// std::cout << "r2 = " << r2 << std::endl;
if (q1 != q2 || r1 != r2) {
std:: cout << "i = " << i << ", j = " << j << std::endl;
std:: cout << "not equal!!" << std::endl;
return false;
}
}
}
return true;
}
int const n14 = 1000;
bool test38() {
std::cout << "test38" << std::endl;
srand(seed);
for (int i = 0; i < n14; i++) {
QZ::mpz_class x(rand());
QZ::mpz_class y(rand());
if (rand() % 2 == 1) x = -x;
if (rand() % 2 == 1) y = -y;
// std::cout << "x = " << x << std::endl;
QZ::mpz_class q = x / y;
QZ::mpz_class r = x % y;
if (!(q * y + r == x)) {
std::cout << "x = " << x << ",y = " << y << ",q = " << q << ",r = " << r << std::endl;
std::cout << "q * y = " << q * y << std::endl;
std::cout << "q * y + r = " << q * y + r << std::endl;
std::cout << "x = " << q * y + r << std::endl;
std::cout << "not equal!" << std::endl;
return false;
}
}
return true;
}
bool test39() {
std::cout << "test39" << std::endl;
QZ::mpz_class t = 2;
QZ::mpz_class s = 3;
t += s;
std::cout << "t = " << t << std::endl;
if (t != 5) return false;
int n = 5;
int d = 7;
t = QZ::mpz_class(5);
for (; n < 100; n += d, t += d) {
std::cout << "n = " << n << ", t = " << t << std::endl;
if (n != t) {
std::cout << "n = " << n << ", t = " << t << std::endl;
return false;
}
}
return true;
}
bool test40() {
std::cout << "test40A" << std::endl;
QZ::mpz_base_class a = 2;
a = a << 1;
std::cout << "a = " << a << std::endl;
a.dump();
if (a != 4) return false;
QZ::mpz_base_class b = 2;
b = b >> 1;
std::cout << "b = " << b << std::endl;
b.dump();
if (b != 1) return false;
int m = 3;
QZ::mpz_base_class M = m;
for (int n = 0; n < 8; n++) {
std::cout << "n = " << n << std::endl;
std::cout << "m << " << n << " = " << (m << n) << std::endl;
std::cout << "M << " << n << " = " << (M << n) << std::endl;
if ((m << n) != (M << n)) return false;
}
m = 1024;
M = m;
for (int n = 0; n < 8; n++) {
std::cout << "n = " << n << std::endl;
std::cout << "m >> " << n << " = " << (m >> n) << std::endl;
std::cout << "M >> " << n << " = " << (M >> n) << std::endl;
if ((m >> n) != (M >> n)) return false;
}
QZ::mpz_base_class c = 3;
std::cout << "c = " << c << std::endl; // 3
c <<= 1;
std::cout << "c = " << c << std::endl; //6
if (c != 6) return false;
c <<= 1;
std::cout << "c = " << c << std::endl; //12
if (c != 12) return false;
c <<= 1;
std::cout << "c = " << c << std::endl;//24
if (c != 24) return false;
c = 1024;
std::cout << "c = " << c << std::endl; // 1024
c >>= 1;
std::cout << "c = " << c << std::endl; // 512
if (c != 512) return false;
c >>= 1;
std::cout << "c = " << c << std::endl; // 256
if (c != 256) return false;
c >>= 1;
std::cout << "c = " << c << std::endl;//128
if (c != 128) return false;
/* ---------------- */
std::cout << std::endl << "test40B" << std::endl;
QZ::mpz_class x = 2;
std::cout << "x = " << x << std::endl;
x = x << 1;
std::cout << "x = " << x << std::endl;
x.dump();
if (x != 4) return false;
QZ::mpz_base_class y = 2;
std::cout << "y = " << y << std::endl;
y = y >> 1;
std::cout << "y = " << y << std::endl;
y.dump();
if (y != 1) return false;
int z = 3;
QZ::mpz_base_class Z = z;
for (int n = 0; n < 8; n++) {
std::cout << "n = " << n << std::endl;
std::cout << "z << " << n << " = " << (z << n) << std::endl;
std::cout << "Z << " << n << " = " << (Z << n) << std::endl;
if ((z << n) != (Z << n)) return false;
}
z = 1024;
Z = m;
for (int n = 0; n < 8; n++) {
std::cout << "n = " << n << std::endl;
std::cout << "z >> " << n << " = " << (z >> n) << std::endl;
std::cout << "Z >> " << n << " = " << (Z >> n) << std::endl;
if ((z >> n) != (Z >> n)) return false;
}
QZ::mpz_class w = 3;
std::cout << "w = " << w << std::endl; // 3
w <<= 1;
std::cout << "w = " << w << std::endl; //6
if (w != 6) return false;
w <<= 1;
std::cout << "w = " << w << std::endl; //12
if (w != 12) return false;
w <<= 1;
std::cout << "w = " << w << std::endl;//24
if (w != 24) return false;
w = 1024;
std::cout << "w = " << w << std::endl; // 1024
w >>= 1;
std::cout << "w = " << w << std::endl; // 512
if (w != 512) return false;
w >>= 1;
std::cout << "w = " << w << std::endl; // 256
if (w != 256) return false;
w >>= 1;
std::cout << "w = " << w << std::endl;//128
if (w != 128) return false;
std::cout << std::endl << "test40C" << std::endl;
int n = 1;
QZ::mpz_class t = 1;
for (int i = 0; i < 10; i++) {
int m = n << i;
QZ::mpz_class s = t << i;
std::cout << "i = " << i << ", m = " << m << ", s = " << s << std::endl;
std::cout << "s: "; s.dump();
if (m != s) {
std::cout << "bad!" << std::endl;
return false;
}
}
n = 0x1000;
t = QZ::mpz_class(n);
for (int i = 0; i < 10; i++) {
int m = n >> i;
QZ::mpz_class s = t >> i;
std::cout << "i = " << i << ", m = " << m << ", s = " << s << std::endl;
if (m != s) {
std::cout << "bad!" << std::endl;
return false;
}
}
return true;
}
bool test41() {
std::cout << "test41" << std::endl;
QZ::mpz_class n;
int m;
n = QZ::mpz_class(1);
m = n.bitLength();
if (m != 1) return false;
n = QZ::mpz_class(2);
m = n.bitLength();
if (m != 2) return false;
n = QZ::mpz_class(3);
m = n.bitLength();
if (m != 2) return false;
n = QZ::mpz_class(4);
m = n.bitLength();
if (m != 3) return false;
n = QZ::mpz_class(8);
m = n.bitLength();
if (m != 4) return false;
n = QZ::mpz_class(16);
m = n.bitLength();
if (m != 5) return false;
n = QZ::mpz_class(32);
m = n.bitLength();
if (m != 6) return false;
n = QZ::mpz_class(64);
m = n.bitLength();
if (m != 7) return false;
n = QZ::mpz_class(128);
m = n.bitLength();
if (m != 8) return false;
n = QZ::mpz_class(256);
m = n.bitLength();
if (m != 9) return false;
return true;
}
bool test42() {
std::cout << "test42" << std::endl;
QZ::mpz_base_class r(4 + 256);
r.test42();
int m = r.bitLength();
std::cout << "r = " << r << std::endl;
std::cout << "m = " << m << std::endl;
if (m != 3) return false;
return true;
}
bool test43() {// 2018/8/25
std::cout << "test43" << std::endl;
QZ::mpz_base_class a = 5, b;
b = a++;
std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
if (a != 6) return false;
if (b != 5) return false;
QZ::mpz_class A = 7, B;
B = A++;
std::cout << "A = " << A << std::endl;
std::cout << "B = " << B << std::endl;
if (A != 8) return false;
if (B != 7) return false;
QZ::mpz_class x = -1;
x++;
std::cout << "x = " << x << std::endl;
if (x != 0) return false;
QZ::mpz_base_class k, K;
QZ::mpz_class d, D;
k = K = 35; d = D = 68;
for (int n = 0; n < 100; n++) {
k++;
d++;
if (k != K + n + 1) return false;
if (d != D + n + 1) return false;
}
return true;
}
bool test44() {// 2018/8/25
std::cout << "test44" << std::endl;
QZ::mpz_base_class a = 5, b;
b = a--;
std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
if (a != 4) return false;
if (b != 5) return false;
QZ::mpz_class A = 7, B;
B = A--;
std::cout << "A = " << A << std::endl;
std::cout << "B = " << B << std::endl;
if (A != 6) return false;
if (B != 7) return false;
QZ::mpz_class x = 0;
x--;
std::cout << "x = " << x << std::endl;
x.dump();
if (x != -1) return false;
std::cout << "test44 continue." << std::endl;
QZ::mpz_base_class k, K;
QZ::mpz_class d, D;
k = K = 135; d = D = 48;
for (int n = 0; n < 100; n++) {
k--;
d--;
if (k != K - n - 1) return false;
if (d != D - n - 1) return false;
}
// QZ::mpz_base_class p = 0;
// p--;
// std::cout << "p = " << p << std::endl; // p = -1
// p.dump();
return true;
}
bool test45() {// 2018/8/25
std::cout << "test45" << std::endl;
QZ::mpz_base_class a = 5, b;
b = ++a;
std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
if (a != 6) return false;
if (b != 6) return false;
QZ::mpz_class A = 7, B;
B = ++A;
std::cout << "A = " << A << std::endl;
std::cout << "B = " << B << std::endl;
if (A != 8) return false;
if (B != 8) return false;
QZ::mpz_class x = -1;
++x;
std::cout << "x = " << x << std::endl;
if (x != 0) return false;
QZ::mpz_base_class k, K;
QZ::mpz_class d, D;
k = K = 35; d = D = 68;
for (int n = 0; n < 100; n++) {
++k;
++d;
if (k != K + n + 1) return false;
if (d != D + n + 1) return false;
}
std::cout << "test45 continue." << std::endl;
a = 5;
b = --a;
std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
if (a != 4) return false;
if (b != 4) return false;
A = 7;
B = --A;
std::cout << "A = " << A << std::endl;
std::cout << "B = " << B << std::endl;
if (A != 6) return false;
if (B != 6) return false;
x = 0;
--x;
std::cout << "x = " << x << std::endl;
x.dump();
if (x != -1) return false;
k = K = 135; d = D = 48;
for (int n = 0; n < 100; n++) {
std::cout << "n = " << n << std::endl;
--k;
--d;
if (k != K - n - 1) return false;
if (d != D - n - 1) return false;
}
return true;
}
bool test46() {// 2018/8/25
std::cout << "test46" << std::endl;
QZ::mpz_base_class x = 1;
bool b;
b = !x;
if (b != false) return false;
x = 0;
b = !x;
if (b != true) return false;
return true;
}
bool test47() {
std::cout << "test47" << std::endl;
QZ::mpz_base_class x = 5;
if ((+x) != 5) return false;
QZ::mpz_class y = 3;
if ((+y) != 3) return false;
if ((-y) != -3) return false;
y = -8;
if ((+y) != -8) return false;
if ((-y) != 8) return false;
/* generalize -> abbrev. */
return true;
}
bool test48() { /* bool() */
std::cout << "test48" << std::endl;
QZ::mpz_base_class x = 5;
if (x) ; else return false;
x = 0;
if (x) return false;
QZ::mpz_class y = 5;
if (y) ; else return false;
y = 0;
if (y) return false;
/* generalize -> abbrev. */
return true;
}
bool test49() {
std::cout << "test49" << std::endl;
int a = 123, b = 45;
QZ::mpz_base_class x, y;
/* * * * */
x = a; y = (x += b); if (x != a + b) return false; if (y != a + b) return false;
x = a; y = (x -= b); if (x != a - b) return false; if (y != a - b) return false;
x = a; y = (x *= b); if (x != a * b) return false; if (y != a * b) return false;
x = a; y = (x /= b); if (x != a / b) return false; if (y != a / b) return false;
x = a; y = (x %= b); if (x != a % b) return false; if (y != a % b) return false;
return true;
}
bool test50() {
std::cout << "test50" << std::endl;
int a = 123, b = 45;
QZ::mpz_class x, y;
/* * * * */
x = a; y = (x += b); if (x != a + b) return false; if (y != a + b) return false;
x = a; y = (x -= b); if (x != a - b) return false; if (y != a - b) return false;
x = a; y = (x *= b); if (x != a * b) return false; if (y != a * b) return false;
x = a; y = (x /= b); if (x != a / b) return false; if (y != a / b) return false;
x = a; y = (x %= b); if (x != a % b) return false; if (y != a % b) return false;
return true;
}
void test() {
if (test00() == true) std::cout << "00 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test01() == true) std::cout << "01 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test02() == true) std::cout << "02 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test03() == true) std::cout << "03 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test04() == true) std::cout << "04 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test05() == true) std::cout << "05 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test06() == true) std::cout << "06 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test07() == true) std::cout << "07 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test08() == true) std::cout << "08 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test09() == true) std::cout << "09 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test10() == true) std::cout << "10 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test11() == true) std::cout << "11 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test12() == true) std::cout << "12 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test13() == true) std::cout << "13 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test14() == true) std::cout << "14 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test15() == true) std::cout << "15 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test16() == true) std::cout << "16 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test17() == true) std::cout << "17 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test18() == true) std::cout << "18 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test19() == true) std::cout << "19 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test20() == true) std::cout << "20 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test21() == true) std::cout << "21 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
// if (test22() == true) std::cout << "22 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test23() == true) std::cout << "23 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test24() == true) std::cout << "24 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test25() == true) std::cout << "25 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test26() == true) std::cout << "26 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test27() == true) std::cout << "27 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test28() == true) std::cout << "28 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test29() == true) std::cout << "29 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test30() == true) std::cout << "30 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test31() == true) std::cout << "31 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test32() == true) std::cout << "32 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test33() == true) std::cout << "33 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test34() == true) std::cout << "34 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test35() == true) std::cout << "35 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test36() == true) std::cout << "36 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test37() == true) std::cout << "37 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test38() == true) std::cout << "38 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test39() == true) std::cout << "39 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test40() == true) std::cout << "40 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test41() == true) std::cout << "41 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test42() == true) std::cout << "42 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test43() == true) std::cout << "43 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test44() == true) std::cout << "44 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test45() == true) std::cout << "45 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test46() == true) std::cout << "46 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test47() == true) std::cout << "47 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test48() == true) std::cout << "48 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test49() == true) std::cout << "49 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
if (test50() == true) std::cout << "50 Complete.\n" << std::endl; else { std::cout << "***Error***" << std::endl; exit(0); }
return;
}
int main() {
test();
return 0;
}
/* end */