X-Git-Url: https://ginac.de/CLN/cln.git//cln.git?a=blobdiff_plain;f=src%2Fmodinteger%2Fcl_MI_pow2p1.h;h=cd5a180583da97d6268dca3f820ce646b4a49bb6;hb=b338e09d3bd41878b6528202133f2b9a77777e6b;hp=2b71d30663d4f7ff4a209de9f23fd17b60f49301;hpb=dd9e0f894eec7e2a8cf85078330ddc0a6639090b;p=cln.git diff --git a/src/modinteger/cl_MI_pow2p1.h b/src/modinteger/cl_MI_pow2p1.h index 2b71d30..cd5a180 100644 --- a/src/modinteger/cl_MI_pow2p1.h +++ b/src/modinteger/cl_MI_pow2p1.h @@ -1,21 +1,19 @@ // m > 0, m = 2^m1 + 1 (m1 > 1) +namespace cln { + class cl_heap_modint_ring_pow2p1 : public cl_heap_modint_ring { SUBCLASS_cl_heap_modint_ring() public: // Constructor. - cl_heap_modint_ring_pow2p1 (const cl_I& m, uintL m1); // m = 2^m1 + 1 - // Virtual destructor. + cl_heap_modint_ring_pow2p1 (const cl_I& m, uintC m1); // m = 2^m1 + 1 + // Destructor. ~cl_heap_modint_ring_pow2p1 () {} // Additional information. - uintL m1; + uintC m1; }; -static -#if !(defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ <= 90)) // workaround g++-2.7.2 and egcs-1.0.2-prerelease bug -inline -#endif -const cl_I pow2p1_reduce_modulo (cl_heap_modint_ring* _R, const cl_I& x) +static inline const cl_I pow2p1_reduce_modulo (cl_heap_modint_ring* _R, const cl_I& x) { var cl_heap_modint_ring_pow2p1* R = (cl_heap_modint_ring_pow2p1*)_R; // Method: @@ -26,11 +24,11 @@ const cl_I pow2p1_reduce_modulo (cl_heap_modint_ring* _R, const cl_I& x) { Mutable(cl_I,x); var bool sign = minusp(x); if (sign) { x = lognot(x); } - var const uintL m1 = R->m1; + var const uintC m1 = R->m1; while (x >= R->modulus) { - var uintL xlen = integer_length(x); + var uintC xlen = integer_length(x); var cl_I y = ldb(x,cl_byte(m1,0)); - for (var uintL i = m1; ; ) { + for (var uintC i = m1; ; ) { y = y - ldb(x,cl_byte(m1,i)); i += m1; if (i >= xlen) @@ -58,7 +56,7 @@ static const _cl_MI pow2p1_canonhom (cl_heap_modint_ring* R, const cl_I& x) static const _cl_MI pow2p1_mul (cl_heap_modint_ring* _R, const _cl_MI& x, const _cl_MI& y) { var cl_heap_modint_ring_pow2p1* R = (cl_heap_modint_ring_pow2p1*)_R; - var const uintL m1 = R->m1; + var const uintC m1 = R->m1; var cl_I zr = x.rep * y.rep; // Now 0 <= zr <= 2^(2*m1). zr = ldb(zr,cl_byte(1,2*m1)) - ldb(zr,cl_byte(m1,m1)) + ldb(zr,cl_byte(m1,0)); @@ -69,7 +67,7 @@ static const _cl_MI pow2p1_mul (cl_heap_modint_ring* _R, const _cl_MI& x, const static const _cl_MI pow2p1_square (cl_heap_modint_ring* _R, const _cl_MI& x) { var cl_heap_modint_ring_pow2p1* R = (cl_heap_modint_ring_pow2p1*)_R; - var const uintL m1 = R->m1; + var const uintC m1 = R->m1; var cl_I zr = square(x.rep); // Now 0 <= zr <= 2^(2*m1). zr = ldb(zr,cl_byte(1,2*m1)) - ldb(zr,cl_byte(m1,m1)) + ldb(zr,cl_byte(m1,0)); @@ -91,6 +89,21 @@ static cl_modint_mulops pow2p1_mulops = { std_retract }; +static void cl_modint_ring_pow2p1_destructor (cl_heap* pointer) +{ + (*(cl_heap_modint_ring_pow2p1*)pointer).~cl_heap_modint_ring_pow2p1(); +} + +cl_class cl_class_modint_ring_pow2p1 = { + cl_modint_ring_pow2p1_destructor, + cl_class_flags_modint_ring +}; + // Constructor. -inline cl_heap_modint_ring_pow2p1::cl_heap_modint_ring_pow2p1 (const cl_I& m, uintL _m1) - : cl_heap_modint_ring (m, &std_setops, &pow2p1_addops, &pow2p1_mulops), m1 (_m1) {} +inline cl_heap_modint_ring_pow2p1::cl_heap_modint_ring_pow2p1 (const cl_I& m, uintC _m1) + : cl_heap_modint_ring (m, &std_setops, &pow2p1_addops, &pow2p1_mulops), m1 (_m1) +{ + type = &cl_class_modint_ring_pow2p1; +} + +} // namespace cln