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);
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);
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);
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);
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 flint::var_map_t var_map = flint::get_variables(e,
false,
false);
169 if ( var_map.size() > 1 ) {
170 return flint::mul_mpoly(BHEAD a, b, var_map);
173 return flint::mul_poly(BHEAD a, b, var_map);
180WORD* flint_ratfun_add(PHEAD WORD *t1, WORD *t2) {
182 if ( AR.PolyFunExp == 1 ) {
183 MLOCK(ErrorMessageLock);
184 MesPrint(
"flint_ratfun_add: PolyFunExp unimplemented.");
185 MUNLOCK(ErrorMessageLock);
189 WORD *oldworkpointer = AT.WorkPointer;
194 for (WORD *t=t1+FUNHEAD; t<t1+t1[1];) {
198 for (WORD *t=t2+FUNHEAD; t<t2+t2[1];) {
202 const bool with_arghead =
true;
203 const bool sort_vars =
true;
204 const flint::var_map_t var_map = flint::get_variables(e, with_arghead, sort_vars);
206 if ( var_map.size() > 1 ) {
207 flint::ratfun_add_mpoly(BHEAD t1, t2, oldworkpointer, var_map);
210 flint::ratfun_add_poly(BHEAD t1, t2, oldworkpointer, var_map);
213 return oldworkpointer;
219int flint_ratfun_normalize(PHEAD WORD *term) {
222 const WORD ncoeff = (term + *term)[-1];
224 const WORD *tstop = term + *term - ABS(ncoeff);
227 unsigned num_polyratfun = 0;
228 for (WORD *t = term+1; t < tstop; t += t[1]) {
229 if (*t == AR.PolyFun) {
232 if ((t[2] & MUSTCLEANPRF) != 0) {
236 if (num_polyratfun > 1) {
243 if (num_polyratfun <= 1) {
249 for (WORD *t = term+1; t < tstop; t += t[1]) {
250 if (*t == AR.PolyFun && (t[1] == FUNHEAD+t[FUNHEAD] || t[1] == FUNHEAD+2 ) ) {
260 for (WORD *t=term+1; t<tstop; t+=t[1]) {
261 if (*t == AR.PolyFun) {
262 for (WORD *t2 = t+FUNHEAD; t2<t+t[1];) {
268 const bool with_arghead =
true;
269 const bool sort_vars =
true;
270 const flint::var_map_t var_map = flint::get_variables(e, with_arghead, sort_vars);
272 if ( var_map.size() > 1 ) {
273 flint::ratfun_normalize_mpoly(BHEAD term, var_map);
276 flint::ratfun_normalize_poly(BHEAD term, var_map);
281 const WORD *new_tstop = term + *term - ABS((term + *term)[-1]);
282 for (WORD *t=term+1; t<new_tstop; t+=t[1]) {
283 if (*t == TMPPOLYFUN ) *t = AR.PolyFun;
292WORD* flint_rem(PHEAD WORD *a, WORD *b,
const WORD must_fit_term) {
298 const bool with_arghead =
false;
299 const bool sort_vars =
false;
300 const flint::var_map_t var_map = flint::get_variables(e, with_arghead, sort_vars);
302 const bool return_rem =
true;
303 if ( var_map.size() > 1 ) {
304 return flint::divmod_mpoly(BHEAD a, b, return_rem, must_fit_term, var_map);
307 return flint::divmod_poly(BHEAD a, b, return_rem, must_fit_term, var_map);
323 std::stringstream ss(flint_version);
324 int major, minor, patch;
326 if ( ss >> major >> dot1 >> minor >> dot2 >> patch ) {
327 if ( dot1 !=
'.' || dot2 !=
'.' || major < 0 || minor < 0 || patch < 0 ) {
330 else if ( major * 10000 + minor * 100 + patch < 30200 ) {
339 MesPrint(
"Bad FLINT version detected at runtime: %s",flint_version);
void flint_check_version(void)