Skip to content

Commit 8ae366e

Browse files
Optimize nmod_poly_divrem_basecase
1 parent 2cbccc1 commit 8ae366e

8 files changed

Lines changed: 596 additions & 87 deletions

File tree

doc/source/nmod_vec.rst

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,39 @@ Arithmetic operations
141141
`c` and all elements of ``vec`` are assumed to be less than ``mod.n``.
142142

143143

144+
Arithmetic operations without reduction
145+
--------------------------------------------------------------------------------
146+
147+
The following functions set `r_i \gets r_i + v_i \cdot c`,
148+
`0 \le i < len`, with `r` given by ``res`` and `v` given by ``vec``,
149+
without performing modular reduction,
150+
with specific limitations on the inputs.
151+
152+
.. function:: void _nmod_vec_nored_scalar_addmul_halflimb(nn_ptr res, nn_srcptr vec, slong len, ulong c)
153+
154+
Assumes that `v_i` and `c` are half-limb values and that
155+
`r_i + v_i \cdot c` does not overflow a limb.
156+
157+
.. function:: void _nmod_vec_nored_ll_scalar_addmul_halflimb(nn_ptr res, nn_srcptr vec, slong len, ulong c)
158+
159+
The array ``res`` contains ``2 len`` limbs, representing double-limb
160+
integers contiguously.
161+
Assumes that `v_i` and `c` are half-limb values and that
162+
`r_i + v_i \cdot c` does not overflow two limbs.
163+
164+
.. function:: void _nmod_vec_nored_ll_scalar_addmul(nn_ptr res, nn_srcptr vec, slong len, ulong c)
165+
166+
The array ``res`` contains ``2 len`` limbs, representing double-limb
167+
integers contiguously.
168+
Assumes that `r_i + v_i \cdot c` does not overflow two limbs.
169+
170+
.. function:: void _nmod_vec_nored_lll_scalar_addmul(nn_ptr res, nn_srcptr vec, slong len, ulong c)
171+
172+
The array ``res`` contains ``3 len`` limbs, representing triple-limb
173+
integers contiguously.
174+
Assumes that `r_i + v_i \cdot c` does not overflow three limbs.
175+
176+
144177
Dot products
145178
--------------------------------------------------------------------------------
146179

src/gr/nmod.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -964,9 +964,11 @@ static int
964964
_gr_nmod_poly_divrem(nn_ptr Q, nn_ptr R, nn_srcptr A, slong lenA,
965965
nn_srcptr B, slong lenB, gr_ctx_t ctx)
966966
{
967-
if (lenA <= 20 || lenB <= 8 || lenA - lenB <= 6 ||
968-
(NMOD_BITS(NMOD_CTX(ctx)) <= 61 && lenA <= 40) ||
969-
(NMOD_BITS(NMOD_CTX(ctx)) <= 29 && lenA <= 70))
967+
#if FLINT_BITS == 64 && defined(__AVX2__)
968+
if (lenA - lenB < 80 || lenB < ((NMOD_BITS(NMOD_CTX(ctx)) <= 27) ? 400 : 80))
969+
#else
970+
if (lenA - lenB < 80 || lenB < ((NMOD_BITS(NMOD_CTX(ctx)) <= 27) ? 200 : 80))
971+
#endif
970972
{
971973
ulong invB;
972974
int status;

src/nmod_poly/divrem.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ _nmod_poly_divrem(nn_ptr Q, nn_ptr R, nn_srcptr A, slong lenA,
2121
{
2222
ulong invB;
2323

24-
if (lenA <= 20 || lenB <= 8 || lenA - lenB <= 6 ||
25-
(NMOD_BITS(mod) <= 61 && lenA <= 40) ||
26-
(NMOD_BITS(mod) <= 29 && lenA <= 70))
24+
#if FLINT_BITS == 64 && defined(__AVX2__)
25+
if (lenA - lenB < 80 || lenB < ((NMOD_BITS(mod) <= 27) ? 400 : 80))
26+
#else
27+
if (lenA - lenB < 80 || lenB < ((NMOD_BITS(mod) <= 27) ? 200 : 80))
28+
#endif
2729
{
2830
invB = (B[lenB - 1] == 1) ? 1 : n_invmod(B[lenB - 1], mod.n);
2931

0 commit comments

Comments
 (0)