void fmpz_poly_mod_unsigned(fmpz_poly_t a, const uint32_t mod) { nmod_poly_t nmod_tmp; nmod_poly_init(nmod_tmp, mod); fmpz_poly_get_nmod_poly(nmod_tmp, a); fmpz_poly_set_nmod_poly_unsigned(a, nmod_tmp); nmod_poly_clear(nmod_tmp); }
int main(void) { int i; flint_rand_t state; printf("CRT_ui_unsigned...."); fflush(stdout); flint_randinit(state); for (i = 0; i < 10000; i++) { long bits, prime_bits, length, num_primes, j; fmpz_t mod; fmpz_poly_t A, B, C; nmod_poly_t Amod; mp_limb_t primes[1000]; bits = n_randint(state, 500) + 1; length = n_randint(state, 30) + 1; prime_bits = 1 + n_randint(state, FLINT_BITS - 1); fmpz_poly_init(A); fmpz_poly_init(B); fmpz_poly_init(C); fmpz_poly_randtest_unsigned(A, state, length, bits); fmpz_init(mod); num_primes = 0; primes[0] = n_nextprime(1UL << prime_bits, 0); fmpz_set_ui(mod, primes[0]); while (fmpz_bits(mod) <= bits) { primes[num_primes + 1] = n_nextprime(primes[num_primes], 0); fmpz_mul_ui(mod, mod, primes[num_primes + 1]); num_primes++; } num_primes++; nmod_poly_init(Amod, primes[0]); fmpz_poly_get_nmod_poly(Amod, A); fmpz_poly_set_nmod_poly_unsigned(B, Amod); fmpz_set_ui(mod, primes[0]); for (j = 1; j < num_primes; j++) { nmod_poly_clear(Amod); nmod_poly_init(Amod, primes[j]); fmpz_poly_get_nmod_poly(Amod, A); fmpz_poly_CRT_ui(B, B, mod, Amod, 0); fmpz_mul_ui(mod, mod, primes[j]); } if (!fmpz_poly_equal(B, A)) { printf("FAIL!\n"); printf("primes: "); for (j = 0; j < num_primes; j++) printf("%lu ", primes[j]); printf("\nA: \n"); fmpz_poly_print(A); printf("\nB: \n"); fmpz_poly_print(B); printf("\n"); abort(); } nmod_poly_clear(Amod); fmpz_poly_clear(A); fmpz_poly_clear(B); fmpz_poly_clear(C); fmpz_clear(mod); } flint_randclear(state); _fmpz_cleanup(); printf("PASS\n"); return 0; }