43void flint_final_cleanup_thread(
void) {
50void flint_final_cleanup_master(
void) {
51 flint::cleanup_master();
57WORD* flint_div(PHEAD WORD *a, WORD *b,
const WORD must_fit_term) {
63 const bool with_arghead =
false;
64 const bool sort_vars =
false;
65 const flint::var_map_t var_map = flint::get_variables(e, with_arghead, sort_vars);
67 const bool return_rem =
false;
68 if ( var_map.size() > 1 ) {
69 return flint::divmod_mpoly(BHEAD a, b, return_rem, must_fit_term, var_map, sort_vars);
72 return flint::divmod_poly(BHEAD a, b, return_rem, must_fit_term, var_map);
79int flint_factorize_argument(PHEAD WORD *argin, WORD *argout) {
81 const bool with_arghead =
true;
82 const bool sort_vars =
true;
83 const flint::var_map_t var_map = flint::get_variables(vector<WORD*>(1,argin), with_arghead,
86 const bool is_fun_arg =
true;
87 if ( var_map.size() > 1 ) {
88 flint::factorize_mpoly(BHEAD argin, argout, with_arghead, is_fun_arg, var_map, sort_vars);
91 flint::factorize_poly(BHEAD argin, argout, with_arghead, is_fun_arg, var_map);
100WORD* flint_factorize_dollar(PHEAD WORD *argin) {
102 const bool with_arghead =
false;
103 const bool sort_vars =
true;
104 const flint::var_map_t var_map = flint::get_variables(vector<WORD*>(1,argin), with_arghead,
107 const bool is_fun_arg =
false;
108 if ( var_map.size() > 1 ) {
109 return flint::factorize_mpoly(BHEAD argin, NULL, with_arghead, is_fun_arg, var_map, sort_vars);
112 return flint::factorize_poly(BHEAD argin, NULL, with_arghead, is_fun_arg, var_map);
119WORD* flint_gcd(PHEAD WORD *a, WORD *b,
const WORD must_fit_term) {
125 const bool with_arghead =
false;
126 const bool sort_vars =
true;
127 const flint::var_map_t var_map = flint::get_variables(e, with_arghead, sort_vars);
129 if ( var_map.size() > 1 ) {
130 return flint::gcd_mpoly(BHEAD a, b, must_fit_term, var_map, sort_vars);
133 return flint::gcd_poly(BHEAD a, b, must_fit_term, var_map);
140WORD* flint_inverse(PHEAD WORD *a, WORD *b) {
146 const flint::var_map_t var_map = flint::get_variables(e,
false,
false);
148 if ( var_map.size() > 1 ) {
149 MLOCK(ErrorMessageLock);
150 MesPrint(
"flint_inverse: error: only univariate polynomials are supported.");
151 MUNLOCK(ErrorMessageLock);
155 return flint::inverse_poly(BHEAD a, b, var_map);
161WORD* flint_mul(PHEAD WORD *a, WORD *b) {
167 const bool with_arghead =
false;
168 const bool sort_vars =
false;
169 const flint::var_map_t var_map = flint::get_variables(e, with_arghead, sort_vars);
171 if ( var_map.size() > 1 ) {
172 return flint::mul_mpoly(BHEAD a, b, var_map, sort_vars);
175 return flint::mul_poly(BHEAD a, b, var_map);
182WORD* flint_ratfun_add(PHEAD WORD *t1, WORD *t2) {
184 if ( AR.PolyFunExp == 1 ) {
185 MLOCK(ErrorMessageLock);
186 MesPrint(
"flint_ratfun_add: PolyFunExp unimplemented.");
187 MUNLOCK(ErrorMessageLock);
191 WORD *oldworkpointer = AT.WorkPointer;
196 for (WORD *t=t1+FUNHEAD; t<t1+t1[1];) {
200 for (WORD *t=t2+FUNHEAD; t<t2+t2[1];) {
204 const bool with_arghead =
true;
205 const bool sort_vars = AC.OldPRFSignFlag ? true :
false;
206 const flint::var_map_t var_map = flint::get_variables(e, with_arghead, sort_vars);
208 if ( var_map.size() > 1 ) {
209 flint::ratfun_add_mpoly(BHEAD t1, t2, oldworkpointer, var_map, sort_vars);
212 flint::ratfun_add_poly(BHEAD t1, t2, oldworkpointer, var_map);
215 return oldworkpointer;
221int flint_ratfun_normalize(PHEAD WORD *term) {
224 const WORD ncoeff = (term + *term)[-1];
226 const WORD *tstop = term + *term - ABS(ncoeff);
229 unsigned num_polyratfun = 0;
230 for (WORD *t = term+1; t < tstop; t += t[1]) {
231 if (*t == AR.PolyFun) {
234 if ((t[2] & MUSTCLEANPRF) != 0) {
238 if (num_polyratfun > 1) {
245 if (num_polyratfun <= 1) {
251 for (WORD *t = term+1; t < tstop; t += t[1]) {
252 if (*t == AR.PolyFun && (t[1] == FUNHEAD+t[FUNHEAD] || t[1] == FUNHEAD+2 ) ) {
262 for (WORD *t=term+1; t<tstop; t+=t[1]) {
263 if (*t == AR.PolyFun) {
264 for (WORD *t2 = t+FUNHEAD; t2<t+t[1];) {
270 const bool with_arghead =
true;
271 const bool sort_vars = AC.OldPRFSignFlag ? true :
false;
272 const flint::var_map_t var_map = flint::get_variables(e, with_arghead, sort_vars);
274 if ( var_map.size() > 1 ) {
275 flint::ratfun_normalize_mpoly(BHEAD term, var_map, sort_vars);
278 flint::ratfun_normalize_poly(BHEAD term, var_map);
283 const WORD *new_tstop = term + *term - ABS((term + *term)[-1]);
284 for (WORD *t=term+1; t<new_tstop; t+=t[1]) {
285 if (*t == TMPPOLYFUN ) *t = AR.PolyFun;
294WORD* flint_rem(PHEAD WORD *a, WORD *b,
const WORD must_fit_term) {
300 const bool with_arghead =
false;
301 const bool sort_vars =
false;
302 const flint::var_map_t var_map = flint::get_variables(e, with_arghead, sort_vars);
304 const bool return_rem =
true;
305 if ( var_map.size() > 1 ) {
306 return flint::divmod_mpoly(BHEAD a, b, return_rem, must_fit_term, var_map, sort_vars);
309 return flint::divmod_poly(BHEAD a, b, return_rem, must_fit_term, var_map);
325 std::stringstream ss(flint_version);
326 int major, minor, patch;
328 if ( ss >> major >> dot1 >> minor >> dot2 >> patch ) {
329 if ( dot1 !=
'.' || dot2 !=
'.' || major < 0 || minor < 0 || patch < 0 ) {
332 else if ( major * 10000 + minor * 100 + patch < 30200 ) {
341 MesPrint(
"Bad FLINT version detected at runtime: %s",flint_version);
void flint_check_version(void)