Skip to content

Conversation

@dlesnoff
Copy link
Contributor

Follow-up of #2430 .
Adds a rand function:

  • nmod_poly
  • nmod_poly_mat
  • mpn_mod
  • fmpz_mod_poly

It seems that implementations of nmod_mpoly randtest functions generate uniformly random coefficients.
I did not add rand functions for basic types like fmpz_mod nor nmod.
I plan to add a rand function for mpn_mod_poly and mpn_mod_mat.
Please forgive me, I based my branch on my previously non-merged branch and it needs some cleanup.

@fredrik-johansson
Copy link
Collaborator

Please forgive me, I based my branch on my previously non-merged branch and it needs some cleanup.

I think you need to rebase on main and force-push to get a clean diff.

@dlesnoff dlesnoff force-pushed the mod_poly-random-generation branch from c1be23c to ba6af38 Compare October 29, 2025 18:07
Sets `f` to a random polynomial with up to the given length and where
each coefficient has up to the given number of bits. The coefficients
are signed randomly.
are random numbers in `[1, n)`, where `n` is the modulus given by the context `ctx`.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Several new things are misplaced here I think. For this specific one, there is no input ctx, for others about they are fmpz_mod_poly but this file is about fmpz_poly.

}
}

void fmpz_randm_nonzero(fmpz_t f, flint_rand_t state, const fmpz_t m) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The current behaviour does not have uniform distribution (it is more likely to generate 1 than other values). Maybe generate uniformly in [0,m-2] (being careful with m=1 or such corner cases), and then add 1?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does m stands for uniform? For me, it stands for modulus since the element is upper bounded by a modulus and is not just a random element with a set number of bits. Sorry, I did not meant to make something uniform.
The functions fmpz_mod_poly_randtest used randm. I prefered creating a randm_nonzero function than using randtest_nonzero.

fmpz_mod_poly_fit_length(poly, len, ctx);
_fmpz_vec_zero(poly->coeffs, len);
fmpz_randm(poly->coeffs + 0, state, fmpz_mod_ctx_modulus(ctx));
fmpz_randm_nonzero(poly->coeffs + 0, state, fmpz_mod_ctx_modulus(ctx));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this change, or why using nonzero almost everywhere?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To have at least a randfull-like functionality. See my comments above.

@vneiger
Copy link
Collaborator

vneiger commented Oct 29, 2025

I cancelled the CI workflow because they were still in testing after almost 4 hours. Please review the code carefully to see what changes to existing functions could have led to this, thanks! (I pointed at some modifications in my comments, but there may be others)

@dlesnoff
Copy link
Contributor Author

fmpz_randtest does not generate a coefficient with increased sparsity (here, 0 with increased probability) but generates a coefficient using a number of bits. For mod functions, it requires to be reduced after being generated.
fmpz_randm generates directly a coefficient in the range [0, m) where m is a bound, but I am unsure if this function has some pseudo-uniformity guarantee (the algorithm is unspecified).
So randtest has a slight different meaning for fmpz than for structures in mod n source files.

There is probably an infinite loop, I'll do a manual bisect.

The randtest functions are using `randm` which generates positive coefficients in [0, m) range with m the modulus given by the context.
The documentation told that the coefficients are randomly signed, so I
fixed that.
I introduced a `randm_nonzero` function in fmpz to ensure that
coefficients are nonzero and replaced all occurences of `randm` in
`fmpz_mod_poly_randtest` functions by this new function.
Apart from the `rand` function, this introduces a `rand_monic` and
a `rand_irreducible` function.
I added _fmpz_mod_vec_rand with the intent to use it in
_mpn_mod_vec_rand but did not use it in the end.

This reverts commit f98e52c.
@dlesnoff dlesnoff force-pushed the mod_poly-random-generation branch from 21ee353 to 59f5c7d Compare October 30, 2025 11:17
@dlesnoff
Copy link
Contributor Author

dlesnoff commented Oct 30, 2025

The tests halt indefinitely after gr_special_fac. I am unsure if it's related to my PR.
This commit is the culprit: Add fmpz_mod_poly_rand, rand_monic, irred funcs

@dlesnoff
Copy link
Contributor Author

Ok, I guess that if a polynomial has nonzero coefficients, it is irreducible with much less probability. This could slow down the tests. I should indeed give up on a "randfull-like" functionality for fmpz_mod_poly_randtest functions but then what would be the point of making another rand function?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants