From b9ba6927eca126c64406874120d8e1b95bee7896 Mon Sep 17 00:00:00 2001 From: Richard Kreckel Date: Thu, 15 May 2025 20:42:47 +0200 Subject: [PATCH] Simplify random_modint functor a bit. --- ginac/polynomial/smod_helpers.h | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/ginac/polynomial/smod_helpers.h b/ginac/polynomial/smod_helpers.h index 313be124..305a8a4b 100644 --- a/ginac/polynomial/smod_helpers.h +++ b/ginac/polynomial/smod_helpers.h @@ -69,23 +69,21 @@ static inline cln::cl_I to_cl_I(const ex& e) return cln::the(ex_to(e).to_cl_N()); } +/** + * Generate random integer -p/2 < m <= p/2. + */ struct random_modint { typedef long value_type; const value_type p; - const value_type p_2; + const value_type pm1_2; // (p-1)/2 - random_modint(const value_type& p_) : p(p_), p_2((p >> 1)) + random_modint(const value_type& p_) : p(p_), pm1_2((p-1) >> 1) { } value_type operator()() const { - do { - cln::cl_I tmp_ = cln::random_I(p); - value_type tmp = cln::cl_I_to_long(tmp_); - if (tmp > p_2) - tmp -= p; - return tmp; - } while (true); + cln::cl_I m = cln::random_I(p) - pm1_2; + return cln::cl_I_to_long(m); } }; -- 2.49.0