void fmpz_poly_q_init(fmpz_poly_q_t rop) { rop->num = flint_malloc(sizeof(fmpz_poly_struct)); rop->den = flint_malloc(sizeof(fmpz_poly_struct)); fmpz_poly_init(rop->num); fmpz_poly_init(rop->den); fmpz_poly_set_si(rop->den, 1); }
/** * \ingroup StringConversions * * Sets the rational function \c rop to the value specified by the * null-terminated string \c s. * * This method has now already been somewhat improved and is not very tolerant * in the handling of malformed input. It expects either legitimate input for * an \c fmpz_poly_t element, or two such inputs separated by a <tt>/</tt> * only, in which case it is also assumed that the second polynomial is * non-zero. * * The rational function is brought into canonical form by calling * #fmpz_poly_q_canonicalize() in this function. * * Returns \c 0 if the string represents a valid rational function and * \c non-zero otherwise. */ int fmpz_poly_q_set_str(fmpz_poly_q_t rop, const char *s) { int ans, i, m; size_t len; char * numstr; len = strlen(s); for (m = 0; m < len; m++) { if (s[m] == '/') break; } if (m == len) { ans = fmpz_poly_set_str(rop->num, s); fmpz_poly_set_si(rop->den, 1); return ans; } else { numstr = flint_malloc(m + 1); if (!numstr) { flint_printf("Exception (fmpz_poly_q_set_str). Memory allocation failed.\n"); abort(); } for (i = 0; i < m; i++) numstr[i] = s[i]; numstr[i] = '\0'; ans = fmpz_poly_set_str(rop->num, numstr); ans |= fmpz_poly_set_str(rop->den, s + (m + 1)); if (ans == 0) fmpz_poly_q_canonicalise(rop); else fmpz_poly_q_zero(rop); flint_free(numstr); return ans; } }
int main() { printf("get_series...."); fflush(stdout); { fmpq_t s; fmpz_holonomic_t re, de, ans; fmpq_init(s); fmpz_holonomic_init(re); fmpz_holonomic_init(de); fmpz_holonomic_init(ans); fmpz_holonomic_fit_length(ans, 4); fmpq_set_si(s, -7, 3); /* exp(x) */ fmpz_holonomic_fun_set_exp(de); fmpz_holonomic_get_series(re, de); fmpz_poly_set_si(ans->coeffs + 0, -1); fmpz_poly_set_si2(ans->coeffs + 1, 1, 1); _fmpz_holonomic_set_length(ans, 2); check(re, ans, de); /* sin/cos(x) */ fmpz_holonomic_fun_set_sin_cos(de); fmpz_holonomic_get_series(re, de); fmpz_poly_set_str(ans->coeffs + 0, "1 1"); fmpz_poly_set_str(ans->coeffs + 1, "0"); fmpz_poly_set_str(ans->coeffs + 2, "3 2 3 1"); _fmpz_holonomic_set_length(ans, 3); check(re, ans, de); /* log(x) */ fmpz_holonomic_fun_set_log(de); fmpz_holonomic_get_series(re, de); fmpz_poly_set_si(ans->coeffs + 0, 1); _fmpz_holonomic_set_length(ans, 1); check(re, ans, de); /* log(s+x) */ fmpz_holonomic_shift_fmpq(de, de, s); fmpz_holonomic_get_series(re, de); fmpz_poly_set_str(ans->coeffs + 0, "2 0 -3"); fmpz_poly_set_str(ans->coeffs + 1, "2 7 7"); _fmpz_holonomic_set_length(ans, 2); check(re, ans, de); /* atan(x) */ fmpz_holonomic_fun_set_atan(de); fmpz_holonomic_get_series(re, de); fmpz_poly_set_str(ans->coeffs + 0, "2 0 1"); fmpz_poly_set_str(ans->coeffs + 1, "0"); fmpz_poly_set_str(ans->coeffs + 2, "2 2 1"); _fmpz_holonomic_set_length(ans, 3); check(re, ans, de); /* atan(s+x) */ fmpz_holonomic_shift_fmpq(de, de, s); fmpz_holonomic_get_series(re, de); fmpz_poly_set_str(ans->coeffs + 0, "2 0 9"); fmpz_poly_set_str(ans->coeffs + 1, "2 -42 -42"); fmpz_poly_set_str(ans->coeffs + 2, "2 116 58"); _fmpz_holonomic_set_length(ans, 3); check(re, ans, de); /* erf(x) */ fmpz_holonomic_fun_set_erf(de); fmpz_holonomic_get_series(re, de); fmpz_poly_set_str(ans->coeffs + 0, "2 0 2"); fmpz_poly_set_str(ans->coeffs + 1, "0"); fmpz_poly_set_str(ans->coeffs + 2, "3 2 3 1"); _fmpz_holonomic_set_length(ans, 3); check(re, ans, de); /* erf(s+x) */ fmpz_holonomic_shift_fmpq(de, de, s); fmpz_holonomic_get_series(re, de); fmpz_poly_set_str(ans->coeffs + 0, "2 0 6"); fmpz_poly_set_str(ans->coeffs + 1, "2 -14 -14"); fmpz_poly_set_str(ans->coeffs + 2, "3 6 9 3"); _fmpz_holonomic_set_length(ans, 3); check(re, ans, de); /* x^s */ fmpz_holonomic_fun_set_pow_fmpq(de, s); fmpz_holonomic_get_series(re, de); fmpz_poly_set_si(ans->coeffs + 0, 1); _fmpz_holonomic_set_length(ans, 1); check(re, ans, de); /* (x+s)^s */ fmpz_holonomic_shift_fmpq(de, de, s); fmpz_holonomic_normalise_content(de); fmpz_holonomic_get_series(re, de); fmpz_poly_set_str(ans->coeffs + 0, "2 -7 -3"); fmpz_poly_set_str(ans->coeffs + 1, "2 7 7"); _fmpz_holonomic_set_length(ans, 2); check(re, ans, de); /* x^n */ fmpz_holonomic_fun_set_pow_fmpz(de, fmpq_numref(s)); fmpz_holonomic_get_series(re, de); fmpz_poly_set_si(ans->coeffs + 0, 1); _fmpz_holonomic_set_length(ans, 1); check(re, ans, de); /* (x+s)^n */ fmpz_holonomic_shift_fmpq(de, de, s); fmpz_holonomic_normalise_content(de); fmpz_holonomic_get_series(re, de); fmpz_poly_set_str(ans->coeffs + 0, "2 -21 -3"); fmpz_poly_set_str(ans->coeffs + 1, "2 7 7"); _fmpz_holonomic_set_length(ans, 2); check(re, ans, de); fmpz_holonomic_clear(re); fmpz_holonomic_clear(de); fmpz_holonomic_clear(ans); fmpq_clear(s); } flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }
int main(void) { int i, result; FLINT_TEST_INIT(state); flint_printf("inv_series_newton...."); fflush(stdout); /* Check Q^{-1} * Q is congruent 1 mod t^n */ for (i = 0; i < 100 * flint_test_multiplier(); i++) { fmpz_poly_t a, b, c, one; slong n = n_randint(state, 80) + 1; fmpz_poly_init(a); fmpz_poly_init(b); fmpz_poly_init(c); fmpz_poly_init(one); fmpz_poly_randtest_not_zero(a, state, n_randint(state, 80) + 1, 100); fmpz_poly_set_coeff_si(a, 0, n_randint(state, 2) ? 1 : -1); fmpz_poly_set_ui(one, 1); fmpz_poly_inv_series_newton(b, a, n); fmpz_poly_mullow(c, a, b, n); result = (fmpz_poly_equal(c, one)); if (!result) { flint_printf("FAIL:\n"); flint_printf("a = "), fmpz_poly_print(a), flint_printf("\n\n"); flint_printf("b = "), fmpz_poly_print(b), flint_printf("\n\n"); flint_printf("c = "), fmpz_poly_print(c), flint_printf("\n\n"); abort(); } fmpz_poly_clear(a); fmpz_poly_clear(b); fmpz_poly_clear(c); fmpz_poly_clear(one); } /* Verify bug fix for the case Q = -1 mod (x) */ { fmpz_poly_t a, b, c, one; slong n = 1; fmpz_poly_init(a); fmpz_poly_init(b); fmpz_poly_init(c); fmpz_poly_init(one); fmpz_poly_set_si(a, -1); fmpz_poly_set_ui(one, 1); fmpz_poly_inv_series_newton(b, a, n); fmpz_poly_mullow(c, a, b, n); result = (fmpz_poly_equal(c, one)); if (!result) { flint_printf("FAIL:\n"); flint_printf("a = "), fmpz_poly_print(a), flint_printf("\n\n"); flint_printf("b = "), fmpz_poly_print(b), flint_printf("\n\n"); flint_printf("c = "), fmpz_poly_print(c), flint_printf("\n\n"); abort(); } fmpz_poly_clear(a); fmpz_poly_clear(b); fmpz_poly_clear(c); fmpz_poly_clear(one); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }
int main(void) { int i, result; flint_rand_t state; printf("set_si_equal...."); fflush(stdout); flint_randinit(state); /* equal polynomials */ for (i = 0; i < 10000; i++) { fmpz_poly_t a, b; long n; fmpz_poly_init(a); fmpz_poly_init(b); n = z_randtest(state); fmpz_poly_set_si(a, n); fmpz_poly_set(b, a); result = (fmpz_poly_equal(a, b)); if (!result) { printf("FAIL:\n"); printf("n = %ld\n\n", n); printf("a = "), fmpz_poly_print(a), printf("\n\n"); printf("b = "), fmpz_poly_print(b), printf("\n\n"); abort(); } fmpz_poly_clear(a); fmpz_poly_clear(b); } for (i = 0; i < 10000; i++) { fmpz_poly_t a, b; long m, n; fmpz_poly_init(a); fmpz_poly_init(b); m = z_randtest(state); n = z_randtest(state); while (m == n) n = z_randtest(state); fmpz_poly_set_si(a, m); fmpz_poly_set_si(b, n); result = (!fmpz_poly_equal(a, b)); if (!result) { printf("FAIL:\n"); printf("m = %ld\n\n", m); printf("n = %ld\n\n", n); printf("a = "), fmpz_poly_print(a), printf("\n\n"); printf("b = "), fmpz_poly_print(b), printf("\n\n"); abort(); } fmpz_poly_clear(a); fmpz_poly_clear(b); } flint_randclear(state); _fmpz_cleanup(); printf("PASS\n"); return 0; }
int main(void) { int i, result; FLINT_TEST_INIT(state); flint_printf("set_si_equal...."); fflush(stdout); /* equal polynomials */ for (i = 0; i < 1000 * flint_test_multiplier(); i++) { fmpz_poly_t a, b; slong n; fmpz_poly_init(a); fmpz_poly_init(b); n = z_randtest(state); fmpz_poly_set_si(a, n); fmpz_poly_set(b, a); result = (fmpz_poly_equal(a, b)); if (!result) { flint_printf("FAIL:\n"); flint_printf("n = %wd\n\n", n); flint_printf("a = "), fmpz_poly_print(a), flint_printf("\n\n"); flint_printf("b = "), fmpz_poly_print(b), flint_printf("\n\n"); abort(); } fmpz_poly_clear(a); fmpz_poly_clear(b); } for (i = 0; i < 1000 * flint_test_multiplier(); i++) { fmpz_poly_t a, b; slong m, n; fmpz_poly_init(a); fmpz_poly_init(b); m = z_randtest(state); n = z_randtest(state); while (m == n) n = z_randtest(state); fmpz_poly_set_si(a, m); fmpz_poly_set_si(b, n); result = (!fmpz_poly_equal(a, b)); if (!result) { flint_printf("FAIL:\n"); flint_printf("m = %wd\n\n", m); flint_printf("n = %wd\n\n", n); flint_printf("a = "), fmpz_poly_print(a), flint_printf("\n\n"); flint_printf("b = "), fmpz_poly_print(b), flint_printf("\n\n"); abort(); } fmpz_poly_clear(a); fmpz_poly_clear(b); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }