diff --git a/sagemath-ntl9.patch b/sagemath-ntl9.patch index 2fc01b5..b3f3d71 100644 --- a/sagemath-ntl9.patch +++ b/sagemath-ntl9.patch @@ -44,13 +44,13 @@ /* This is called once for every single module that links in stdsage */ --- ./src/sage/rings/bernmm/bernmm-test.cpp.orig 2015-02-16 17:15:12.000000000 -0700 -+++ ./src/sage/rings/bernmm/bernmm-test.cpp 2015-05-07 21:39:58.565251320 -0600 ++++ ./src/sage/rings/bernmm/bernmm-test.cpp 2015-09-26 09:19:00.830399741 -0600 @@ -70,7 +70,7 @@ void bern_naive(mpq_t* res, long n) */ int testcase__bern_modp_powg(long p, long k, mpq_t b) { - double pinv = 1 / ((double) p); -+ wide_double pinv = wide_double(1) / wide_double(p); ++ mulmod_t pinv = PrepMulMod(p); // compute B_k mod p using _bern_modp_powg() long x = _bern_modp_powg(p, pinv, k); @@ -59,18 +59,18 @@ int testcase__bern_modp_pow2(long p, long k) { - double pinv = 1 / ((double) p); -+ wide_double pinv = wide_double(1) / wide_double(p); ++ mulmod_t pinv = PrepMulMod(p); if (PowerMod(2, k, p, pinv) == 1) return 1; --- ./src/sage/rings/bernmm/bern_modp.cpp.orig 2015-02-16 17:15:12.000000000 -0700 -+++ ./src/sage/rings/bernmm/bern_modp.cpp 2015-05-07 20:17:37.680381004 -0600 ++++ ./src/sage/rings/bernmm/bern_modp.cpp 2015-09-26 14:15:34.862360481 -0600 @@ -43,14 +43,14 @@ namespace bernmm { pinv = 1 / ((double) p) g = a multiplicative generator of GF(p), in [0, p) */ -long bernsum_powg(long p, double pinv, long k, long g) -+long bernsum_powg(long p, wide_double pinv, long k, long g) ++long bernsum_powg(long p, mulmod_t pinv, long k, long g) { long half_gm1 = (g + ((g & 1) ? 0 : p) - 1) / 2; // (g-1)/2 mod p long g_to_jm1 = 1; @@ -78,7 +78,7 @@ long g_to_km1_to_j = g_to_km1; long sum = 0; - double g_pinv = ((double) g) / ((double) p); -+ wide_double g_pinv = wide_double(g) / wide_double(p); ++ muldivrem_t g_pinv = PrepMulDivRem(g, p); mulmod_precon_t g_to_km1_pinv = PrepMulModPrecon(g_to_km1, p, pinv); for (long j = 1; j <= (p-1)/2; j++) @@ -87,7 +87,7 @@ #endif -long bernsum_pow2(long p, double pinv, long k, long g, long n) -+long bernsum_pow2(long p, wide_double pinv, long k, long g, long n) ++long bernsum_pow2(long p, mulmod_t pinv, long k, long g, long n) { // In the main summation loop we accumulate data into the _tables_ array; // tables[y][z] contributes to the final answer with a weight of @@ -96,7 +96,7 @@ something is different from bernsum_pow2()) */ -long bernsum_pow2_redc(long p, double pinv, long k, long g, long n) -+long bernsum_pow2_redc(long p, wide_double pinv, long k, long g, long n) ++long bernsum_pow2_redc(long p, mulmod_t pinv, long k, long g, long n) { long pinv2 = PrepRedc(p); long F = (1L << (ULONG_BITS/2)) % p; @@ -105,7 +105,7 @@ Algorithm: uses bernsum_powg() to compute the main sum. */ -long _bern_modp_powg(long p, double pinv, long k) -+long _bern_modp_powg(long p, wide_double pinv, long k) ++long _bern_modp_powg(long p, mulmod_t pinv, long k) { Factorisation F(p-1); long g = primitive_root(p, pinv, F); @@ -114,7 +114,7 @@ enough) to compute the main sum. */ -long _bern_modp_pow2(long p, double pinv, long k) -+long _bern_modp_pow2(long p, wide_double pinv, long k) ++long _bern_modp_pow2(long p, mulmod_t pinv, long k) { Factorisation F(p-1); long g = primitive_root(p, pinv, F); @@ -123,7 +123,7 @@ pinv = 1 / ((double) p) */ -long _bern_modp(long p, double pinv, long k) -+long _bern_modp(long p, wide_double pinv, long k) ++long _bern_modp(long p, mulmod_t pinv, long k) { if (PowerMod(2, k, p, pinv) != 1) // 2^k != 1 mod p, so we use the faster version @@ -132,12 +132,12 @@ return -1; - double pinv = 1 / ((double) p); -+ wide_double pinv = wide_double(1) / wide_double (p); ++ mulmod_t pinv = PrepMulMod(p); long x = _bern_modp(p, pinv, m); // = B_m/m mod p return MulMod(x, k, p, pinv); } --- ./src/sage/rings/bernmm/bern_modp.h.orig 2015-02-16 17:15:12.000000000 -0700 -+++ ./src/sage/rings/bernmm/bern_modp.h 2015-05-09 08:06:39.732529882 -0600 ++++ ./src/sage/rings/bernmm/bern_modp.h 2015-09-26 09:19:28.365229754 -0600 @@ -12,6 +12,7 @@ #ifndef BERNMM_BERN_MODP_H #define BERNMM_BERN_MODP_H @@ -152,19 +152,19 @@ */ -long _bern_modp_powg(long p, double pinv, long k); -long _bern_modp_pow2(long p, double pinv, long k); -+long _bern_modp_powg(long p, NTL::wide_double pinv, long k); -+long _bern_modp_pow2(long p, NTL::wide_double pinv, long k); ++long _bern_modp_powg(long p, NTL::mulmod_t pinv, long k); ++long _bern_modp_pow2(long p, NTL::mulmod_t pinv, long k); }; --- ./src/sage/rings/bernmm/bern_modp_util.cpp.orig 2015-02-16 17:15:12.000000000 -0700 -+++ ./src/sage/rings/bernmm/bern_modp_util.cpp 2015-05-07 21:38:06.662182003 -0600 ++++ ./src/sage/rings/bernmm/bern_modp_util.cpp 2015-09-26 09:19:57.474935651 -0600 @@ -20,7 +20,7 @@ NTL_CLIENT; namespace bernmm { -long PowerMod(long a, long ee, long n, double ninv) -+long PowerMod(long a, long ee, long n, wide_double ninv) ++long PowerMod(long a, long ee, long n, mulmod_t ninv) { long x, y; @@ -173,7 +173,7 @@ -long order(long x, long p, double pinv, const Factorisation& F) -+long order(long x, long p, wide_double pinv, const Factorisation& F) ++long order(long x, long p, mulmod_t pinv, const Factorisation& F) { // in the loop below, m is always some multiple of the order of x long m = p - 1; @@ -182,12 +182,12 @@ -long primitive_root(long p, double pinv, const Factorisation& F) -+long primitive_root(long p, wide_double pinv, const Factorisation& F) ++long primitive_root(long p, mulmod_t pinv, const Factorisation& F) { if (p == 2) return 1; --- ./src/sage/rings/bernmm/bern_modp_util.h.orig 2015-02-16 17:15:12.000000000 -0700 -+++ ./src/sage/rings/bernmm/bern_modp_util.h 2015-05-09 08:58:22.618458475 -0600 ++++ ./src/sage/rings/bernmm/bern_modp_util.h 2015-09-26 09:20:26.423623021 -0600 @@ -17,6 +17,7 @@ #include #include @@ -201,7 +201,7 @@ (Implementation is adapted from ZZ.c in NTL 5.4.1.) */ -long PowerMod(long a, long ee, long n, double ninv); -+long PowerMod(long a, long ee, long n, NTL::wide_double ninv); ++long PowerMod(long a, long ee, long n, NTL::mulmod_t ninv); /* @@ -210,14 +210,14 @@ Computes order of x mod p, given the factorisation F of p-1. */ -long order(long x, long p, double pinv, const Factorisation& F); -+long order(long x, long p, NTL::wide_double pinv, const Factorisation& F); ++long order(long x, long p, NTL::mulmod_t pinv, const Factorisation& F); /* Finds the smallest primitive root mod p, given the factorisation F of p-1. */ -long primitive_root(long p, double pinv, const Factorisation& F); -+long primitive_root(long p, NTL::wide_double pinv, const Factorisation& F); ++long primitive_root(long p, NTL::mulmod_t pinv, const Factorisation& F); }; // end namespace