void _fmpq_poly_scalar_div_ui(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, long len, ulong c) { if (c == 1UL) { if (rpoly != poly) _fmpz_vec_set(rpoly, poly, len); fmpz_set(rden, den); } else { fmpz_t d, fc; ulong ud; fmpz_init(d); fmpz_init(fc); _fmpz_vec_content(d, poly, len); fmpz_set_ui(fc, c); fmpz_gcd(d, d, fc); ud = fmpz_get_ui(d); /* gcd of d and c fits into a ulong */ _fmpz_vec_scalar_divexact_ui(rpoly, poly, len, ud); fmpz_mul_ui(rden, den, c / ud); fmpz_clear(d); fmpz_clear(fc); } }
int main(void) { int i, result; FLINT_TEST_INIT(state); flint_printf("scalar_divexact_ui...."); fflush(stdout); /* Check aliasing of a and b */ for (i = 0; i < 1000 * flint_test_multiplier(); i++) { fmpz *a, *b; ulong n = n_randtest_not_zero(state); slong len = n_randint(state, 100); a = _fmpz_vec_init(len); b = _fmpz_vec_init(len); _fmpz_vec_randtest(a, state, len, 200); _fmpz_vec_scalar_mul_ui(a, a, len, n); _fmpz_vec_scalar_divexact_ui(b, a, len, n); _fmpz_vec_scalar_divexact_ui(a, a, len, n); result = (_fmpz_vec_equal(a, b, len)); if (!result) { flint_printf("FAIL:\n"); _fmpz_vec_print(a, len), flint_printf("\n\n"); _fmpz_vec_print(b, len), flint_printf("\n\n"); abort(); } _fmpz_vec_clear(a, len); _fmpz_vec_clear(b, len); } /* Check that a * n / n == a */ for (i = 0; i < 1000 * flint_test_multiplier(); i++) { fmpz *a, *b; ulong n = n_randtest_not_zero(state); slong len = n_randint(state, 100); a = _fmpz_vec_init(len); b = _fmpz_vec_init(len); _fmpz_vec_randtest(a, state, len, 200); _fmpz_vec_set(b, a, len); _fmpz_vec_scalar_mul_ui(a, a, len, n); _fmpz_vec_scalar_divexact_ui(a, a, len, n); result = (_fmpz_vec_equal(a, b, len)); if (!result) { flint_printf("FAIL:\n"); _fmpz_vec_print(a, len), flint_printf("\n\n"); _fmpz_vec_print(b, len), flint_printf("\n\n"); abort(); } _fmpz_vec_clear(a, len); _fmpz_vec_clear(b, len); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }