| 2334 | }*/ |
| 2335 | |
| 2336 | CanonicalForm |
| 2337 | mulMod2FLINTQa (const CanonicalForm& F, const CanonicalForm& G, |
| 2338 | const CanonicalForm& M) |
| 2339 | { |
| 2340 | Variable a; |
| 2341 | if (!hasFirstAlgVar (F,a) && !hasFirstAlgVar (G, a)) |
| 2342 | return mulMod2FLINTQ (F, G, M); |
| 2343 | CanonicalForm A= F, B= G; |
| 2344 | |
| 2345 | int degFx= degree (F, 1); |
| 2346 | int degFa= degree (F, a); |
| 2347 | int degGx= degree (G, 1); |
| 2348 | int degGa= degree (G, a); |
| 2349 | |
| 2350 | int d2= degFa+degGa+1; |
| 2351 | int d1= degFx + 1 + degGx; |
| 2352 | d1 *= d2; |
| 2353 | |
| 2354 | CanonicalForm f= bCommonDen (F); |
| 2355 | CanonicalForm g= bCommonDen (G); |
| 2356 | A *= f; |
| 2357 | B *= g; |
| 2358 | |
| 2359 | fmpz_poly_t FLINTF, FLINTG; |
| 2360 | kronSubQa (FLINTF, A, d1, d2); |
| 2361 | kronSubQa (FLINTG, B, d1, d2); |
| 2362 | |
| 2363 | fmpz_poly_mullow (FLINTF, FLINTF, FLINTG, d1*degree (M)); |
| 2364 | |
| 2365 | fmpq_poly_t mipo; |
| 2366 | convertFacCF2Fmpq_poly_t (mipo, getMipo (a)); |
| 2367 | A= reverseSubstQa (FLINTF, d1, d2, a, mipo); |
| 2368 | fmpz_poly_clear (FLINTF); |
| 2369 | fmpz_poly_clear (FLINTG); |
| 2370 | return A/(f*g); |
| 2371 | } |
| 2372 | |
| 2373 | #endif |
| 2374 |
no test coverage detected