23 template <
class T>
struct Scl<T>
34 Scl<T> (
const char* string,
int base = 10);
35 Scl<T> ( MP_INT new_z ) { z = new_z; }
38 friend ostream& operator << (ostream& os, const Scl<T>& b);
45 friend size_t log (
const Scl<T>& b,
int base);
67 bool operator < (const Scl<T>& rhs)
const;
68 bool operator <= (const Scl<T>& rhs)
const;
119 void Div2Exp (
unsigned long exponent_of_2);
121 void Mod2Exp (
unsigned long exponent_of_2);
122 void Mul2Exp (
unsigned long exponent_of_2);
128 void pow (
unsigned long exp);
129 void pow (
unsigned long base,
unsigned long exp);
131 void quo (
unsigned long divisor);
133 unsigned long rem (
unsigned long divisor);
142 const Scl<T>& divdend,
unsigned long divisor);
148 unsigned long divisor);
208 unsigned long rem (
const Scl<T>& b,
unsigned long divisor);
224 mpz_init_set(&z, &b.z);
230 mpz_init_set_si(&z,
sl);
236 mpz_init_set_ui(&z, ul);
242 mpz_init_set_si(&z, (
long) si);
248 if (mpz_init_set_str(&z,
string, base))
249 cerr <<
"Scl<T>::Scl<T>: The string " <<
string
250 <<
" is not a valid number in base " << base << endl;
259 #if defined(PL_CMM) // || defined(PL_BARTLETT)
276 return mpz_get_ui(&b.
z);
285 return mpz_get_si(&b.
z);
294 return mpz_size(&b.
z);
300 assert(base >= 2 && base <= 36);
301 return mpz_sizeinbase(&b.
z, base);
309 if (b.
z._mp_size == 0)
312 return b.
z._mp_size > 0 ? 1 : -1;
321 return mpz_cmp(&b1.
z, &b2.
z);
327 return mpz_cmp_ui(&b.
z, ul);
333 return mpz_cmp_si(&b.
z, sl);
342 return b.
z._mp_size > 0;
348 return b.
z._mp_size < 0;
354 return b.
z._mp_size == 0;
360 return b.
z._mp_size == 1 && b.
z._mp_d[0] == 1;
366 return b.
z._mp_size == -1 && b.
z._mp_d[0] == 1;
372 return b.
z._mp_size != 0 && (b.
z._mp_d[0] & ((mp_limb_t) 1));
378 return b.
z._mp_size == 0 || (b.
z._mp_d[0] ^ ((mp_limb_t) 0));
384 return mpz_perfect_square_p(&b.
z);
390 return mpz_probab_prime_p(&b.
z, reps);
399 return mpz_cmp(&z, &rhs.
z) == 0;
405 return mpz_cmp(&z, &rhs.
z) != 0;
411 return mpz_cmp(&z, &rhs.
z) > 0;
417 return mpz_cmp(&z, &rhs.
z) >= 0;
423 return mpz_cmp(&z, &rhs.
z) < 0;
429 return mpz_cmp(&z, &rhs.
z) <= 0;
438 return mpz_cmp_si(&z, sl) == 0;
444 return mpz_cmp_si(&z, sl) != 0;
450 return mpz_cmp_si(&z, sl) > 0;
456 return mpz_cmp_si(&z, sl) >= 0;
462 return mpz_cmp_si(&z, sl) < 0;
468 return mpz_cmp_si(&z, sl) <= 0;
477 return mpz_cmp_si(&z, (
long) si) == 0;
483 return mpz_cmp_si(&z, (
long) si) != 0;
489 return mpz_cmp_si(&z, (
long) si) > 0;
495 return mpz_cmp_si(&z, (
long) si) >= 0;
501 return mpz_cmp_si(&z, (
long) si) < 0;
507 return mpz_cmp_si(&z, (
long) si) <= 0;
517 return mpz_cmp_ui(&z, ul) == 0;
523 return mpz_cmp_ui(&z, ul) != 0;
529 return mpz_cmp_ui(&z, ul) > 0;
535 return mpz_cmp_ui(&z, ul) >= 0;
541 return mpz_cmp_ui(&z, ul) < 0;
547 return mpz_cmp_ui(&z, ul) <= 0;
562 mpz_add(&z, &z, &rhs.
z);
568 mpz_sub(&z, &z, &rhs.
z);
574 mpz_mul(&z, &z, &rhs.
z);
581 mpz_divexact(&z, &z, &rhs.
z);
587 mpz_mod(&z, &z, &rhs.
z);
602 mpz_add_ui(&z, &z, ul);
608 mpz_sub_ui(&z, &z, ul);
614 mpz_mul_ui(&z, &z, ul);
620 mpz_div_ui(&z, &z, ul);
626 mpz_mod_ui(&z, &z, ul);
642 mpz_add_ui(&z, &z, (
unsigned long) sl);
644 mpz_sub_ui(&z, &z, ((
unsigned long) -sl));
651 mpz_sub_ui(&z, &z, (
unsigned long) sl);
653 mpz_add_ui(&z, &z, (
unsigned long) sl);
660 mpz_mul_ui(&z, &z, (
unsigned long) sl);
663 z._mp_size = -z._mp_size;
664 mpz_mul_ui(&z, &z, ((
unsigned long) -sl));
672 mpz_div_ui(&z, &z, (
unsigned long) sl);
675 z._mp_size = -z._mp_size;
676 mpz_div_ui(&z, &z, ((
unsigned long) -sl));
692 mpz_add_ui(&z, &z, 1);
698 mpz_sub_ui(&z, &z, 1);
707 mpz_div_2exp(&z, &z, exponent_of_2);
713 mpz_gcd (&z, &z, &b2.
z);
720 mpz_mod_2exp(&z, &z, exponent_of_2);
726 mpz_mul_2exp(&z, &z, exponent_of_2);
732 mpz_powm(&z, &z, &exp.
z, &m.
z);
738 mpz_powm_ui(&z, &z, exp, &m.
z);
745 z._mp_size = - z._mp_size;
757 z._mp_size = - z._mp_size;
763 mpz_pow_ui(&z, &z, exp);
769 mpz_ui_pow_ui(&z, base, exp);
775 mpz_mdiv (&z, &z, &divisor.
z);
781 mpz_mdiv_ui(&z, &z, divisor);
787 mpz_mmod(&z, &z, &divisor.
z);
793 return mpz_mmod_ui(&z, &z, divisor);
805 mpz_sqrtrem(&sqrt.
z, &rem.
z, &b.
z);
811 mpz_mdivmod(&q.
z, &r.
z, &divdend.
z, &divisor.
z);
817 return mpz_mdivmod_ui(&q.
z, &r.
z, &divdend.
z, divisor);
823 mpz_divmod(&q.
z, &r.
z, &divdend.
z, &divisor.
z);
829 mpz_divmod_ui(&q.
z, &r.
z, &divdend.
z, divisor);
835 mpz_gcdext(&gcd.
z, &a.
z, &b.
z, &x.
z, &y.
z);
841 mpz_gcdext(&gcd.
z, &a.
z, 0, &x.
z, &y.
z);
850 #if defined(__GNUG__) && !defined(NO_NRV)
851 #define NRVAL(name) return name
852 #define NRCODE(code) code
853 #define NONRCODE(code)
857 #define NONRCODE(code) code
943 operator + (
unsigned long ul,
const Scl<T>& b)
1014 NRCODE(r.Div2Exp(exponent_of_2);)
1035 NRCODE(r.Mod2Exp(exponent_of_2);)
1042 NRCODE(r.Mul2Exp(exponent_of_2);)
1049 NRCODE(r.PowMod(exp, m);)
1056 NRCODE(r.PowMod(exp, m);)
1109 inline unsigned long
1113 return r.
rem(divisor);
1127 NRCODE(r.pow(base, exp);)
std::istream & operator>>(std::istream &is, Scl< MPF > &b)
Definition: Scl_mpf.hpp:617
unsigned long BigIntToUL(const Scl< T > &b)
Definition: BC.hpp:274
void PowMod(const Scl< T > &exp, const Scl< T > &m)
Scl< T > BigIntPow(unsigned long base, unsigned long exp) NRVAL(r)
Definition: BC.hpp:1125
mpz z
Definition: BC.hpp:160
#define NRVAL(name)
Definition: BC.hpp:855
void SqrtRem(Scl< T > &sqrt, Scl< T > &rem, const Scl< T > &b)
Definition: BC.hpp:803
void pow(unsigned long exp)
Definition: BC.hpp:761
Scl< T > & BigIntFactorial(unsigned long n)
Definition: BC.hpp:1117
void Div2Exp(unsigned long exponent_of_2)
signed long BigIntToSL(const Scl< T > &b)
Definition: BC.hpp:283
void HalfExtGCD(Scl< T > &gcd, Scl< T > &a, const Scl< T > &x, const Scl< T > &y)
Definition: BC.hpp:839
Scl< T > operator-=(const Scl< T > &rhs)
MSKaccmodee MSKint32t MSKsoltypee MSKstakeye MSKrealt MSKrealt * sl
Definition: mosek.h:3209
Scl< T > operator+(const Scl< T > &b1, const Scl< T > &b2)
Definition: BC.hpp:869
Scl< T > operator+=(const Scl< T > &rhs)
Scl< T > & operator/(const Scl< T > &b1, const Scl< T > &b2)
Definition: BC.hpp:890
Scl< T > & PowMod(const Scl< T > &b, const Scl< T > &exp, const Scl< T > &m)
Definition: BC.hpp:1047
bool IsOdd(const Scl< T > &b)
Definition: BC.hpp:370
MSKcallbackcodee MSKsoltypee MSKprostae MSKsolstae MSKstakeye MSKstakeye MSKstakeye MSKrealt MSKrealt MSKrealt * y
Definition: mosek.h:2689
bool operator>=(const Scl< T > &rhs) const
Scl< T > & operator*(const Scl< T > &b1, const Scl< T > &b2)
Definition: BC.hpp:883
MSKaccmodee MSKint32t MSKsoltypee MSKstakeye MSKrealt * x
Definition: mosek.h:3209
Scl< T > & pow(const Scl< T > &base, unsigned long exp)
Definition: BC.hpp:1075
int sign(const Scl< T > &b)
Definition: BC.hpp:307
void Mod2Exp(unsigned long exponent_of_2)
Scl< T > & operator-(const Scl< T > &b)
Definition: BC.hpp:862
void ExtGCD(Scl< T > &gcd, Scl< T > &a, Scl< T > &b, const Scl< T > &x, const Scl< T > &y)
Definition: BC.hpp:833
void quo(const Scl< T > &divisor)
Scl< T > & GCD(const Scl< T > &b1, const Scl< T > &b2)
Definition: BC.hpp:1019
Scl< T > operator*=(const Scl< T > &rhs)
bool operator==(const Scl< T > &rhs) const
void rem(const Scl< T > &divisor)
Scl< T > & rem(const Scl< T > ÷nd, const Scl< T > &divisor)
Definition: BC.hpp:1096
bool IsNegative(const Scl< T > &b)
Definition: BC.hpp:346
void QuoRem(Scl< T > &q, Scl< T > &r, const Scl< T > &divdend, const Scl< T > &divisor)
Definition: BC.hpp:809
bool operator<=(const Scl< T > &rhs) const
Scl< T > operator/=(const Scl< T > &rhs)
int compare(const Scl< T > &b1, const Scl< T > &b2)
Definition: BC.hpp:319
void Mul2Exp(unsigned long exponent_of_2)
Scl< T > & sqrt(const Scl< T > &b)
Definition: BC.hpp:1103
Scl< T > & abs(const Scl< T > &b)
Definition: BC.hpp:1061
void rem(const Scl< T > &divisor)
Definition: BC.hpp:785
Scl< T > operator=(const Scl< T > &rhs)
Scl< T > & Mul2Exp(const Scl< T > &b, unsigned long exponent_of_2)
Definition: BC.hpp:1040
MSKrescodee r
Definition: mosek.h:2321
Scl< T > operator%=(const Scl< T > &rhs)
bool IsOne(const Scl< T > &b)
Definition: BC.hpp:358
Scl< T > & operator%(const Scl< T > &b1, const Scl< T > &b2)
Definition: BC.hpp:897
#define NONRCODE(code)
Definition: BC.hpp:857
bool operator>(const Scl< T > &rhs) const
MSKstreamtypee MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t a
Definition: mosek.h:3833
bool IsEven(const Scl< T > &b)
Definition: BC.hpp:376
void DivMod(Scl< T > &q, Scl< T > &r, const Scl< T > &divdend, const Scl< T > &divisor)
Definition: BC.hpp:821
bool IsPerfectSquare(const Scl< T > &b)
Definition: BC.hpp:382
Scl< T > & Div2Exp(const Scl< T > &b, unsigned long exponent_of_2)
Definition: BC.hpp:1012
#define NRCODE(code)
Definition: BC.hpp:856
Scl< T > & quo(const Scl< T > ÷nd, const Scl< T > &divisor)
Definition: BC.hpp:1082
bool IsProbablyPrime(const Scl< T > &b, int reps)
Definition: BC.hpp:388
void GCD(const Scl< T > &b2)
bool IsPositive(const Scl< T > &b)
Definition: BC.hpp:340
void factorial(unsigned long n)
Scl< T > & Mod2Exp(const Scl< T > &b, unsigned long exponent_of_2)
Definition: BC.hpp:1033
bool operator!=(const Scl< T > &rhs) const
bool IsZero(const Scl< T > &b)
Definition: BC.hpp:352
bool operator<(const Scl< T > &rhs) const
size_t log(const Scl< T > &b)
Definition: BC.hpp:292
Scl< T > & gcd(const Scl< T > &b1, const Scl< T > &b2)
Definition: BC.hpp:1026
void factorial(unsigned long n)
Definition: BC.hpp:749
bool IsMinusOne(const Scl< T > &b)
Definition: BC.hpp:364