From ba275835b50025829e2b96f625aefab97e13caa9 Mon Sep 17 00:00:00 2001 From: William Hart Date: Mon, 15 Apr 2013 22:30:52 +0100 Subject: [PATCH] Improved loop arithmetic in divrem_classical. --- nn_quadratic.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/nn_quadratic.c b/nn_quadratic.c index b544ad5..d464a15 100644 --- a/nn_quadratic.c +++ b/nn_quadratic.c @@ -235,9 +235,9 @@ void nn_mulmid_classical(nn_t ov, nn_t p, void nn_divrem_classical_preinv_c(nn_t q, nn_t a, len_t m, nn_src_t d, len_t n, preinv2_t dinv, word_t ci) { - long i = m - 1, j = m - n; - word_t d1 = d[n - 1], d2 = d[n - 2]; - + long j; + word_t d1 = d[n - 1]; + ASSERT(q != d); ASSERT(m >= n); ASSERT(n > 1); @@ -245,26 +245,29 @@ void nn_divrem_classical_preinv_c(nn_t q, nn_t a, len_t m, nn_src_t d, || ((ci == d1) && (nn_cmp_m(a + m - n + 1, d, n - 1) < 0))); ASSERT((long) d1 < 0); - for ( ; i >= n - 1; i--, j--) + a += m; + + for (j = m - n; j >= 0; j--) { - divapprox21_preinv2(q[j], ci, a[i], dinv); + a--; + + divapprox21_preinv2(q[j], ci, a[0], dinv); /* a -= d*q1 */ - ci -= nn_submul1(a + j, d, n, q[j]); + ci -= nn_submul1(a - n + 1, d, n, q[j]); /* correct if remainder is too large */ - while (ci || nn_cmp_m(a + j, d, n) >= 0) + if (ci || nn_cmp_m(a - n + 1, d, n) >= 0) { q[j]++; - ci -= nn_sub_m(a + j, a + j, d, n); + ci -= nn_sub_m(a - n + 1, a - n + 1, d, n); } /* fetch next word now that it has been updated */ - ci = a[i]; + ci = a[0]; } } - #endif /* Turn warning back on */ @@ -299,7 +302,7 @@ word_t _nn_divapprox_helper(nn_t q, nn_t a, nn_src_t d, len_t s) word_t nn_divapprox_classical_preinv_c(nn_t q, nn_t a, len_t m, nn_src_t d, len_t n, preinv2_t dinv, word_t ci) { - word_t cy = 0; + word_t cy = 0, d1 = d[n - 1]; len_t s = m - n + 1; ASSERT(q != d);