3140{
3144 else if (
G.isZero() &&
degree (F) > 0)
return F/
Lc(F);
3149 if (F ==
G)
return F/
Lc(F);
3150
3153
3154 if (best_level == 0)
return B.
genOne();
3155
3158
3160
3161
3164
3168
3171 gcdcAcB=
gcd (cA, cB);
3174
3179
3181 {
3184 }
3186 {
3189 }
3190
3191 gcdlcAlcB=
gcd (lcA, lcB);
3192
3194 int d0;
3195
3196 if (d == 0)
3199
3200 if (d0 < d)
3201 d= d0;
3202
3203 if (d == 0)
3205
3206 CanonicalForm m, random_element, G_m, G_random_element,
H, cH, ppH, skeleton;
3209 G_m= 0;
3211 bool fail= false;
3213 bool inextension= false;
3218 do
3219 {
3221 if (random_element == 0 && !fail)
3222 {
3223 if (!
find (
l, random_element))
3224 l.append (random_element);
3225 continue;
3226 }
3227 if (fail)
3228 {
3231
3234 bool prim_fail= false;
3237 if (V_buf4 ==
alpha)
3238 prim_elem_alpha= prim_elem;
3239
3240 if (V_buf3 != V_buf4)
3241 {
3242 m=
mapDown (
m, prim_elem, im_prim_elem, V_buf4, source, dest);
3243 G_m=
mapDown (
m, prim_elem, im_prim_elem, V_buf4, source, dest);
3244 newtonPoly=
mapDown (newtonPoly, prim_elem, im_prim_elem, V_buf4,
3245 source, dest);
3246 ppA=
mapDown (ppA, prim_elem, im_prim_elem, V_buf4, source, dest);
3247 ppB=
mapDown (ppB, prim_elem, im_prim_elem, V_buf4, source, dest);
3248 gcdlcAlcB=
mapDown (gcdlcAlcB, prim_elem, im_prim_elem, V_buf4, source,
3249 dest);
3251 i.getItem()=
mapDown (
i.getItem(), prim_elem, im_prim_elem, V_buf4,
3252 source, dest);
3253 }
3254
3255 ASSERT (!prim_fail,
"failure in integer factorizer");
3256 if (prim_fail)
3257 ;
3258 else
3259 im_prim_elem=
mapPrimElem (prim_elem, V_buf4, V_buf);
3260
3261 if (V_buf4 ==
alpha)
3262 im_prim_elem_alpha= im_prim_elem;
3263 else
3264 im_prim_elem_alpha=
mapUp (im_prim_elem_alpha, V_buf4, V_buf, prim_elem,
3265 im_prim_elem, source, dest);
3266
3269 inextension= true;
3271 i.getItem()=
mapUp (
i.getItem(), V_buf4, V_buf, prim_elem,
3272 im_prim_elem, source, dest);
3273 m=
mapUp (
m, V_buf4, V_buf, prim_elem, im_prim_elem, source, dest);
3274 G_m=
mapUp (G_m, V_buf4, V_buf, prim_elem, im_prim_elem, source, dest);
3275 newtonPoly=
mapUp (newtonPoly, V_buf4, V_buf, prim_elem, im_prim_elem,
3276 source, dest);
3277 ppA=
mapUp (ppA, V_buf4, V_buf, prim_elem, im_prim_elem, source, dest);
3278 ppB=
mapUp (ppB, V_buf4, V_buf, prim_elem, im_prim_elem, source, dest);
3279 gcdlcAlcB=
mapUp (gcdlcAlcB, V_buf4, V_buf, prim_elem, im_prim_elem,
3280 source, dest);
3281
3282 fail= false;
3287 G_random_element=
3288 sparseGCDFq (ppA (random_element,
x), ppB (random_element,
x), V_buf,
3291 "time for recursive call: ");
3292 DEBOUTLN (cerr,
"G_random_element= " << G_random_element);
3293 V_buf4= V_buf;
3294 }
3295 else
3296 {
3299 G_random_element=
3300 sparseGCDFq (ppA(random_element,
x), ppB(random_element,
x), V_buf,
3303 "time for recursive call: ");
3304 DEBOUTLN (cerr,
"G_random_element= " << G_random_element);
3305 }
3306
3310 else
3311 d0= 0;
3312
3313 if (d0 == 0)
3314 {
3315 if (inextension)
3318 }
3319 if (d0 > d)
3320 {
3321 if (!
find (
l, random_element))
3322 l.append (random_element);
3323 continue;
3324 }
3325
3326 G_random_element=
3327 (gcdlcAlcB(random_element,
x)/
uni_lcoeff (G_random_element))
3328 * G_random_element;
3329
3330 skeleton= G_random_element;
3334 else
3335 d0= 0;
3336
3337 if (d0 < d)
3338 {
3340 newtonPoly= 1;
3341 G_m= 0;
3342 d= d0;
3343 }
3344
3345 H=
newtonInterp (random_element, G_random_element, newtonPoly, G_m,
x);
3347 {
3350 if (inextension)
3351 {
3353
3354
3356 {
3357 DEBOUTLN (cerr,
"ppH before mapDown= " << ppH);
3358 ppH=
mapDown (ppH, prim_elem_alpha, im_prim_elem_alpha,
alpha, u,
v);
3360 DEBOUTLN (cerr,
"ppH after mapDown= " << ppH);
3362 return N(gcdcAcB*ppH);
3363 }
3364 }
3366 return N(gcdcAcB*ppH);
3367 }
3369 newtonPoly= newtonPoly*(
x - random_element);
3370 m=
m*(
x - random_element);
3371 if (!
find (
l, random_element))
3372 l.append (random_element);
3373
3375 {
3378 do
3379 {
3381 if (random_element == 0 && !fail)
3382 {
3383 if (!
find (
l, random_element))
3384 l.append (random_element);
3385 continue;
3386 }
3387 if (fail)
3388 {
3391
3394 bool prim_fail= false;
3397 if (V_buf4 ==
alpha)
3398 prim_elem_alpha= prim_elem;
3399
3400 if (V_buf3 != V_buf4)
3401 {
3402 m=
mapDown (
m, prim_elem, im_prim_elem, V_buf4, source, dest);
3403 G_m=
mapDown (
m, prim_elem, im_prim_elem, V_buf4, source, dest);
3404 newtonPoly=
mapDown (newtonPoly, prim_elem, im_prim_elem, V_buf4,
3405 source, dest);
3406 ppA=
mapDown (ppA, prim_elem, im_prim_elem, V_buf4, source, dest);
3407 ppB=
mapDown (ppB, prim_elem, im_prim_elem, V_buf4, source, dest);
3408 gcdlcAlcB=
mapDown (gcdlcAlcB, prim_elem, im_prim_elem, V_buf4,
3409 source, dest);
3411 i.getItem()=
mapDown (
i.getItem(), prim_elem, im_prim_elem, V_buf4,
3412 source, dest);
3413 }
3414
3415 ASSERT (!prim_fail,
"failure in integer factorizer");
3416 if (prim_fail)
3417 ;
3418 else
3419 im_prim_elem=
mapPrimElem (prim_elem, V_buf4, V_buf);
3420
3421 if (V_buf4 ==
alpha)
3422 im_prim_elem_alpha= im_prim_elem;
3423 else
3424 im_prim_elem_alpha=
mapUp (im_prim_elem_alpha, V_buf4, V_buf,
3425 prim_elem, im_prim_elem, source, dest);
3426
3429 inextension= true;
3431 i.getItem()=
mapUp (
i.getItem(), V_buf4, V_buf, prim_elem,
3432 im_prim_elem, source, dest);
3433 m=
mapUp (
m, V_buf4, V_buf, prim_elem, im_prim_elem, source, dest);
3434 G_m=
mapUp (G_m, V_buf4, V_buf, prim_elem, im_prim_elem, source, dest);
3435 newtonPoly=
mapUp (newtonPoly, V_buf4, V_buf, prim_elem, im_prim_elem,
3436 source, dest);
3437 ppA=
mapUp (ppA, V_buf4, V_buf, prim_elem, im_prim_elem, source, dest);
3438 ppB=
mapUp (ppB, V_buf4, V_buf, prim_elem, im_prim_elem, source, dest);
3439
3440 gcdlcAlcB=
mapUp (gcdlcAlcB, V_buf4, V_buf, prim_elem, im_prim_elem,
3441 source, dest);
3442
3443 fail= false;
3448
3449 V_buf4= V_buf;
3450
3451
3452 bool sparseFail= false;
3453 if (
LC (skeleton).inCoeffDomain())
3454 G_random_element=
3456 skeleton,V_buf, sparseFail, coeffMonoms,Monoms);
3457 else
3458 G_random_element=
3460 skeleton, V_buf, sparseFail, coeffMonoms,
3461 Monoms);
3462 if (sparseFail)
3463 break;
3464
3466 "time for recursive call: ");
3467 DEBOUTLN (cerr,
"G_random_element= " << G_random_element);
3468 }
3469 else
3470 {
3473 bool sparseFail= false;
3474 if (
LC (skeleton).inCoeffDomain())
3475 G_random_element=
3477 skeleton,V_buf, sparseFail,coeffMonoms, Monoms);
3478 else
3479 G_random_element=
3481 skeleton, V_buf, sparseFail, coeffMonoms,
3482 Monoms);
3483 if (sparseFail)
3484 break;
3485
3487 "time for recursive call: ");
3488 DEBOUTLN (cerr,
"G_random_element= " << G_random_element);
3489 }
3490
3494 else
3495 d0= 0;
3496
3497 if (d0 == 0)
3498 {
3499 if (inextension)
3502 }
3503 if (d0 > d)
3504 {
3505 if (!
find (
l, random_element))
3506 l.append (random_element);
3507 continue;
3508 }
3509
3510 G_random_element=
3511 (gcdlcAlcB(random_element,
x)/
uni_lcoeff (G_random_element))
3512 * G_random_element;
3513
3517 else
3518 d0= 0;
3519
3520 if (d0 < d)
3521 {
3523 newtonPoly= 1;
3524 G_m= 0;
3525 d= d0;
3526 }
3527
3529 H=
newtonInterp (random_element, G_random_element, newtonPoly, G_m,
x);
3531 "time for newton interpolation: ");
3532
3533
3535 {
3538 if (inextension)
3539 {
3541
3542
3544 {
3545 DEBOUTLN (cerr,
"ppH before mapDown= " << ppH);
3546 ppH=
mapDown (ppH, prim_elem_alpha, im_prim_elem_alpha,
alpha, u,
v);
3548 DEBOUTLN (cerr,
"ppH after mapDown= " << ppH);
3550 return N(gcdcAcB*ppH);
3551 }
3552 }
3554 {
3555 return N(gcdcAcB*ppH);
3556 }
3557 }
3558
3560 newtonPoly= newtonPoly*(
x - random_element);
3561 m=
m*(
x - random_element);
3562 if (!
find (
l, random_element))
3563 l.append (random_element);
3564
3565 } while (1);
3566 }
3567 } while (1);
3568}
const Variable & v
< [in] a sqrfree bivariate poly
void prune1(const Variable &alpha)