Changeset c66a53 in git for kernel/GBEngine
- Timestamp:
- Jul 16, 2016, 9:42:28 AM (8 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- b6f42a8c2492312d1dd4f0c4c917fcf054636416
- Parents:
- 1798a00a38186e92d8d8d6dc786ccdf6aad508cd34183abab486cee38d70559e5cdcfbc307938f64
- Location:
- kernel/GBEngine
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/GBEngine/f5gb.cc
r1798a0 rc66a53 29 29 #include <kernel/GBEngine/f5data.h> 30 30 #include <kernel/GBEngine/f5lists.h> 31 #include <kernel/oswrapper/timer.h> 32 33 #define pDeg(A) p_Deg(A,currRing) 34 31 35 int notInG = 0; 32 36 int numberOfRules = 0; … … 49 53 ==================================================================== 50 54 */ 51 void qsortDegree(poly* left, poly* right) { 55 void qsortDegree(poly* left, poly* right) 56 { 52 57 poly* ptr1 = left; 53 58 poly* ptr2 = right; 54 59 poly p1,p2; 55 60 p2 = *(left + (right - left >> 1)); 56 do { 57 while(pTotaldegree(*ptr1, currRing) < pTotaldegree(p2, currRing)) { 61 do 62 { 63 while(p_Totaldegree(*ptr1, currRing) < p_Totaldegree(p2, currRing)) 64 { 58 65 ptr1++; 59 66 } 60 while(pTotaldegree(*ptr2, currRing) > pTotaldegree(p2,currRing)) { 67 while(p_Totaldegree(*ptr2, currRing) > p_Totaldegree(p2,currRing)) 68 { 61 69 ptr2--; 62 70 } 63 if(ptr1 > ptr2) { 71 if(ptr1 > ptr2) 72 { 64 73 break; 65 74 } … … 69 78 } while(++ptr1 <= --ptr2); 70 79 71 if(left < ptr2) { 80 if(left < ptr2) 81 { 72 82 qsortDegree(left,ptr2); 73 83 } 74 if(ptr1 < right) { 84 if(ptr1 < right) 85 { 75 86 qsortDegree(ptr1,right); 76 87 } -
kernel/GBEngine/kspoly.cc
r34183a rc66a53 22 22 #include <kernel/polys.h> 23 23 #endif 24 25 #define ADIDEBUG 0 24 26 25 27 #ifdef KDEBUG … … 180 182 kStrategy strat) 181 183 { 184 #if ADIDEBUG 185 printf("\nksReducePolySig\n"); 186 pWrite(PR->p);pWrite(PR->sig); 187 pWrite(PW->p);pWrite(PW->sig); 188 #endif 182 189 #ifdef KDEBUG 183 190 red_count++; … … 235 242 #endif 236 243 p_ExpVectorAddSub(sigMult,PR->GetLmCurrRing(),PW->GetLmCurrRing(),currRing); 244 //I have also to set the leading coeficient for sigMult (in the case of rings) 245 if(rField_is_Ring(currRing)) 246 { 247 pSetCoeff(sigMult,nMult(nDiv(pGetCoeff(PR->p),pGetCoeff(PW->p)), pGetCoeff(sigMult))); 248 } 237 249 //#if 1 238 250 #ifdef DEBUGF5 … … 244 256 printf("--------------\n"); 245 257 #endif 246 int sigSafe = p_LmCmp(PR->sig,sigMult,currRing); 258 int sigSafe; 259 if(!rField_is_Ring(currRing)) 260 sigSafe = p_LmCmp(PR->sig,sigMult,currRing); 247 261 // now we can delete the copied polynomial data used for checking for 248 262 // sig-safeness of the reduction step … … 252 266 253 267 #endif 268 if(rField_is_Ring(currRing)) 269 { 270 // Set the sig 271 poly origsig = pCopy(PR->sig); 272 PR->sig = pHead(pSub(PR->sig, sigMult)); 273 //The sigs have the same lm, have to substract 274 //It may happen that now the signature is 0 (drop) 275 if(PR->sig == NULL) 276 { 277 #if ADIDEBUG 278 printf("\nPossible sigdrop in ksreducepolysig (lost signature)\n"); 279 #endif 280 strat->sigdrop=TRUE; 281 } 282 else 283 { 284 if(pLtCmp(PR->sig,origsig) == 1) 285 { 286 // do not allow this reduction - it will increase it's signature 287 // and the partially standard basis is just till the old sig, not the new one 288 PR->is_redundant = TRUE; 289 pDelete(&PR->sig); 290 PR->sig = origsig; 291 strat->blockred++; 292 return 3; 293 } 294 if(pLtCmp(PR->sig,origsig) == -1) 295 { 296 #if ADIDEBUG 297 printf("\nSigdrop in ksreducepolysig from * to *\n");pWrite(origsig);pWrite(PR->sig); 298 #endif 299 strat->sigdrop=TRUE; 300 } 301 } 302 pDelete(&origsig); 303 } 254 304 //pDelete(&f1); 255 pDelete(&sigMult);256 305 // go on with the computations only if the signature of p2 is greater than the 257 306 // signature of fm*p1 258 if(sigSafe != 1 )307 if(sigSafe != 1 && !rField_is_Ring(currRing)) 259 308 { 260 309 PR->is_redundant = TRUE; … … 324 373 } 325 374 } 326 327 375 // take care of coef buisness 328 if (! n_IsOne(pGetCoeff(p2), tailRing)) 329 { 330 number bn = pGetCoeff(lm); 331 number an = pGetCoeff(p2); 332 int ct = ksCheckCoeff(&an, &bn, tailRing->cf); // Calculate special LC 333 p_SetCoeff(lm, bn, tailRing); 334 if ((ct == 0) || (ct == 2)) 335 PR->Tail_Mult_nn(an); 336 if (coef != NULL) *coef = an; 337 else n_Delete(&an, tailRing); 376 if(rField_is_Ring(currRing)) 377 { 378 p_SetCoeff(lm, nDiv(pGetCoeff(lm),pGetCoeff(p2)), tailRing); 379 if (coef != NULL) *coef = n_Init(1, tailRing); 338 380 } 339 381 else 340 382 { 341 if (coef != NULL) *coef = n_Init(1, tailRing); 342 } 343 383 if (! n_IsOne(pGetCoeff(p2), tailRing)) 384 { 385 number bn = pGetCoeff(lm); 386 number an = pGetCoeff(p2); 387 int ct = ksCheckCoeff(&an, &bn, tailRing->cf); // Calculate special LC 388 p_SetCoeff(lm, bn, tailRing); 389 if (((ct == 0) || (ct == 2))) 390 PR->Tail_Mult_nn(an); 391 if (coef != NULL) *coef = an; 392 else n_Delete(&an, tailRing); 393 } 394 else 395 { 396 if (coef != NULL) *coef = n_Init(1, tailRing); 397 } 398 } 344 399 345 400 // and finally, … … 361 416 } 362 417 #endif 363 364 418 #if defined(KDEBUG) && defined(TEST_OPT_DEBUG_RED) 365 419 if (TEST_OPT_DEBUG) -
kernel/GBEngine/kstd1.cc
r34183a rc66a53 1508 1508 strat->red2 = redHomog; 1509 1509 } 1510 #if defined(HAVE_RINGS)1511 1510 if (rField_is_Ring(currRing)) 1512 1511 { 1513 1512 if(rHasLocalOrMixedOrdering(currRing)) 1514 {strat->red = redRiloc;}1513 {strat->red2 = redRiloc;} 1515 1514 else 1516 1515 {strat->red2 = redRing;} 1517 1516 } 1518 #endif1519 1517 if (currRing->pLexOrder && strat->honey) 1520 1518 strat->initEcart = initEcartNormal; … … 2452 2450 int newIdeal, intvec *vw) 2453 2451 { 2454 if(idIs0(F)) 2455 return idInit(1,F->rank); 2456 2457 ideal r; 2458 BOOLEAN b=currRing->pLexOrder,toReset=FALSE; 2459 BOOLEAN delete_w=(w==NULL); 2460 kStrategy strat=new skStrategy; 2461 strat->sbaOrder = sbaOrder; 2462 if (arri!=0) 2463 { 2464 strat->rewCrit1 = arriRewDummy; 2465 strat->rewCrit2 = arriRewCriterion; 2466 strat->rewCrit3 = arriRewCriterionPre; 2452 if(!rField_is_Ring(currRing)) 2453 { 2454 if(idIs0(F)) 2455 return idInit(1,F->rank); 2456 2457 ideal r; 2458 BOOLEAN b=currRing->pLexOrder,toReset=FALSE; 2459 BOOLEAN delete_w=(w==NULL); 2460 kStrategy strat=new skStrategy; 2461 strat->sbaOrder = sbaOrder; 2462 if (arri!=0) 2463 { 2464 strat->rewCrit1 = arriRewDummy; 2465 strat->rewCrit2 = arriRewCriterion; 2466 strat->rewCrit3 = arriRewCriterionPre; 2467 } 2468 else 2469 { 2470 strat->rewCrit1 = faugereRewCriterion; 2471 strat->rewCrit2 = faugereRewCriterion; 2472 strat->rewCrit3 = faugereRewCriterion; 2473 } 2474 2475 if(!TEST_OPT_RETURN_SB) 2476 strat->syzComp = syzComp; 2477 if (TEST_OPT_SB_1) 2478 if(!rField_is_Ring(currRing)) 2479 strat->newIdeal = newIdeal; 2480 if (rField_has_simple_inverse(currRing)) 2481 strat->LazyPass=20; 2482 else 2483 strat->LazyPass=2; 2484 strat->LazyDegree = 1; 2485 strat->enterOnePair=enterOnePairNormal; 2486 strat->chainCrit=chainCritNormal; 2487 if (TEST_OPT_SB_1) strat->chainCrit=chainCritOpt_1; 2488 strat->ak = id_RankFreeModule(F,currRing); 2489 strat->kModW=kModW=NULL; 2490 strat->kHomW=kHomW=NULL; 2491 if (vw != NULL) 2492 { 2493 currRing->pLexOrder=FALSE; 2494 strat->kHomW=kHomW=vw; 2495 strat->pOrigFDeg = currRing->pFDeg; 2496 strat->pOrigLDeg = currRing->pLDeg; 2497 pSetDegProcs(currRing,kHomModDeg); 2498 toReset = TRUE; 2499 } 2500 if (h==testHomog) 2501 { 2502 if (strat->ak == 0) 2503 { 2504 h = (tHomog)idHomIdeal(F,Q); 2505 w=NULL; 2506 } 2507 else if (!TEST_OPT_DEGBOUND) 2508 { 2509 h = (tHomog)idHomModule(F,Q,w); 2510 } 2511 } 2512 currRing->pLexOrder=b; 2513 if (h==isHomog) 2514 { 2515 if (strat->ak > 0 && (w!=NULL) && (*w!=NULL)) 2516 { 2517 strat->kModW = kModW = *w; 2518 if (vw == NULL) 2519 { 2520 strat->pOrigFDeg = currRing->pFDeg; 2521 strat->pOrigLDeg = currRing->pLDeg; 2522 pSetDegProcs(currRing,kModDeg); 2523 toReset = TRUE; 2524 } 2525 } 2526 currRing->pLexOrder = TRUE; 2527 if (hilb==NULL) strat->LazyPass*=2; 2528 } 2529 strat->homog=h; 2530 #ifdef KDEBUG 2531 idTest(F); 2532 if(Q != NULL) 2533 idTest(Q); 2534 #endif 2535 #ifdef HAVE_PLURAL 2536 if (rIsPluralRing(currRing)) 2537 { 2538 const BOOLEAN bIsSCA = rIsSCA(currRing) && strat->z2homog; // for Z_2 prod-crit 2539 strat->no_prod_crit = ! bIsSCA; 2540 if (w!=NULL) 2541 r = nc_GB(F, Q, *w, hilb, strat, currRing); 2542 else 2543 r = nc_GB(F, Q, NULL, hilb, strat, currRing); 2544 } 2545 else 2546 #endif 2547 { 2548 if (rHasLocalOrMixedOrdering(currRing)) 2549 { 2550 if (w!=NULL) 2551 r=mora(F,Q,*w,hilb,strat); 2552 else 2553 r=mora(F,Q,NULL,hilb,strat); 2554 } 2555 else 2556 { 2557 if (w!=NULL) 2558 r=sba(F,Q,*w,hilb,strat); 2559 else 2560 r=sba(F,Q,NULL,hilb,strat); 2561 } 2562 } 2563 #ifdef KDEBUG 2564 idTest(r); 2565 #endif 2566 if (toReset) 2567 { 2568 kModW = NULL; 2569 pRestoreDegProcs(currRing,strat->pOrigFDeg, strat->pOrigLDeg); 2570 } 2571 currRing->pLexOrder = b; 2572 //Print("%d reductions canceled \n",strat->cel); 2573 HCord=strat->HCord; 2574 //delete(strat); 2575 if ((delete_w)&&(w!=NULL)&&(*w!=NULL)) delete *w; 2576 return r; 2467 2577 } 2468 2578 else 2469 2579 { 2470 strat->rewCrit1 = faugereRewCriterion; 2471 strat->rewCrit2 = faugereRewCriterion; 2472 strat->rewCrit3 = faugereRewCriterion; 2473 } 2474 2475 if(!TEST_OPT_RETURN_SB) 2476 strat->syzComp = syzComp; 2477 if (TEST_OPT_SB_1) 2478 if(!rField_is_Ring(currRing)) 2479 strat->newIdeal = newIdeal; 2480 if (rField_has_simple_inverse(currRing)) 2481 strat->LazyPass=20; 2482 else 2483 strat->LazyPass=2; 2484 strat->LazyDegree = 1; 2485 strat->enterOnePair=enterOnePairNormal; 2486 strat->chainCrit=chainCritNormal; 2487 if (TEST_OPT_SB_1) strat->chainCrit=chainCritOpt_1; 2488 strat->ak = id_RankFreeModule(F,currRing); 2489 strat->kModW=kModW=NULL; 2490 strat->kHomW=kHomW=NULL; 2491 if (vw != NULL) 2492 { 2493 currRing->pLexOrder=FALSE; 2494 strat->kHomW=kHomW=vw; 2495 strat->pOrigFDeg = currRing->pFDeg; 2496 strat->pOrigLDeg = currRing->pLDeg; 2497 pSetDegProcs(currRing,kHomModDeg); 2498 toReset = TRUE; 2499 } 2500 if (h==testHomog) 2501 { 2502 if (strat->ak == 0) 2503 { 2504 h = (tHomog)idHomIdeal(F,Q); 2505 w=NULL; 2506 } 2507 else if (!TEST_OPT_DEGBOUND) 2508 { 2509 h = (tHomog)idHomModule(F,Q,w); 2510 } 2511 } 2512 currRing->pLexOrder=b; 2513 if (h==isHomog) 2514 { 2515 if (strat->ak > 0 && (w!=NULL) && (*w!=NULL)) 2516 { 2517 strat->kModW = kModW = *w; 2518 if (vw == NULL) 2519 { 2580 //--------------------------RING CASE------------------------- 2581 if(idIs0(F)) 2582 return idInit(1,F->rank); 2583 ideal r; 2584 r = idCopy(F); 2585 int sbaEnterS = -1; 2586 bool sigdrop = TRUE; 2587 #if ADIDEBUG 2588 printf("\nEnter the nice kSba loop\n"); 2589 #endif 2590 //This is how we set the SBA algorithm; 2591 int totalsbaruns = 1,blockedreductions = 10,blockred = 0,loops = 0; 2592 while(sigdrop && (loops < totalsbaruns || totalsbaruns == -1) 2593 && (blockred <= blockedreductions)) 2594 { 2595 loops++; 2596 if(loops == 1) 2597 sigdrop = FALSE; 2598 BOOLEAN b=currRing->pLexOrder,toReset=FALSE; 2599 BOOLEAN delete_w=(w==NULL); 2600 kStrategy strat=new skStrategy; 2601 strat->sbaEnterS = sbaEnterS; 2602 strat->sigdrop = sigdrop; 2603 #if 0 2604 strat->blockred = blockred; 2605 #else 2606 strat->blockred = 0; 2607 #endif 2608 strat->blockredmax = blockedreductions; 2609 //printf("\nsbaEnterS beginning = %i\n",strat->sbaEnterS); 2610 //printf("\nsigdrop beginning = %i\n",strat->sigdrop); 2611 strat->sbaOrder = sbaOrder; 2612 if (arri!=0) 2613 { 2614 strat->rewCrit1 = arriRewDummy; 2615 strat->rewCrit2 = arriRewCriterion; 2616 strat->rewCrit3 = arriRewCriterionPre; 2617 } 2618 else 2619 { 2620 strat->rewCrit1 = faugereRewCriterion; 2621 strat->rewCrit2 = faugereRewCriterion; 2622 strat->rewCrit3 = faugereRewCriterion; 2623 } 2624 2625 if(!TEST_OPT_RETURN_SB) 2626 strat->syzComp = syzComp; 2627 if (TEST_OPT_SB_1) 2628 if(!rField_is_Ring(currRing)) 2629 strat->newIdeal = newIdeal; 2630 if (rField_has_simple_inverse(currRing)) 2631 strat->LazyPass=20; 2632 else 2633 strat->LazyPass=2; 2634 strat->LazyDegree = 1; 2635 strat->enterOnePair=enterOnePairNormal; 2636 strat->chainCrit=chainCritNormal; 2637 if (TEST_OPT_SB_1) strat->chainCrit=chainCritOpt_1; 2638 strat->ak = id_RankFreeModule(F,currRing); 2639 strat->kModW=kModW=NULL; 2640 strat->kHomW=kHomW=NULL; 2641 if (vw != NULL) 2642 { 2643 currRing->pLexOrder=FALSE; 2644 strat->kHomW=kHomW=vw; 2520 2645 strat->pOrigFDeg = currRing->pFDeg; 2521 2646 strat->pOrigLDeg = currRing->pLDeg; 2522 pSetDegProcs(currRing,k ModDeg);2647 pSetDegProcs(currRing,kHomModDeg); 2523 2648 toReset = TRUE; 2524 2649 } 2525 } 2526 currRing->pLexOrder = TRUE; 2527 if (hilb==NULL) strat->LazyPass*=2; 2528 } 2529 strat->homog=h; 2530 #ifdef KDEBUG 2531 idTest(F); 2532 idTest(Q); 2533 #endif 2534 #ifdef HAVE_PLURAL 2535 if (rIsPluralRing(currRing)) 2536 { 2537 const BOOLEAN bIsSCA = rIsSCA(currRing) && strat->z2homog; // for Z_2 prod-crit 2538 strat->no_prod_crit = ! bIsSCA; 2539 if (w!=NULL) 2540 r = nc_GB(F, Q, *w, hilb, strat, currRing); 2541 else 2542 r = nc_GB(F, Q, NULL, hilb, strat, currRing); 2543 } 2544 else 2545 #endif 2546 if (rField_is_Ring(currRing)) 2547 r=bba(F,Q,NULL,hilb,strat); 2548 else 2549 { 2550 if (rHasLocalOrMixedOrdering(currRing)) 2551 { 2552 if (w!=NULL) 2553 r=mora(F,Q,*w,hilb,strat); 2650 if (h==testHomog) 2651 { 2652 if (strat->ak == 0) 2653 { 2654 h = (tHomog)idHomIdeal(F,Q); 2655 w=NULL; 2656 } 2657 else if (!TEST_OPT_DEGBOUND) 2658 { 2659 h = (tHomog)idHomModule(F,Q,w); 2660 } 2661 } 2662 currRing->pLexOrder=b; 2663 if (h==isHomog) 2664 { 2665 if (strat->ak > 0 && (w!=NULL) && (*w!=NULL)) 2666 { 2667 strat->kModW = kModW = *w; 2668 if (vw == NULL) 2669 { 2670 strat->pOrigFDeg = currRing->pFDeg; 2671 strat->pOrigLDeg = currRing->pLDeg; 2672 pSetDegProcs(currRing,kModDeg); 2673 toReset = TRUE; 2674 } 2675 } 2676 currRing->pLexOrder = TRUE; 2677 if (hilb==NULL) strat->LazyPass*=2; 2678 } 2679 strat->homog=h; 2680 #ifdef KDEBUG 2681 idTest(F); 2682 if(Q != NULL) 2683 idTest(Q); 2684 #endif 2685 #ifdef HAVE_PLURAL 2686 if (rIsPluralRing(currRing)) 2687 { 2688 const BOOLEAN bIsSCA = rIsSCA(currRing) && strat->z2homog; // for Z_2 prod-crit 2689 strat->no_prod_crit = ! bIsSCA; 2690 if (w!=NULL) 2691 r = nc_GB(F, Q, *w, hilb, strat, currRing); 2692 else 2693 r = nc_GB(F, Q, NULL, hilb, strat, currRing); 2694 } 2554 2695 else 2555 r=mora(F,Q,NULL,hilb,strat); 2556 } 2557 else 2558 { 2559 if (w!=NULL) 2560 r=sba(F,Q,*w,hilb,strat); 2561 else 2562 r=sba(F,Q,NULL,hilb,strat); 2563 } 2564 } 2565 #ifdef KDEBUG 2566 idTest(r); 2567 #endif 2568 if (toReset) 2569 { 2570 kModW = NULL; 2571 pRestoreDegProcs(currRing,strat->pOrigFDeg, strat->pOrigLDeg); 2572 } 2573 currRing->pLexOrder = b; 2574 //Print("%d reductions canceled \n",strat->cel); 2575 HCord=strat->HCord; 2576 delete(strat); 2577 if ((delete_w)&&(w!=NULL)&&(*w!=NULL)) delete *w; 2578 return r; 2696 #endif 2697 { 2698 if (rHasLocalOrMixedOrdering(currRing)) 2699 { 2700 if (w!=NULL) 2701 r=mora(F,Q,*w,hilb,strat); 2702 else 2703 r=mora(F,Q,NULL,hilb,strat); 2704 } 2705 else 2706 { 2707 if (w!=NULL) 2708 r=sba(r,Q,*w,hilb,strat); 2709 else 2710 { 2711 r=sba(r,Q,NULL,hilb,strat); 2712 } 2713 #if ADIDEBUG 2714 printf("\nSBA Run %i: %i elements (syzCrit = %i,rewCrit = %i)\n",loops,IDELEMS(r),strat->nrsyzcrit,strat->nrrewcrit); 2715 idPrint(r); 2716 getchar(); 2717 #endif 2718 } 2719 } 2720 #ifdef KDEBUG 2721 idTest(r); 2722 #endif 2723 if (toReset) 2724 { 2725 kModW = NULL; 2726 pRestoreDegProcs(currRing,strat->pOrigFDeg, strat->pOrigLDeg); 2727 } 2728 currRing->pLexOrder = b; 2729 //Print("%d reductions canceled \n",strat->cel); 2730 HCord=strat->HCord; 2731 sigdrop = strat->sigdrop; 2732 sbaEnterS = strat->sbaEnterS; 2733 blockred = strat->blockred; 2734 #if ADIDEBUG 2735 printf("\nsbaEnterS = %i\n",sbaEnterS); 2736 #endif 2737 delete(strat); 2738 if ((delete_w)&&(w!=NULL)&&(*w!=NULL)) delete *w; 2739 } 2740 // Go to std 2741 if(sigdrop || blockred > blockedreductions) 2742 { 2743 #if ADIDEBUG 2744 printf("\nWent to std\n"); 2745 //idPrint(r); 2746 //getchar(); 2747 #endif 2748 r = kStd(r, Q, h, w, hilb, syzComp, newIdeal, vw); 2749 } 2750 return r; 2751 } 2579 2752 } 2580 2753 -
kernel/GBEngine/kstd2.cc
r34183a rc66a53 8 8 // #define PDEBUG 2 9 9 10 11 12 13 14 10 #include <kernel/mod2.h> 15 11 16 12 #define ADIDEBUG 0 17 13 #define ADIDEBUG_COUNT 0 14 #define GCD_SBA 1 18 15 19 16 // define if no buckets should be used … … 104 101 pAssume(~not_sev == p_GetShortExpVector(p, r)); 105 102 106 #ifdef HAVE_RINGS107 103 if(rField_is_Ring(r)) 108 104 { … … 147 143 } 148 144 } 149 #endif150 145 } 151 146 else … … 153 148 const poly p=L->t_p; 154 149 const ring r=strat->tailRing; 155 #ifdef HAVE_RINGS156 150 if(rField_is_Ring(r)) 157 151 { … … 178 172 } 179 173 else 180 #endif181 174 { 182 175 loop … … 483 476 } 484 477 } 478 //printf("\nFound one: ");pWrite(strat->T[j].p); 485 479 //enterT(*h, strat); 486 480 ksReducePoly(h, &(strat->T[j]), NULL, NULL, strat); // with debug output 487 481 //printf("\nAfter small red: ");pWrite(h->p); 488 482 if (h->GetLmTailRing() == NULL) 489 483 { … … 668 662 } 669 663 670 KINLINE int ksReducePolyTailSig(LObject* PR, TObject* PW, LObject* Red )664 KINLINE int ksReducePolyTailSig(LObject* PR, TObject* PW, LObject* Red, kStrategy strat) 671 665 { 672 666 BOOLEAN ret; 673 667 number coef; 674 675 668 assume(PR->GetLmCurrRing() != PW->GetLmCurrRing()); 676 Red->HeadNormalize(); 669 if(!rField_is_Ring(currRing)) 670 Red->HeadNormalize(); 677 671 /* 678 672 printf("------------------------\n"); 679 673 pWrite(Red->GetLmCurrRing()); 680 674 */ 681 ret = ksReducePolySig(Red, PW, 1, NULL, &coef); 682 683 675 ret = ksReducePolySig(Red, PW, 1, NULL, &coef, strat); 684 676 if (!ret) 685 677 { 686 if (! n_IsOne(coef, currRing->cf) )678 if (! n_IsOne(coef, currRing->cf) && !rField_is_Ring(currRing)) 687 679 { 688 680 PR->Mult_nn(coef); … … 706 698 int redSig (LObject* h,kStrategy strat) 707 699 { 700 //Since reduce is really bad for SBA we use the following idea: 701 // We first check if we can build a gcd pair between h and S 702 //where the sig remains the same and replace h by this gcd poly 703 #if GCD_SBA 704 #if ADIDEBUG 705 printf("\nBefore sbaCheckGcdPair ");pWrite(h->p); 706 #endif 707 //sbaCheckGcdPair(h,strat); 708 while(sbaCheckGcdPair(h,strat)) 709 { 710 #if ADIDEBUG 711 printf("\nIntermidiate sbaCheckGcdPair ");pWrite(h->p); 712 #endif 713 h->sev = pGetShortExpVector(h->p); 714 } 715 #if ADIDEBUG 716 printf("\nAfter sbaCheckGcdPair ");pWrite(h->p); 717 #endif 718 #endif 719 #ifdef HAVE_RINGS 720 poly beforeredsig; 721 if(rField_is_Ring(currRing)) 722 beforeredsig = pCopy(h->sig); 723 #endif 708 724 if (strat->tl<0) return 1; 709 725 //if (h->GetLmTailRing()==NULL) return 0; // HS: SHOULD NOT BE NEEDED! 710 726 //printf("FDEGS: %ld -- %ld\n",h->FDeg, h->pFDeg()); 711 727 assume(h->FDeg == h->pFDeg()); 728 #if ADIDEBUG 729 printf("\n--------------------------redSig-------------------------------------\n"); 730 printf("\nBefore redSig:\n"); 731 p_Write(h->p,strat->tailRing);pWrite(h->sig); 732 #endif 712 733 //#if 1 713 734 #ifdef DEBUGF5 … … 739 760 if (j < 0) 740 761 { 741 return 1; 762 #if GCD_SBA 763 #if ADIDEBUG 764 printf("\nBefore sbaCheckGcdPair ");pWrite(h->p); 765 #endif 766 //sbaCheckGcdPair(h,strat); 767 while(sbaCheckGcdPair(h,strat)) 768 { 769 #if ADIDEBUG 770 printf("\nIntermidiate sbaCheckGcdPair ");pWrite(h->p); 771 #endif 772 h->sev = pGetShortExpVector(h->p); 773 h->is_redundant = FALSE; 774 start = 0; 775 } 776 #if ADIDEBUG 777 printf("\nAfter sbaCheckGcdPair ");pWrite(h->p); 778 #endif 779 #endif 780 // over ZZ: cleanup coefficients by complete reduction with monomials 781 postReduceByMonSig(h, strat); 782 if(h->p == NULL || nIsZero(pGetCoeff(h->p))) return 2; 783 j = kFindDivisibleByInT(strat, h,start); 784 if(j < 0) 785 { 786 if(strat->tl >= 0) 787 h->i_r1 = strat->tl; 788 else 789 h->i_r1 = -1; 790 if (h->GetLmTailRing() == NULL) 791 { 792 if (h->lcm!=NULL) pLmDelete(h->lcm); 793 h->Clear(); 794 return 0; 795 } 796 #ifdef HAVE_RINGS 797 if(rField_is_Ring(currRing)) 798 { 799 //Check for sigdrop after reduction 800 if(pLtCmp(beforeredsig,h->sig) == 1) 801 { 802 #if ADIDEBUG 803 printf("\nSigDrop after reduce\n");pWrite(beforeredsig);pWrite(h->sig); 804 #endif 805 strat->sigdrop = TRUE; 806 //Reduce it as much as you can 807 int red_result = redRing(h,strat); 808 if(red_result == 0) 809 { 810 //It reduced to 0, cancel the sigdrop 811 #if ADIDEBUG 812 printf("\nReduced to 0 via redRing. Cancel sigdrop\n"); 813 #endif 814 strat->sigdrop = FALSE; 815 p_Delete(&h->sig,currRing);h->sig = NULL; 816 return 0; 817 } 818 else 819 { 820 #if ADIDEBUG 821 printf("\nReduced to this via redRing.SIGDROP\n");pWrite(h->p); 822 #endif 823 //strat->enterS(*h, strat->sl+1, strat, strat->tl); 824 return 0; 825 } 826 } 827 p_Delete(&beforeredsig,currRing); 828 } 829 #endif 830 return 1; 831 } 742 832 } 743 833 … … 749 839 */ 750 840 i = j; 751 #if 1752 841 if (TEST_OPT_LENGTH) 753 loop 754 { 755 /*- search the shortest possible with respect to length -*/ 756 i++; 757 if (i > strat->tl) 758 break; 759 if (li<=1) 760 break; 761 if ((strat->T[i].pLength < li) 762 && 763 p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i], 764 h_p, not_sev, strat->tailRing)) 765 { 766 /* 767 * the polynomial to reduce with is now; 768 */ 769 li = strat->T[i].pLength; 770 ii = i; 842 if(rField_is_Ring(currRing)) 843 { 844 loop 845 { 846 /*- search the shortest possible with respect to length -*/ 847 i++; 848 if (i > strat->tl) 849 break; 850 if (li<=1) 851 break; 852 if ((strat->T[i].pLength < li) 853 && n_DivBy(pGetCoeff(h_p),pGetCoeff(strat->T[i].p),currRing->cf) 854 && p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i], 855 h_p, not_sev, strat->tailRing)) 856 { 857 /* 858 * the polynomial to reduce with is now; 859 */ 860 li = strat->T[i].pLength; 861 ii = i; 862 } 863 } 864 } 865 else 866 { 867 loop 868 { 869 /*- search the shortest possible with respect to length -*/ 870 i++; 871 if (i > strat->tl) 872 break; 873 if (li<=1) 874 break; 875 if ((strat->T[i].pLength < li) 876 && p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i], 877 h_p, not_sev, strat->tailRing)) 878 { 879 /* 880 * the polynomial to reduce with is now; 881 */ 882 li = strat->T[i].pLength; 883 ii = i; 884 } 771 885 } 772 886 } 773 887 start = ii+1; 774 #endif775 888 776 889 /* … … 800 913 printf("INDEX OF REDUCER T: %d\n",ii); 801 914 #endif 915 #if ADIDEBUG 916 printf("\nWe reduce it with:\n");p_Write(strat->T[ii].p,strat->tailRing);pWrite(strat->T[ii].sig); 917 #endif 802 918 sigSafe = ksReducePolySig(h, &(strat->T[ii]), strat->S_2_R[ii], NULL, NULL, strat); 919 #if ADIDEBUG 920 printf("\nAfter small reduction:\n");pWrite(h->p);pWrite(h->sig); 921 #endif 922 if(rField_is_Ring(currRing) && h->p == NULL && h->sig == NULL) 923 { 924 //Trivial case catch 925 strat->sigdrop = FALSE; 926 } 927 #if 0 928 //If the reducer has the same lt (+ or -) as the other one, reduce it via redRing 929 //In some cases this proves to be very bad 930 if(rField_is_Ring(currRing) && h->p != NULL && pLmCmp(h->p,strat->T[ii].p)==0) 931 { 932 #if ADIDEBUG 933 printf("\nReducer and Original have same LT. Force it with redRing!\n"); 934 #endif 935 int red_result = redRing(h,strat); 936 if(red_result == 0) 937 { 938 #if ADIDEBUG 939 printf("\nRedRing reduced it to 0. Perfect\n"); 940 #endif 941 pDelete(&h->sig);h->sig = NULL; 942 return 0; 943 } 944 else 945 { 946 #if ADIDEBUG 947 printf("\nRedRing reduced it to *.\nHave to sigdrop now\n");pWrite(h->p); 948 #endif 949 strat->sigdrop = TRUE; 950 return 1; 951 } 952 } 953 #endif 954 if(strat->sigdrop) 955 return 1; 803 956 #if SBA_PRINT_REDUCTION_STEPS 804 957 if (sigSafe != 3) … … 902 1055 loop 903 1056 { 1057 if(rField_is_Ring(currRing) && strat->sigdrop) 1058 break; 904 1059 Ln.SetShortExpVector(); 905 1060 if (withT) … … 920 1075 cnt=REDTAIL_CANONICALIZE; 921 1076 /*poly tmp=*/Ln.CanonicalizeP(); 922 if (normalize )1077 if (normalize && !rField_is_Ring(currRing)) 923 1078 { 924 1079 Ln.Normalize(); … … 927 1082 } 928 1083 } 929 if (normalize && (!TEST_OPT_INTSTRATEGY) && (!nIsOne(pGetCoeff(With->p))))1084 if (normalize && (!TEST_OPT_INTSTRATEGY) && !rField_is_Ring(currRing) && (!nIsOne(pGetCoeff(With->p)))) 930 1085 { 931 1086 With->pNorm(); 932 1087 } 933 1088 strat->redTailChange=TRUE; 934 int ret = ksReducePolyTailSig(L, With, &Ln); 1089 #if ADIDEBUG 1090 printf("\nWill TAILreduce * with *:\n");pWrite(Ln.p);pWrite(Ln.sig); 1091 pWrite(With->p);pWrite(With->sig);pWrite(L->sig); 1092 #endif 1093 int ret = ksReducePolyTailSig(L, With, &Ln, strat); 1094 if(rField_is_Ring(currRing)) 1095 L->sig = Ln.sig; 1096 //Because Ln.sig is set to L->sig, but in ksReducePolyTailSig -> ksReducePolySig 1097 // I delete it an then set Ln.sig. Hence L->sig is lost 1098 #if ADIDEBUG 1099 printf("\nAfter small TAILreduce:\n");pWrite(Ln.p);pWrite(Ln.sig);pWrite(L->sig); 1100 #endif 935 1101 #if SBA_PRINT_REDUCTION_STEPS 936 1102 if (ret != 3) … … 957 1123 if (Ln.IsNull()) goto all_done; 958 1124 if (! withT) With_s.Init(currRing); 1125 if(rField_is_Ring(currRing) && strat->sigdrop) 1126 { 1127 //Cannot break the loop here so easily 1128 break; 1129 } 959 1130 } 960 1131 pNext(h) = Ln.LmExtractAndIter(); 961 1132 pIter(h); 962 pNormalize(h); 1133 if(!rField_is_Ring(currRing)) 1134 pNormalize(h); 963 1135 L->pLength++; 964 1136 } 965 966 1137 all_done: 967 1138 Ln.Delete(); … … 972 1143 L->length = 0; 973 1144 } 974 975 1145 //if (TEST_OPT_PROT) { PrintS("N"); mflush(); } 976 1146 //L->Normalize(); // HANNES: should have a test … … 1543 1713 while (strat->Ll >= 0) 1544 1714 { 1715 #if ADIDEBUG 1716 printf("\n ------------------------NEW LOOP\n"); 1717 printf("\nShdl = \n"); 1718 #if 0 1719 idPrint(strat->Shdl); 1720 #else 1721 for(int ii = 0; ii<=strat->sl;ii++) 1722 p_Write(strat->S[ii],strat->tailRing); 1723 #endif 1724 printf("\n list L\n"); 1725 int iii; 1726 #if 1 1727 for(iii = 0; iii<= strat->Ll; iii++) 1728 { 1729 printf("L[%i]:",iii); 1730 p_Write(strat->L[iii].p, currRing); 1731 p_Write(strat->L[iii].p1, currRing); 1732 p_Write(strat->L[iii].p2, currRing); 1733 } 1734 #else 1735 { 1736 printf("L[%i]:",strat->Ll); 1737 p_Write(strat->L[strat->Ll].p, strat->tailRing); 1738 p_Write(strat->L[strat->Ll].p1, strat->tailRing); 1739 p_Write(strat->L[strat->Ll].p2, strat->tailRing); 1740 } 1741 #endif 1742 #if 0 1743 for(iii = 0; iii<= strat->Bl; iii++) 1744 { 1745 printf("B[%i]:",iii); 1746 p_Write(strat->B[iii].p, /*strat->tailRing*/currRing); 1747 p_Write(strat->B[iii].p1, /*strat->tailRing*/currRing); 1748 p_Write(strat->B[iii].p2, strat->tailRing); 1749 } 1750 #endif 1751 //getchar(); 1752 #endif 1545 1753 #ifdef KDEBUG 1546 1754 if (TEST_OPT_DEBUG) messageSets(strat); … … 1695 1903 // posInS only depends on the leading term 1696 1904 strat->enterS(strat->P, pos, strat, strat->tl); 1905 #if ADIDEBUG 1906 printf("\nThis element has been added to S:\n");pWrite(strat->P.p);pWrite(strat->P.p1);pWrite(strat->P.p2); 1907 #endif 1697 1908 #if 0 1698 1909 int pl=pLength(strat->P.p); … … 1855 2066 sba_interreduction_operations = 0; 1856 2067 #endif 1857 2068 1858 2069 ideal F1 = F0; 1859 2070 ring sRing, currRingOld; … … 1868 2079 } 1869 2080 } 2081 ideal F; 1870 2082 // sort ideal F 1871 ideal F = idInit(IDELEMS(F1),F1->rank); 1872 intvec *sort = idSort(F1); 1873 for (int i=0; i<sort->length();++i) 1874 F->m[i] = F1->m[(*sort)[i]-1]; 2083 //Put the SigDrop element on the correct position (think of sbaEnterS) 2084 //We also sort them 2085 if(rField_is_Ring(currRing) && strat->sigdrop) 2086 { 2087 #if 1 2088 F = idInit(IDELEMS(F1),F1->rank); 2089 for (int i=0; i<IDELEMS(F1);++i) 2090 F->m[i] = F1->m[i]; 2091 if(strat->sbaEnterS >= 0) 2092 { 2093 poly dummy; 2094 dummy = pCopy(F->m[0]); //the sigdrop element 2095 for(int i = 0;i<strat->sbaEnterS;i++) 2096 F->m[i] = F->m[i+1]; 2097 F->m[strat->sbaEnterS] = dummy; 2098 } 2099 #else 2100 F = idInit(1,F1->rank); 2101 //printf("\nBefore the initial block sorting:\n");idPrint(F1); 2102 F->m[0] = F1->m[0]; 2103 int pos; 2104 if(strat->sbaEnterS >= 0) 2105 { 2106 for(int i=1;i<=strat->sbaEnterS;i++) 2107 { 2108 pos = posInIdealMonFirst(F,F1->m[i],1,strat->sbaEnterS); 2109 idInsertPolyOnPos(F,F1->m[i],pos); 2110 } 2111 for(int i=strat->sbaEnterS+1;i<IDELEMS(F1);i++) 2112 { 2113 pos = posInIdealMonFirst(F,F1->m[i],strat->sbaEnterS+1,IDELEMS(F)); 2114 idInsertPolyOnPos(F,F1->m[i],pos); 2115 } 2116 poly dummy; 2117 dummy = pCopy(F->m[0]); //the sigdrop element 2118 for(int i = 0;i<strat->sbaEnterS;i++) 2119 F->m[i] = F->m[i+1]; 2120 F->m[strat->sbaEnterS] = dummy; 2121 } 2122 else 2123 { 2124 for(int i=1;i<IDELEMS(F1);i++) 2125 { 2126 pos = posInIdealMonFirst(F,F1->m[i],1,IDELEMS(F)); 2127 idInsertPolyOnPos(F,F1->m[i],pos); 2128 } 2129 } 2130 #endif 2131 //printf("\nAfter the initial block sorting:\n");idPrint(F);getchar(); 2132 } 2133 else 2134 { 2135 F = idInit(IDELEMS(F1),F1->rank); 2136 intvec *sort = idSort(F1); 2137 for (int i=0; i<sort->length();++i) 2138 F->m[i] = F1->m[(*sort)[i]-1]; 2139 // put the monomials after the sbaEnterS polynomials 2140 //printf("\nThis is the ideal before sorting (sbaEnterS = %i)\n",strat->sbaEnterS);idPrint(F); 2141 int nrmon = 0; 2142 for(int i = IDELEMS(F)-1,j;i>strat->sbaEnterS+nrmon+1 ;i--) 2143 { 2144 //pWrite(F->m[i]); 2145 if(F->m[i] != NULL && pNext(F->m[i]) == NULL) 2146 { 2147 poly mon = F->m[i]; 2148 for(j = i;j>strat->sbaEnterS+nrmon+1;j--) 2149 { 2150 F->m[j] = F->m[j-1]; 2151 } 2152 F->m[j] = mon; 2153 nrmon++; 2154 } 2155 //idPrint(F); 2156 } 2157 } 2158 //printf("\nThis is the ideal after sorting\n");idPrint(F);getchar(); 2159 #ifdef HAVE_RINGS 2160 if(rField_is_Ring(currRing)) 2161 strat->sigdrop = FALSE; 2162 strat->nrsyzcrit = 0; 2163 strat->nrrewcrit = 0; 2164 #endif 1875 2165 #if SBA_INTERRED_START 1876 2166 F = kInterRed(F,NULL); … … 1888 2178 BOOLEAN withT = TRUE; 1889 2179 strat->max_lower_index = 0; 1890 1891 2180 //initBuchMoraCrit(strat); /*set Gebauer, honey, sugarCrit*/ 1892 2181 initSbaCrit(strat); /*set Gebauer, honey, sugarCrit*/ … … 1899 2188 srmax = strat->sl; 1900 2189 reduc = olddeg = lrmax = 0; 1901 1902 2190 #ifndef NO_BUCKETS 1903 2191 if (!TEST_OPT_NOT_BUCKETS) … … 1922 2210 kDebugPrint(strat); 1923 2211 } 1924 1925 2212 // We add the elements directly in S from the previous loop 2213 if(rField_is_Ring(currRing) && strat->sbaEnterS >= 0) 2214 { 2215 for(int i = 0;i<strat->sbaEnterS;i++) 2216 { 2217 //Update: now the element is at the corect place 2218 //i+1 because on the 0 position is the sigdrop element 2219 enterT(strat->L[strat->Ll-(i)],strat); 2220 strat->enterS(strat->L[strat->Ll-(i)], strat->sl+1, strat, strat->tl); 2221 } 2222 strat->Ll = strat->Ll - strat->sbaEnterS; 2223 strat->sbaEnterS = -1; 2224 } 2225 kTest_TS(strat); 1926 2226 #ifdef KDEBUG 1927 2227 //kDebugPrint(strat); … … 1930 2230 while (strat->Ll >= 0) 1931 2231 { 2232 #if ADIDEBUG 2233 printf("\n ------------------------NEW LOOP\n"); 2234 printf("\nShdl = \n"); 2235 #if 0 2236 idPrint(strat->Shdl); 2237 #else 2238 for(int ii = 0; ii<=strat->sl;ii++) 2239 { 2240 printf("\nS[%i]: ",ii);p_Write(strat->S[ii],strat->tailRing); 2241 printf("sig: ");pWrite(strat->sig[ii]); 2242 } 2243 #endif 2244 #if 0 2245 for(int iii = 0; iii< strat->syzl; iii++) 2246 { 2247 printf("\nsyz[%i]:\n",iii); 2248 p_Write(strat->syz[iii], currRing); 2249 } 2250 #endif 2251 #if 0 2252 for(int iii = 0; iii<= strat->tl; iii++) 2253 { 2254 printf("\nT[%i]:\n",iii); 2255 p_Write(strat->T[iii].p, currRing); 2256 } 2257 #endif 2258 printf("\n list L\n"); 2259 int iii; 2260 #if 1 2261 for(iii = 0; iii<= strat->Ll; iii++) 2262 { 2263 printf("\nL[%i]:\n",iii); 2264 p_Write(strat->L[iii].p, currRing); 2265 p_Write(strat->L[iii].p1, currRing); 2266 p_Write(strat->L[iii].p2, currRing); 2267 p_Write(strat->L[iii].sig, currRing); 2268 } 2269 #else 2270 { 2271 printf("L[%i]:",strat->Ll); 2272 p_Write(strat->L[strat->Ll].p, strat->tailRing); 2273 p_Write(strat->L[strat->Ll].p1, strat->tailRing); 2274 p_Write(strat->L[strat->Ll].p2, strat->tailRing); 2275 p_Write(strat->L[strat->Ll].sig, strat->tailRing); 2276 } 2277 #endif 2278 //getchar(); 2279 #endif 1932 2280 if (strat->Ll > lrmax) lrmax =strat->Ll;/*stat.*/ 1933 2281 #ifdef KDEBUG … … 1965 2313 // initialize new syzygy rules for the next iteration step 1966 2314 initSyzRules(strat); 1967 1968 2315 } 1969 2316 /********************************************************************* … … 1974 2321 strat->P = strat->L[strat->Ll]; 1975 2322 strat->Ll--; 2323 2324 #ifdef HAVE_RINGS 2325 if(rField_is_Ring(currRing)) 2326 strat->sbaEnterS = pGetComp(strat->P.sig) - 1; 2327 #endif 2328 2329 #if ADIDEBUG 2330 printf("\n-------------------------\nThis is the current element P\n"); 2331 pWrite(strat->P.p); 2332 pWrite(strat->P.p1); 2333 pWrite(strat->P.p2); 2334 pWrite(strat->P.sig); 2335 #endif 1976 2336 /* reduction of the element chosen from L */ 1977 1978 if (!strat->rewCrit2(strat->P.sig, ~strat->P.sevSig, strat->P.GetLmCurrRing(), strat, strat->P.checked+1)) { 2337 // We do not delete via RewCrit strong pairs or extended spolys over rings 2338 // these should have .lcm = NULL 2339 if (strat->P.lcm == NULL || !strat->rewCrit2(strat->P.sig, ~strat->P.sevSig, strat->P.GetLmCurrRing(), strat, strat->P.checked+1)) { 1979 2340 //#if 1 1980 2341 #ifdef DEBUGF5 … … 2025 2386 strat->P.p2=p_Copy(strat->P.p, currRing, strat->tailRing); 2026 2387 // for input polys, prepare reduction 2027 strat->P.PrepareRed(strat->use_buckets); 2388 if(!rField_is_Ring(currRing)) 2389 strat->P.PrepareRed(strat->use_buckets); 2028 2390 } 2029 2391 if (strat->P.p == NULL && strat->P.t_p == NULL) … … 2063 2425 red_result = 2; 2064 2426 } 2427 if(rField_is_Ring(currRing)) 2428 { 2429 if(strat->P.sig!= NULL && !nGreaterZero(pGetCoeff(strat->P.sig))) 2430 { 2431 strat->P.p = pNeg(strat->P.p); 2432 strat->P.sig = pNeg(strat->P.sig); 2433 } 2434 strat->P.pLength = pLength(strat->P.p); 2435 if(strat->P.sig != NULL) 2436 strat->P.sevSig = pGetShortExpVector(strat->P.sig); 2437 if(strat->P.p != NULL) 2438 strat->P.sev = pGetShortExpVector(strat->P.p); 2439 } 2440 #if ADIDEBUG 2441 printf("\nAfter reduce (redresult=%i): \n",red_result);pWrite(strat->P.p);pWrite(strat->P.sig); 2442 #endif 2443 //sigdrop case 2444 if(rField_is_Ring(currRing) && strat->sigdrop) 2445 { 2446 //First reduce it as much as one can 2447 #if ADIDEBUG 2448 printf("\nSigdrop in the reduce. Trying redring\n"); 2449 #endif 2450 red_result = redRing(&strat->P,strat); 2451 if(red_result == 0) 2452 { 2453 #if ADIDEBUG 2454 printf("\nSigdrop cancelled since redRing reduced to 0\n"); 2455 #endif 2456 strat->sigdrop = FALSE; 2457 pDelete(&strat->P.sig); 2458 strat->P.sig = NULL; 2459 } 2460 else 2461 { 2462 #if ADIDEBUG 2463 printf("\nStill Sigdrop - redRing reduced to:\n");pWrite(strat->P.p); 2464 #endif 2465 strat->enterS(strat->P, 0, strat, strat->tl); 2466 if (TEST_OPT_PROT) 2467 PrintS("-"); 2468 break; 2469 } 2470 } 2471 if(strat->blockred > strat->blockredmax) 2472 { 2473 #if ADIDEBUG 2474 printf("\nToo many blocked reductions\n"); 2475 #endif 2476 strat->sigdrop = TRUE; 2477 break; 2478 } 2479 2065 2480 if (errorreported) break; 2066 2481 … … 2075 2490 } 2076 2491 #endif 2492 if (TEST_OPT_PROT) 2493 { 2494 if(strat->P.p != NULL) 2495 message((strat->honey ? strat->P.ecart : 0) + strat->P.pFDeg(), 2496 &olddeg,&reduc,strat, red_result); 2497 else 2498 message((strat->honey ? strat->P.ecart : 0), 2499 &olddeg,&reduc,strat, red_result); 2500 } 2077 2501 2078 2502 if (strat->overflow) … … 2080 2504 if (!kStratChangeTailRing(strat)) { Werror("OVERFLOW.."); break;} 2081 2505 } 2082 2083 2506 // reduction to non-zero new poly 2084 2507 if (red_result == 1) … … 2106 2529 // in the ring case we cannot expect LC(f) = 1, 2107 2530 // therefore we call pContent instead of pNorm 2531 #ifdef HAVE_RINGS 2532 poly beforetailred; 2533 if(rField_is_Ring(currRing)) 2534 beforetailred = pCopy(strat->P.sig); 2535 #endif 2108 2536 #if SBA_TAIL_RED 2109 if (strat->sbaOrder != 2) { 2110 if ((TEST_OPT_INTSTRATEGY) || (rField_is_Ring(currRing))) 2111 { 2112 strat->P.pCleardenom(); 2113 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2537 if(rField_is_Ring(currRing)) 2538 { 2539 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2540 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT); 2541 } 2542 else 2543 { 2544 if (strat->sbaOrder != 2) { 2545 if (TEST_OPT_INTSTRATEGY) 2114 2546 { 2115 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);2116 2547 strat->P.pCleardenom(); 2548 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2549 { 2550 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT); 2551 strat->P.pCleardenom(); 2552 } 2117 2553 } 2554 else 2555 { 2556 strat->P.pNorm(); 2557 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2558 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT); 2559 } 2560 } 2561 } 2562 // It may happen that we have lost the sig in redtailsba 2563 // It cannot reduce to 0 since here we are doing just tail reduction. 2564 // Best case scenerio: remains the leading term 2565 if(rField_is_Ring(currRing) && strat->sigdrop) 2566 { 2567 #if ADIDEBUG 2568 printf("\n Still sigdrop after redtailSba - it reduced to \n");pWrite(strat->P.p); 2569 #endif 2570 strat->enterS(strat->P, 0, strat, strat->tl); 2571 break; 2572 } 2573 #endif 2574 if(rField_is_Ring(currRing)) 2575 { 2576 if(strat->P.sig == NULL || pLtCmp(beforetailred,strat->P.sig) == 1) 2577 { 2578 #if ADIDEBUG 2579 printf("\nSigDrop after TAILred\n");pWrite(beforetailred);pWrite(strat->P.sig); 2580 #endif 2581 strat->sigdrop = TRUE; 2582 //Reduce it as much as you can 2583 red_result = redRing(&strat->P,strat); 2584 if(red_result == 0) 2585 { 2586 //It reduced to 0, cancel the sigdrop 2587 #if ADIDEBUG 2588 printf("\nReduced to 0 via redRing. Cancel sigdrop\n"); 2589 #endif 2590 strat->sigdrop = FALSE; 2591 p_Delete(&strat->P.sig,currRing);strat->P.sig = NULL; 2118 2592 } 2119 2593 else 2120 2594 { 2121 strat->P.pNorm(); 2122 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2123 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT); 2124 } 2125 } 2126 #endif 2127 2595 #if ADIDEBUG 2596 printf("\nReduced to this via redRing.SIGDROP\n");pWrite(strat->P.p); 2597 #endif 2598 strat->enterS(strat->P, 0, strat, strat->tl); 2599 break; 2600 } 2601 } 2602 p_Delete(&beforetailred,currRing); 2603 // strat->P.p = NULL may appear if we had a sigdrop above and reduced to 0 via redRing 2604 if(strat->P.p == NULL) 2605 goto case_when_red_result_changed; 2606 } 2607 #if ADIDEBUG 2608 printf("\nNach redTailSba: \n"); 2609 pWrite(strat->P.p);pWrite(strat->P.sig); 2610 #endif 2128 2611 // remove sigsafe label since it is no longer valid for the next element to 2129 2612 // be reduced … … 2179 2662 pWrite(strat->P.sig); 2180 2663 */ 2664 if (rField_is_Ring(currRing)) 2665 superenterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl); 2666 else 2667 enterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl); 2668 #if ADIDEBUG 2669 printf("\nThis element is added to S\n"); 2670 p_Write(strat->P.p, strat->tailRing);p_Write(strat->P.p1, strat->tailRing);p_Write(strat->P.p2, strat->tailRing);pWrite(strat->P.sig); 2671 getchar(); 2672 #endif 2673 // posInS only depends on the leading term 2674 2181 2675 #ifdef HAVE_RINGS 2182 if (rField_is_Ring(currRing)) 2183 superenterpairs(strat->P.p,strat->sl,strat->P.ecart,pos,strat, strat->tl); 2184 else 2676 if(rField_is_Ring(currRing) && strat->sigdrop) 2677 break; 2185 2678 #endif 2186 enterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl); 2187 // posInS only depends on the leading term 2679 strat->P.sevSig = p_GetShortExpVector(strat->P.sig,currRing); 2188 2680 strat->enterS(strat->P, pos, strat, strat->tl); 2681 2189 2682 if(strat->sbaOrder != 1) 2190 2683 { … … 2345 2838 else 2346 2839 { 2840 case_when_red_result_changed: 2347 2841 // adds signature of the zero reduction to 2348 2842 // strat->syz. This is the leading term of … … 2354 2848 zeroreductions++; 2355 2849 #endif 2356 int pos = posInSyz(strat, strat->P.sig); 2357 enterSyz(strat->P, strat, pos); 2358 //#if 1 2359 #ifdef DEBUGF5 2360 Print("ADDING STUFF TO SYZ : "); 2361 //pWrite(strat->P.p); 2362 pWrite(strat->P.sig); 2363 #endif 2850 #ifdef HAVE_RINGS 2851 if(rField_is_Ring(currRing) && strat->P.p == NULL && strat->P.sig == NULL) 2852 { 2853 //Catch the case when p = 0, sig = 0 2854 } 2855 else 2856 #endif 2857 { 2858 int pos = posInSyz(strat, strat->P.sig); 2859 enterSyz(strat->P, strat, pos); 2860 //#if 1 2861 #ifdef DEBUGF5 2862 Print("ADDING STUFF TO SYZ : "); 2863 //pWrite(strat->P.p); 2864 pWrite(strat->P.sig); 2865 #endif 2866 } 2364 2867 } 2365 2868 if (strat->P.p1 == NULL && strat->minim > 0) … … 2374 2877 kTest_TS(strat); 2375 2878 } 2879 #if 0 2880 if(strat->sigdrop) 2881 printf("\nSigDrop!\n"); 2882 else 2883 printf("\nEnded with no SigDrop\n"); 2884 #endif 2885 // Clean strat->P for the next sba call 2886 #ifdef HAVE_RINGS 2887 if(rField_is_Ring(currRing) && strat->sigdrop) 2888 { 2889 //This is used to know how many elements can we directly add to S in the next run 2890 if(strat->P.sig != NULL) 2891 strat->sbaEnterS = pGetComp(strat->P.sig)-1; 2892 //else we already set it at the beggining of the loop 2893 #ifdef KDEBUG 2894 memset(&(strat->P), 0, sizeof(strat->P)); 2895 #endif /* KDEBUG */ 2896 } 2897 #endif 2376 2898 #ifdef KDEBUG 2377 2899 if (TEST_OPT_DEBUG) messageSets(strat); … … 2397 2919 } 2398 2920 } 2399 2400 2921 /* complete reduction of the standard basis--------- */ 2401 2922 if (TEST_OPT_REDSB) … … 2421 2942 size_syz = strat->syzl; 2422 2943 #endif 2423 exitSba(strat);2424 2944 // if (TEST_OPT_WEIGHTM) 2425 2945 // { … … 2431 2951 // } 2432 2952 // } 2433 if (TEST_OPT_PROT) messageStat (hilbcount,strat);2953 if (TEST_OPT_PROT) messageStatSBA(hilbcount,strat); 2434 2954 if (Q!=NULL) updateResult(strat->Shdl,Q,strat); 2435 2436 2955 #if SBA_PRINT_SIZE_G 2437 2956 size_g_non_red = IDELEMS(strat->Shdl); 2438 2957 #endif 2958 2959 idTest(strat->Shdl); 2960 // I have to add the initial input polynomials which where not used (p1 and p2 = NULL) 2961 #ifdef HAVE_RINGS 2962 int k; 2963 if(rField_is_Ring(currRing)) 2964 { 2965 //for(k = strat->sl;k>=0;k--) 2966 // {printf("\nS[%i] = %p\n",k,strat->Shdl->m[k]);pWrite(strat->Shdl->m[k]);} 2967 k = strat->Ll; 2968 #if 1 2969 // 1 - adds just the unused ones, 0 - adds everthing 2970 for(;k>=0 && (strat->L[k].p1 != NULL || strat->L[k].p2 != NULL);k--) 2971 { 2972 //printf("\nDeleted k = %i, %p\n",k,strat->L[k].p);pWrite(strat->L[k].p);pWrite(strat->L[k].p1);pWrite(strat->L[k].p2); 2973 deleteInL(strat->L,&strat->Ll,k,strat); 2974 } 2975 #endif 2976 //for(int kk = strat->sl;kk>=0;kk--) 2977 // {printf("\nS[%i] = %p\n",kk,strat->Shdl->m[kk]);pWrite(strat->Shdl->m[kk]);} 2978 //idPrint(strat->Shdl); 2979 idTest(strat->Shdl); 2980 //printf("\nk = %i\n",k); 2981 for(;k>=0 && strat->L[k].p1 == NULL && strat->L[k].p2 == NULL;k--) 2982 { 2983 //printf("\nAdded k = %i\n",k); 2984 strat->enterS(strat->L[k], strat->sl+1, strat, strat->tl); 2985 //printf("\nThis elements was added from L on pos %i\n",strat->sl);pWrite(strat->S[strat->sl]);pWrite(strat->sig[strat->sl]); 2986 } 2987 } 2988 // Find the "sigdrop element" and put the same signature as the previous one - do we really need this?? - now i put it on the 0 position - no more comparing needed 2989 #if 0 2990 if(strat->sigdrop && rField_is_Ring(currRing)) 2991 { 2992 for(k=strat->sl;k>=0;k--) 2993 { 2994 printf("\nsig[%i] = ",i);pWrite(strat->sig[k]); 2995 if(strat->sig[k] == NULL) 2996 strat->sig[k] = pCopy(strat->sig[k-1]); 2997 } 2998 } 2999 #endif 3000 #endif 3001 //Never do this - you will damage S 3002 //idSkipZeroes(strat->Shdl); 3003 //idPrint(strat->Shdl); 3004 idTest(strat->Shdl); 3005 2439 3006 if ((strat->sbaOrder == 1 || strat->sbaOrder == 3) && sRing!=currRingOld) 2440 3007 { … … 2442 3009 F0 = idrMoveR (F1, sRing, currRing); 2443 3010 strat->Shdl = idrMoveR_NoSort (strat->Shdl, sRing, currRing); 3011 rChangeCurrRing (sRing); 3012 exitSba(strat); 3013 rChangeCurrRing (currRingOld); 3014 if(strat->tailRing == sRing) 3015 strat->tailRing = currRing; 2444 3016 rDelete (sRing); 2445 3017 } 2446 id_DelDiv(strat->Shdl, currRing); 3018 #ifdef HAVE_RINGS 3019 //if(nCoeff_is_Ring_Z(currRing->cf)) 3020 // finalReduceByMon(strat); 3021 if(rField_is_Ring(currRing) && !strat->sigdrop) 3022 #endif 3023 id_DelDiv(strat->Shdl, currRing); 2447 3024 idSkipZeroes(strat->Shdl); 2448 3025 idTest(strat->Shdl); … … 2707 3284 } 2708 3285 strat->initEcart(&h); 2709 pos = strat->Ll+1; 3286 if(rField_is_Ring(currRing)) 3287 pos = posInLF5CRing(strat->L, Ll_old+1,strat->Ll,&h,strat); 3288 else 3289 pos = strat->Ll+1; 2710 3290 h.sev = pGetShortExpVector(h.p); 2711 3291 enterL(&strat->L,&strat->Ll,&strat->Lmax,h,pos); … … 2774 3354 strat->P.p2=p_Copy(strat->P.p, currRing, strat->tailRing); 2775 3355 // for input polys, prepare reduction 2776 strat->P.PrepareRed(strat->use_buckets); 3356 if(!rField_is_Ring(currRing)) 3357 strat->P.PrepareRed(strat->use_buckets); 2777 3358 } 2778 3359 … … 2813 3394 /* statistic */ 2814 3395 if (TEST_OPT_PROT) PrintS("s"); 2815 2816 int pos=posInS(strat,strat->sl,strat->P.p,strat->P.ecart); 2817 3396 int pos; 3397 #if 1 3398 if(!rField_is_Ring(currRing)) 3399 pos = posInS(strat,strat->sl,strat->P.p,strat->P.ecart); 3400 else 3401 pos = posInSMonFirst(strat,strat->sl,strat->P.p,strat->P.ecart); 3402 #else 3403 pos = posInS(strat,strat->sl,strat->P.p,strat->P.ecart); 3404 #endif 2818 3405 // reduce the tail and normalize poly 2819 3406 // in the ring case we cannot expect LC(f) = 1, … … 2926 3513 for (cc=strat->sl+1; cc<IDELEMS(strat->Shdl); ++cc) 2927 3514 strat->Shdl->m[cc] = NULL; 3515 #if 0 3516 printf("\nAfter f5c sorting\n"); 3517 for(int i=0;i<=strat->sl;i++) 3518 pWrite(pHead(strat->S[i])); 3519 getchar(); 3520 #endif 2928 3521 //#if 1 2929 3522 #if DEBUGF5 -
kernel/GBEngine/kutil.cc
r34183a rc66a53 13 13 14 14 #define ADIDEBUG 0 15 //All vs Just strategy over rings: 16 // 1 - Just 17 // 0 - All 18 #define ALL_VS_JUST 0 19 //Extended Spoly Strategy: 20 // 0 - new gen sig 21 // 1 - ann*old sig 22 #define EXT_POLY_NEW 0 15 23 16 24 #include <kernel/mod2.h> … … 554 562 pGetShallowCopyDeleteProc(strat->tailRing, currRing) : 555 563 NULL); 556 557 564 for (j=0; j<=strat->tl; j++) 558 565 { … … 575 582 } 576 583 else 577 pDelete(&p); 584 { 585 //pDelete(&p); 586 p = NULL; 587 } 578 588 break; 579 589 } … … 862 872 { 863 873 int i; 864 865 874 // test P 866 875 kFalseReturn(kTest_L(&(strat->P), strat->tailRing, … … 1221 1230 assume(i<=strat->sl); 1222 1231 assume(p!=NULL); 1232 #if ALL_VS_JUST 1233 //Over rings, if we construct the strong pair, do not add the spair 1234 if(rField_is_Ring(currRing)) 1235 { 1236 number s,t,d; 1237 d = n_ExtGcd(pGetCoeff(p), pGetCoeff(strat->S[i]), &s, &t, currRing->cf); 1238 1239 if (!nIsZero(s) && !nIsZero(t)) // evtl. durch divBy tests ersetzen 1240 { 1241 nDelete(&d); 1242 nDelete(&s); 1243 nDelete(&t); 1244 return; 1245 } 1246 nDelete(&d); 1247 nDelete(&s); 1248 nDelete(&t); 1249 } 1250 #endif 1223 1251 int l,j,compare,compareCoeff; 1224 1252 LObject h; … … 1565 1593 return TRUE; 1566 1594 } 1595 1596 BOOLEAN sbaCheckGcdPair (LObject* h,kStrategy strat) 1597 { 1598 if(strat->sl < 0) return FALSE; 1599 int i; 1600 for(i=0;i<strat->sl;i++) 1601 { 1602 //Construct the gcd pair between h and S[i] 1603 number d, s, t; 1604 poly m1, m2, gcd; 1605 d = n_ExtGcd(pGetCoeff(h->p), pGetCoeff(strat->S[i]), &s, &t, currRing->cf); 1606 if (nIsZero(s) || nIsZero(t)) // evtl. durch divBy tests ersetzen 1607 { 1608 nDelete(&d); 1609 nDelete(&s); 1610 nDelete(&t); 1611 } 1612 else 1613 { 1614 k_GetStrongLeadTerms(h->p, strat->S[i], currRing, m1, m2, gcd, strat->tailRing); 1615 pSetCoeff0(m1, s); 1616 pSetCoeff0(m2, t); 1617 pSetCoeff0(gcd, d); 1618 pNext(gcd) = p_Add_q(pp_Mult_mm(pNext(h->p), m1, strat->tailRing), pp_Mult_mm(pNext(strat->S[i]), m2, strat->tailRing), strat->tailRing); 1619 poly pSigMult = p_Copy(h->sig,currRing); 1620 poly sSigMult = p_Copy(strat->sig[i],currRing); 1621 pSigMult = p_Mult_mm(pSigMult,m1,currRing); 1622 sSigMult = p_Mult_mm(sSigMult,m2,currRing); 1623 p_LmDelete(m1, strat->tailRing); 1624 p_LmDelete(m2, strat->tailRing); 1625 poly pairsig = p_Add_q(pSigMult,sSigMult,currRing); 1626 if(pairsig!= NULL && pLtCmp(pairsig,h->sig) == 0) 1627 { 1628 #if ADIDEBUG 1629 printf("\nCan replace * (sig = *) with * (sig = *) since of * with sig *\n"); 1630 pWrite(h->p);pWrite(h->sig);pWrite(gcd);pWrite(pairsig);pWrite(strat->S[i]);pWrite(strat->sig[i]); 1631 //getchar(); 1632 #endif 1633 pDelete(&h->p); 1634 h->p = gcd; 1635 pDelete(&h->sig); 1636 h->sig = pairsig; 1637 pNext(h->sig) = NULL; 1638 strat->initEcart(h); 1639 h->sev = pGetShortExpVector(h->p); 1640 h->sevSig = pGetShortExpVector(h->sig); 1641 h->i_r1 = -1;h->i_r2 = -1; 1642 if(h->lcm != NULL) 1643 { 1644 pDelete(&h->lcm); 1645 h->lcm = NULL; 1646 } 1647 if (currRing!=strat->tailRing) 1648 h->t_p = k_LmInit_currRing_2_tailRing(h->p, strat->tailRing); 1649 return TRUE; 1650 } 1651 //Delete what you didn't use 1652 pDelete(&gcd); 1653 pDelete(&pairsig); 1654 } 1655 } 1656 return FALSE; 1657 } 1658 1659 BOOLEAN enterOneStrongPolySig (int i,poly p,poly sig,int /*ecart*/, int /*isFromQ*/,kStrategy strat, int atR) 1660 { 1661 number d, s, t; 1662 assume(atR >= 0); 1663 poly m1, m2, gcd,si; 1664 assume(i<=strat->sl); 1665 si = strat->S[i]; 1666 //printf("\n--------------------------------\n"); 1667 //pWrite(p);pWrite(si); 1668 d = n_ExtGcd(pGetCoeff(p), pGetCoeff(si), &s, &t, currRing->cf); 1669 1670 if (nIsZero(s) || nIsZero(t)) // evtl. durch divBy tests ersetzen 1671 { 1672 nDelete(&d); 1673 nDelete(&s); 1674 nDelete(&t); 1675 return FALSE; 1676 } 1677 1678 k_GetStrongLeadTerms(p, si, currRing, m1, m2, gcd, strat->tailRing); 1679 //p_Test(m1,strat->tailRing); 1680 //p_Test(m2,strat->tailRing); 1681 /*if(!enterTstrong) 1682 { 1683 while (! kCheckStrongCreation(atR, m1, i, m2, strat) ) 1684 { 1685 memset(&(strat->P), 0, sizeof(strat->P)); 1686 kStratChangeTailRing(strat); 1687 strat->P = *(strat->R[atR]); 1688 p_LmFree(m1, strat->tailRing); 1689 p_LmFree(m2, strat->tailRing); 1690 p_LmFree(gcd, currRing); 1691 k_GetStrongLeadTerms(p, si, currRing, m1, m2, gcd, strat->tailRing); 1692 } 1693 }*/ 1694 pSetCoeff0(m1, s); 1695 pSetCoeff0(m2, t); 1696 pSetCoeff0(gcd, d); 1697 p_Test(m1,strat->tailRing); 1698 p_Test(m2,strat->tailRing); 1699 //printf("\n===================================\n"); 1700 //pWrite(m1);pWrite(m2);pWrite(gcd); 1701 #ifdef KDEBUG 1702 if (TEST_OPT_DEBUG) 1703 { 1704 // Print("t = %d; s = %d; d = %d\n", nInt(t), nInt(s), nInt(d)); 1705 PrintS("m1 = "); 1706 p_wrp(m1, strat->tailRing); 1707 PrintS(" ; m2 = "); 1708 p_wrp(m2, strat->tailRing); 1709 PrintS(" ; gcd = "); 1710 wrp(gcd); 1711 PrintS("\n--- create strong gcd poly: "); 1712 Print("\n p: %d", i); 1713 wrp(p); 1714 Print("\n strat->S[%d]: ", i); 1715 wrp(si); 1716 PrintS(" ---> "); 1717 } 1718 #endif 1719 1720 pNext(gcd) = p_Add_q(pp_Mult_mm(pNext(p), m1, strat->tailRing), pp_Mult_mm(pNext(si), m2, strat->tailRing), strat->tailRing); 1721 1722 #ifdef KDEBUG 1723 if (TEST_OPT_DEBUG) 1724 { 1725 wrp(gcd); 1726 PrintLn(); 1727 } 1728 #endif 1729 1730 //Check and set the signatures 1731 poly pSigMult = p_Copy(sig,currRing); 1732 poly sSigMult = p_Copy(strat->sig[i],currRing); 1733 pSigMult = p_Mult_mm(pSigMult,m1,currRing); 1734 sSigMult = p_Mult_mm(sSigMult,m2,currRing); 1735 p_LmDelete(m1, strat->tailRing); 1736 p_LmDelete(m2, strat->tailRing); 1737 poly pairsig; 1738 if(pLmCmp(pSigMult,sSigMult) == 0) 1739 { 1740 //Same lm, have to add them 1741 pairsig = p_Add_q(pSigMult,sSigMult,currRing); 1742 //This might be zero 1743 } 1744 else 1745 { 1746 //Set the sig to either pSigMult or sSigMult 1747 if(pLtCmp(pSigMult,sSigMult)==1) 1748 { 1749 pairsig = pSigMult; 1750 pDelete(&sSigMult); 1751 } 1752 else 1753 { 1754 pairsig = sSigMult; 1755 pDelete(&pSigMult); 1756 } 1757 } 1758 1759 LObject h; 1760 h.p = gcd; 1761 h.tailRing = strat->tailRing; 1762 h.sig = pairsig; 1763 int posx; 1764 h.pCleardenom(); 1765 strat->initEcart(&h); 1766 h.sev = pGetShortExpVector(h.p); 1767 h.i_r1 = -1;h.i_r2 = -1; 1768 if (currRing!=strat->tailRing) 1769 h.t_p = k_LmInit_currRing_2_tailRing(h.p, strat->tailRing); 1770 if(h.sig == NULL) 1771 { 1772 #if ADIDEBUG 1773 printf("\nPossible sigdrop in enterpairstrongSig (due to lost of sig)\n"); 1774 #endif 1775 //sigdrop since we loose the signature 1776 strat->sigdrop = TRUE; 1777 //Try to reduce it as far as we can via redRing 1778 int red_result = redRing(&h,strat); 1779 #if ADIDEBUG 1780 printf("\nAfter redRing reduce:\n");pWrite(h.p); 1781 #endif 1782 if(red_result == 0) 1783 { 1784 // Cancel the sigdrop 1785 #if ADIDEBUG 1786 printf("\nCancel the sigdrop. It reduced to 0\n"); 1787 #endif 1788 p_Delete(&h.sig,currRing);h.sig = NULL; 1789 strat->sigdrop = FALSE; 1790 return FALSE; 1791 } 1792 else 1793 { 1794 #if ADIDEBUG 1795 printf("\nSigdrop. end\n"); 1796 #endif 1797 strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1); 1798 #if 1 1799 strat->enterS(h,0,strat,strat->tl); 1800 #endif 1801 return FALSE; 1802 } 1803 } 1804 if(!nGreaterZero(pGetCoeff(h.sig))) 1805 { 1806 h.sig = pNeg(h.sig); 1807 h.p = pNeg(h.p); 1808 } 1809 #ifdef HAVE_RINGS 1810 1811 if(rField_is_Ring(currRing) && 1812 pLtCmp(h.sig,sig) == -1 1813 ) 1814 { 1815 #if ADIDEBUG 1816 printf("\nSigDrop in enteronestrongpolySig\n"); 1817 pWrite(h.sig); 1818 pWrite(p);pWrite(sig); 1819 pWrite(strat->S[i]);pWrite(strat->sig[i]); 1820 #endif 1821 strat->sigdrop = TRUE; 1822 // Completely reduce it 1823 int red_result = redRing(&h,strat); 1824 if(red_result == 0) 1825 { 1826 // Reduced to 0 1827 #if ADIDEBUG 1828 printf("\nCancel the sigdrop after redRing (=0)\n"); 1829 #endif 1830 strat->sigdrop = FALSE; 1831 p_Delete(&h.sig,currRing);h.sig = NULL; 1832 return FALSE; 1833 } 1834 else 1835 { 1836 #if ADIDEBUG 1837 printf("\nAfter redRing still sigdrop:\n");pWrite(h.p); 1838 #endif 1839 strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1); 1840 // 0 - add just the original poly causing the sigdrop, 1 - add also this 1841 #if 1 1842 strat->enterS(h,0,strat, strat->tl+1); 1843 #endif 1844 return FALSE; 1845 } 1846 } 1847 #endif 1848 #if ADIDEBUG 1849 printf("\nThis strong poly was added to L:\n");pWrite(h.p);pWrite(h.p1);pWrite(h.p2);pWrite(h.sig); 1850 #endif 1851 //Check for sigdrop 1852 if(gcd != NULL && pLtCmp(sig,pairsig) > 0 && pLtCmp(strat->sig[i],pairsig) > 0) 1853 { 1854 #if ADIDEBUG 1855 printf("\nSigDrop in strongpair\noriginals: ");pWrite(sig);pWrite(strat->sig[i]); 1856 printf("\nnow: ");pWrite(pairsig); 1857 #endif 1858 strat->sigdrop = TRUE; 1859 //Enter this element to S 1860 strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1); 1861 strat->enterS(h,strat->sl+1,strat,strat->tl+1); 1862 } 1863 #if 1 1864 h.p1 = p;h.p2 = strat->S[i]; 1865 #endif 1866 if (atR >= 0) 1867 { 1868 h.i_r2 = strat->S_2_R[i]; 1869 h.i_r1 = atR; 1870 } 1871 else 1872 { 1873 h.i_r1 = -1; 1874 h.i_r2 = -1; 1875 } 1876 if (strat->Ll==-1) 1877 posx =0; 1878 else 1879 posx = strat->posInLSba(strat->L,strat->Ll,&h,strat); 1880 enterL(&strat->L,&strat->Ll,&strat->Lmax,h,posx); 1881 return TRUE; 1882 } 1567 1883 #endif 1568 1884 … … 2073 2389 #endif 2074 2390 { 2391 #if ADIDEBUG 2392 printf("\nTrying to add p and S[%i]\n",i); 2393 pWrite(p);pWrite(pSig); 2394 pWrite(strat->S[i]);pWrite(strat->sig[i]); 2395 #endif 2396 #if ALL_VS_JUST 2397 //Over rings, if we construct the strong pair, do not add the spair 2398 if(rField_is_Ring(currRing)) 2399 { 2400 number s,t,d; 2401 d = n_ExtGcd(pGetCoeff(p), pGetCoeff(strat->S[i]), &s, &t, currRing->cf); 2402 2403 if (!nIsZero(s) && !nIsZero(t)) // evtl. durch divBy tests ersetzen 2404 { 2405 nDelete(&d); 2406 nDelete(&s); 2407 nDelete(&t); 2408 return; 2409 } 2410 nDelete(&d); 2411 nDelete(&s); 2412 nDelete(&t); 2413 } 2414 #endif 2075 2415 assume(i<=strat->sl); 2076 2077 2416 int l; 2078 2417 poly m1 = NULL,m2 = NULL; // we need the multipliers for the s-polynomial to compute … … 2099 2438 2100 2439 // set coeffs of multipliers m1 and m2 2101 pSetCoeff0(m1, nInit(1)); 2102 pSetCoeff0(m2, nInit(1)); 2103 //#if 1 2440 #ifdef HAVE_RINGS 2441 if(rField_is_Ring(currRing)) 2442 { 2443 number s = nCopy(pGetCoeff(strat->S[i])); 2444 number t = nCopy(pGetCoeff(p)); 2445 pSetCoeff0(Lp.lcm, n_Lcm(s, t, currRing->cf)); 2446 ksCheckCoeff(&s, &t, currRing->cf); 2447 pSetCoeff0(m1,s); 2448 pSetCoeff0(m2,t); 2449 #if ADIDEBUG 2450 printf("\nIn Spoly: m1, m2 :\n");pWrite(m1);pWrite(m2); 2451 #endif 2452 } 2453 else 2454 #endif 2455 { 2456 pSetCoeff0(m1, nInit(1)); 2457 pSetCoeff0(m2, nInit(1)); 2458 } 2104 2459 #ifdef DEBUGF5 2105 2460 Print("P1 "); … … 2112 2467 pWrite(m2); 2113 2468 #endif 2469 2114 2470 // get multiplied signatures for testing 2115 pSigMult = currRing->p_Procs->pp_Mult_mm(pSigMult,m1,currRing);2471 pSigMult = pp_Mult_mm(pSigMult,m1,currRing); 2116 2472 pSigMultNegSev = ~p_GetShortExpVector(pSigMult,currRing); 2117 sSigMult = currRing->p_Procs->pp_Mult_mm(sSigMult,m2,currRing);2473 sSigMult = pp_Mult_mm(sSigMult,m2,currRing); 2118 2474 sSigMultNegSev = ~p_GetShortExpVector(sSigMult,currRing); 2119 2120 2475 //#if 1 2121 2476 #ifdef DEBUGF5 … … 2126 2481 Lp.checked = 0; 2127 2482 #endif 2128 int sigCmp = p_LmCmp(pSigMult,sSigMult,currRing); 2483 int sigCmp; 2484 #ifdef HAVE_RINGS 2485 if(rField_is_Ring(currRing)) 2486 sigCmp = p_LtCmpNoAbs(pSigMult,sSigMult,currRing); 2487 else 2488 #endif 2489 sigCmp = p_LmCmp(pSigMult,sSigMult,currRing); 2129 2490 //#if 1 2130 2491 #if DEBUGF5 … … 2133 2494 pWrite(sSigMult); 2134 2495 #endif 2496 //In the ring case we already build the sig 2497 if(rField_is_Ring(currRing)) 2498 { 2499 //I have to test it not in absolute value 2500 if(sigCmp == 0) 2501 { 2502 #if ADIDEBUG 2503 printf("\nPossible sigdrop in enterpairSig (due to lost of sig)\n"); 2504 #endif 2505 //sigdrop since we loose the signature 2506 strat->sigdrop = TRUE; 2507 //Try to reduce it as far as we can via redRing 2508 if(rField_is_Ring(currRing)) 2509 { 2510 poly p1 = p_Copy(p,currRing); 2511 poly p2 = p_Copy(strat->S[i],currRing); 2512 p1 = p_Mult_mm(p1,m1,currRing); 2513 p2 = p_Mult_mm(p2,m2,currRing); 2514 Lp.p = p_Sub(p1,p2,currRing); 2515 if(Lp.p != NULL) 2516 Lp.sev = p_GetShortExpVector(Lp.p,currRing); 2517 } 2518 int red_result = redRing(&Lp,strat); 2519 #if ADIDEBUG 2520 printf("\nAfter redRing reduce:\n");pWrite(Lp.p); 2521 #endif 2522 if(red_result == 0) 2523 { 2524 // Cancel the sigdrop 2525 #if ADIDEBUG 2526 printf("\nCancel the sigdrop. It reduced to 0\n"); 2527 #endif 2528 p_Delete(&Lp.sig,currRing);Lp.sig = NULL; 2529 strat->sigdrop = FALSE; 2530 return; 2531 } 2532 else 2533 { 2534 #if ADIDEBUG 2535 printf("\nSigdrop. end\n"); 2536 #endif 2537 strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1); 2538 #if 1 2539 strat->enterS(Lp,0,strat,strat->tl); 2540 #endif 2541 return; 2542 } 2543 } 2544 if(p_LmCmp(pSigMult,sSigMult,currRing) == 0) 2545 { 2546 //Same lm, have to substract 2547 Lp.sig = p_Sub(pCopy(pSigMult),pCopy(sSigMult),currRing); 2548 } 2549 else 2550 { 2551 if(sigCmp == 1) 2552 { 2553 Lp.sig = pCopy(pSigMult); 2554 } 2555 if(sigCmp == -1) 2556 { 2557 Lp.sig = pNeg(pCopy(sSigMult)); 2558 } 2559 } 2560 Lp.sevSig = p_GetShortExpVector(Lp.sig,currRing); 2561 } 2562 2563 #if 0 2135 2564 if(sigCmp==0) 2136 2565 { … … 2148 2577 return; 2149 2578 } 2579 #endif 2150 2580 // testing by syzCrit = F5 Criterion 2151 2581 // testing by rewCrit1 = Rewritten Criterion … … 2153 2583 if ( strat->syzCrit(pSigMult,pSigMultNegSev,strat) || 2154 2584 strat->syzCrit(sSigMult,sSigMultNegSev,strat) 2155 || strat->rewCrit1(sSigMult,sSigMultNegSev,Lp.lcm,strat,i+1) 2585 // With this rewCrit activated i get a wrong deletion in sba_int_56.tst 2586 //|| strat->rewCrit1(sSigMult,sSigMultNegSev,Lp.lcm,strat,i+1) 2156 2587 ) 2157 2588 { 2589 #if ADIDEBUG 2590 printf("\nDELETED!\n"); 2591 #endif 2158 2592 pDelete(&pSigMult); 2159 2593 pDelete(&sSigMult); … … 2181 2615 else 2182 2616 { 2183 #ifdef HAVE_PLURAL 2184 if ( rIsPluralRing(currRing) ) 2185 { 2186 if(pHasNotCF(p, strat->S[i])) 2617 //Build p 2618 if(rField_is_Ring(currRing)) 2619 { 2620 poly p1 = p_Copy(p,currRing); 2621 poly p2 = p_Copy(strat->S[i],currRing); 2622 p1 = p_Mult_mm(p1,m1,currRing); 2623 p2 = p_Mult_mm(p2,m2,currRing); 2624 Lp.p = p_Sub(p1,p2,currRing); 2625 if(Lp.p != NULL) 2626 Lp.sev = p_GetShortExpVector(Lp.p,currRing); 2627 } 2628 else 2629 { 2630 #ifdef HAVE_PLURAL 2631 if ( rIsPluralRing(currRing) ) 2187 2632 { 2188 2633 if(ncRingType(currRing) == nc_lie) … … 2209 2654 } 2210 2655 else 2211 { 2212 Lp.p = // nc_CreateSpoly(strat->S[i],p,currRing); 2213 nc_CreateShortSpoly(strat->S[i], p, currRing); 2214 2215 assume(pNext(Lp.p)==NULL); // TODO: this may be violated whenever ext.prod.crit. for Lie alg. is used 2216 pNext(Lp.p) = strat->tail; // !!! 2217 } 2218 } 2219 else 2220 #endif 2221 { 2222 assume(!rIsPluralRing(currRing)); 2223 Lp.p = ksCreateShortSpoly(strat->S[i], p, strat->tailRing); 2656 #endif 2657 { 2658 assume(!rIsPluralRing(currRing)); 2659 Lp.p = ksCreateShortSpoly(strat->S[i], p, strat->tailRing); 2660 } 2224 2661 } 2225 2662 } 2226 2663 // store from which element this pair comes from for further tests 2227 2664 //Lp.from = strat->sl+1; 2228 if(sigCmp==currRing->OrdSgn) 2229 { 2230 // pSig > sSig 2231 pDelete (&sSigMult); 2232 Lp.sig = pSigMult; 2233 Lp.sevSig = ~pSigMultNegSev; 2665 #ifdef HAVE_RINGS 2666 if(rField_is_Ring(currRing)) 2667 { 2668 //Put the sig to be > 0 2669 if(!nGreaterZero(pGetCoeff(Lp.sig))) 2670 { 2671 Lp.sig = pNeg(Lp.sig); 2672 Lp.p = pNeg(Lp.p); 2673 } 2234 2674 } 2235 2675 else 2236 { 2237 // pSig < sSig 2238 pDelete (&pSigMult); 2239 Lp.sig = sSigMult; 2240 Lp.sevSig = ~sSigMultNegSev; 2676 #endif 2677 { 2678 if(sigCmp==currRing->OrdSgn) 2679 { 2680 // pSig > sSig 2681 pDelete (&sSigMult); 2682 Lp.sig = pSigMult; 2683 Lp.sevSig = ~pSigMultNegSev; 2684 } 2685 else 2686 { 2687 // pSig < sSig 2688 pDelete (&pSigMult); 2689 Lp.sig = sSigMult; 2690 Lp.sevSig = ~sSigMultNegSev; 2691 } 2241 2692 } 2242 2693 if (Lp.p == NULL) … … 2252 2703 { 2253 2704 pLmFree(Lp.lcm); 2705 #if ADIDEBUG 2706 printf("\nrewCrit3 deletes it!\n"); 2707 #endif 2254 2708 pDelete(&Lp.sig); 2255 2709 Lp.lcm=NULL; … … 2294 2748 (!rIsPluralRing(currRing)) 2295 2749 // || (rIsPluralRing(currRing) && (ncRingType(currRing) != nc_lie)) 2750 #ifdef HAVE_RINGS 2751 && !rField_is_Ring(currRing) 2752 #endif 2296 2753 ) 2297 2754 { … … 2314 2771 if (TEST_OPT_INTSTRATEGY) 2315 2772 { 2316 if (!rIsPluralRing(currRing)) 2773 if (!rIsPluralRing(currRing) 2774 #ifdef HAVE_RINGS 2775 && !rField_is_Ring(currRing) 2776 #endif 2777 ) 2317 2778 nDelete(&(Lp.p->coef)); 2318 2779 } 2319 2320 l = strat->posInLSba(strat->B,strat->Bl,&Lp,strat); 2321 enterL(&strat->B,&strat->Bl,&strat->Bmax,Lp,l); 2780 // Check for sigdrop 2781 #ifdef HAVE_RINGS 2782 if(rField_is_Ring(currRing) && 2783 pLtCmp(Lp.sig,pSig) == -1 2784 ) 2785 { 2786 #if ADIDEBUG 2787 printf("\nSigDrop in enteronepairSig\n");pWrite(Lp.sig); 2788 pWrite(p);pWrite(pSig); 2789 pWrite(strat->S[i]);pWrite(strat->sig[i]); 2790 #endif 2791 strat->sigdrop = TRUE; 2792 // Completely reduce it 2793 int red_result = redRing(&Lp,strat); 2794 if(red_result == 0) 2795 { 2796 // Reduced to 0 2797 #if ADIDEBUG 2798 printf("\nCancel the sigdrop after redRing (=0)\n"); 2799 #endif 2800 strat->sigdrop = FALSE; 2801 p_Delete(&Lp.sig,currRing);Lp.sig = NULL; 2802 return; 2803 } 2804 else 2805 { 2806 #if ADIDEBUG 2807 printf("\nAfter redRing still sigdrop:\n");pWrite(Lp.p); 2808 #endif 2809 strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1); 2810 // 0 - add just the original poly causing the sigdrop, 1 - add also this 2811 #if 1 2812 strat->enterS(Lp,0,strat, strat->tl+1); 2813 #endif 2814 return; 2815 } 2816 } 2817 #endif 2818 #if ADIDEBUG 2819 printf("\nThis spair was added to B:\n"); 2820 pWrite(Lp.p); 2821 pWrite(Lp.p1); 2822 pWrite(Lp.p2); 2823 pWrite(Lp.sig); 2824 #endif 2825 l = strat->posInLSba(strat->L,strat->Ll,&Lp,strat); 2826 enterL(&strat->L,&strat->Ll,&strat->Lmax,Lp,l); 2322 2827 } 2323 2828 } … … 3101 3606 if ((isFromQ)&&(strat->fromQ!=NULL)) 3102 3607 { 3103 for (j=0; j<=k ; j++)3608 for (j=0; j<=k && !strat->sigdrop; j++) 3104 3609 { 3105 3610 if (!strat->fromQ[j]) … … 3114 3619 { 3115 3620 new_pair=TRUE; 3116 for (j=0; j<=k ; j++)3621 for (j=0; j<=k && !strat->sigdrop; j++) 3117 3622 { 3118 3623 enterOnePairSig(j,h,hSig,hFrom,ecart,isFromQ,strat, atR); … … 3123 3628 else 3124 3629 { 3125 for (j=0; j<=k ; j++)3630 for (j=0; j<=k && !strat->sigdrop; j++) 3126 3631 { 3127 3632 if ((pGetComp(h)==pGetComp(strat->S[j])) … … 3135 3640 } 3136 3641 3642 #if 0 3137 3643 if (new_pair) 3138 3644 { … … 3144 3650 strat->chainCrit(h,ecart,strat); 3145 3651 } 3652 #endif 3146 3653 } 3147 3654 } … … 3759 4266 } 3760 4267 } 3761 /* 3762 ring r=256,(x,y,z),dp; 3763 ideal I=12xz-133y, 2xy-z; 3764 */ 4268 } 4269 4270 void initenterstrongPairsSig (poly h,poly hSig, int hFrom, int k,int ecart,int isFromQ,kStrategy strat, int atR = -1) 4271 { 4272 const int iCompH = pGetComp(h); 4273 if (!nIsOne(pGetCoeff(h))) 4274 { 4275 int j; 4276 4277 for (j=0; j<=k && !strat->sigdrop; j++) 4278 { 4279 // Print("j:%d, Ll:%d\n",j,strat->Ll); 4280 // if (((unsigned long) pGetCoeff(h) % (unsigned long) pGetCoeff(strat->S[j]) != 0) && 4281 // ((unsigned long) pGetCoeff(strat->S[j]) % (unsigned long) pGetCoeff(h) != 0)) 4282 if (((iCompH == pGetComp(strat->S[j])) 4283 || (0 == pGetComp(strat->S[j]))) 4284 && ((iCompH<=strat->syzComp)||(strat->syzComp==0))) 4285 { 4286 enterOneStrongPolySig(j,h,hSig,ecart,isFromQ,strat, atR); 4287 } 4288 } 4289 } 3765 4290 } 3766 4291 #endif … … 3822 4347 p = p_LmFreeAndNext(p, strat->tailRing); 3823 4348 pNext(tmp) = p; 3824 LObject h;3825 h.Init();3826 h.p = tmp;3827 h.tailRing = strat->tailRing;4349 LObject Lp; 4350 Lp.Init(); 4351 Lp.p = tmp; 4352 Lp.tailRing = strat->tailRing; 3828 4353 int posx; 3829 if (h.p!=NULL) 3830 { 3831 if (TEST_OPT_INTSTRATEGY) 3832 { 3833 //pContent(h.p); 3834 h.pCleardenom(); // also does a pContent 3835 } 3836 else 3837 { 3838 h.pNorm(); 3839 } 3840 strat->initEcart(&h); 4354 if (Lp.p!=NULL) 4355 { 4356 strat->initEcart(&Lp); 3841 4357 if (strat->Ll==-1) 3842 4358 posx =0; 3843 4359 else 3844 posx = strat->posInL(strat->L,strat->Ll,& h,strat);3845 h.sev = pGetShortExpVector(h.p);4360 posx = strat->posInL(strat->L,strat->Ll,&Lp,strat); 4361 Lp.sev = pGetShortExpVector(Lp.p); 3846 4362 if (strat->tailRing != currRing) 3847 4363 { 3848 h.t_p = k_LmInit_currRing_2_tailRing(h.p, strat->tailRing);4364 Lp.t_p = k_LmInit_currRing_2_tailRing(Lp.p, strat->tailRing); 3849 4365 } 3850 4366 #ifdef KDEBUG … … 3855 4371 } 3856 4372 #endif 4373 enterL(&strat->L,&strat->Ll,&strat->Lmax,Lp,posx); 4374 } 4375 } 4376 } 4377 nDelete(&gcd); 4378 } 4379 4380 void enterExtendedSpolySig(poly h,poly hSig,kStrategy strat) 4381 { 4382 if (nIsOne(pGetCoeff(h))) return; 4383 number gcd; 4384 bool go = false; 4385 if (n_DivBy((number) 0, pGetCoeff(h), currRing->cf)) 4386 { 4387 gcd = n_Ann(pGetCoeff(h),currRing->cf); 4388 go = true; 4389 } 4390 else 4391 gcd = n_Gcd((number) 0, pGetCoeff(h), strat->tailRing->cf); 4392 if (go || !nIsOne(gcd)) 4393 { 4394 poly p = h->next; 4395 if (!go) 4396 { 4397 number tmp = gcd; 4398 gcd = n_Ann(gcd,currRing->cf); 4399 nDelete(&tmp); 4400 } 4401 p_Test(p,strat->tailRing); 4402 p = pp_Mult_nn(p, gcd, strat->tailRing); 4403 4404 if (p != NULL) 4405 { 4406 if (TEST_OPT_PROT) 4407 { 4408 PrintS("Z"); 4409 } 4410 #ifdef KDEBUG 4411 if (TEST_OPT_DEBUG) 4412 { 4413 PrintS("--- create zero spoly: "); 4414 p_wrp(h,currRing,strat->tailRing); 4415 PrintS(" ---> "); 4416 } 4417 #endif 4418 poly tmp = pInit(); 4419 pSetCoeff0(tmp, pGetCoeff(p)); 4420 for (int i = 1; i <= rVar(currRing); i++) 4421 { 4422 pSetExp(tmp, i, p_GetExp(p, i, strat->tailRing)); 4423 } 4424 if (rRing_has_Comp(currRing) && rRing_has_Comp(strat->tailRing)) 4425 { 4426 p_SetComp(tmp, p_GetComp(p, strat->tailRing), currRing); 4427 } 4428 p_Setm(tmp, currRing); 4429 p = p_LmFreeAndNext(p, strat->tailRing); 4430 pNext(tmp) = p; 4431 LObject Lp; 4432 Lp.Init(); 4433 Lp.p = tmp; 4434 //printf("\nOld\n");pWrite(h);pWrite(hSig); 4435 #if EXT_POLY_NEW 4436 Lp.sig = pp_Mult_nn(hSig, gcd, currRing); 4437 if(Lp.sig == NULL || nIsZero(pGetCoeff(Lp.sig))) 4438 { 4439 #if ADIDEBUG 4440 printf("\nSigdrop in enterextended spoly\n");pWrite(h);pWrite(hSig); 4441 #endif 4442 strat->sigdrop = TRUE; 4443 //Try to reduce it as far as we can via redRing 4444 int red_result = redRing(&Lp,strat); 4445 #if ADIDEBUG 4446 printf("\nAfter redRing reduce:\n");pWrite(Lp.p); 4447 #endif 4448 if(red_result == 0) 4449 { 4450 // Cancel the sigdrop 4451 #if ADIDEBUG 4452 printf("\nCancel the sigdrop. It reduced to 0\n"); 4453 #endif 4454 p_Delete(&Lp.sig,currRing);Lp.sig = NULL; 4455 strat->sigdrop = FALSE; 4456 return; 4457 } 4458 else 4459 { 4460 #if ADIDEBUG 4461 printf("\nSigdrop. end\n"); 4462 #endif 4463 strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1); 4464 #if 1 4465 strat->enterS(Lp,0,strat,strat->tl); 4466 #endif 4467 return; 4468 } 4469 4470 } 4471 #else 4472 Lp.sig = pOne(); 4473 if(strat->Ll >= 0) 4474 p_SetComp(Lp.sig,pGetComp(strat->L[0].sig)+1,currRing); 4475 else 4476 p_SetComp(Lp.sig,pGetComp(hSig)+1,currRing); 4477 #endif 4478 Lp.tailRing = strat->tailRing; 4479 int posx; 4480 if (Lp.p!=NULL) 4481 { 4482 strat->initEcart(&Lp); 4483 if (strat->Ll==-1) 4484 posx =0; 4485 else 4486 posx = strat->posInLSba(strat->L,strat->Ll,&Lp,strat); 4487 Lp.sev = pGetShortExpVector(Lp.p); 4488 if (strat->tailRing != currRing) 4489 { 4490 Lp.t_p = k_LmInit_currRing_2_tailRing(Lp.p, strat->tailRing); 4491 } 4492 #ifdef KDEBUG 4493 if (TEST_OPT_DEBUG) 4494 { 4495 p_wrp(tmp,currRing,strat->tailRing); 4496 PrintLn(); 4497 } 4498 #endif 3857 4499 enterL(&strat->L,&strat->Ll,&strat->Lmax,h,posx); 3858 } 3859 } 4500 enterL(&strat->L,&strat->Ll,&strat->Lmax,Lp,posx); 4501 } 4502 } 4503 nDelete(&gcd); 3860 4504 } 3861 4505 nDelete(&gcd); … … 3897 4541 initenterpairs(h, k, ecart, 0, strat, atR); 3898 4542 initenterstrongPairs(h, k, ecart, 0, strat, atR); 4543 clearSbatch(h, k, pos, strat); 4544 } 4545 4546 void superenterpairsSig (poly h,poly hSig,int hFrom,int k,int ecart,int pos,kStrategy strat, int atR) 4547 { 4548 assume (rField_is_Ring_Z(currRing)); 4549 // enter also zero divisor * poly, if this is non zero and of smaller degree 4550 #if ADIDEBUG 4551 printf("\n Trying to add extended spolys\n"); 4552 #endif 4553 if (!(rField_is_Domain(currRing))) enterExtendedSpolySig(h, hSig, strat); 4554 if(strat->sigdrop) return; 4555 #if ADIDEBUG 4556 printf("\n Trying to add spolys\n"); 4557 #endif 4558 initenterpairsSig(h, hSig, hFrom, k, ecart, 0, strat, atR); 4559 if(strat->sigdrop) return; 4560 #if ADIDEBUG 4561 printf("\n Trying to add gcd-polys\n"); 4562 #endif 4563 initenterstrongPairsSig(h, hSig, hFrom,k, ecart, 0, strat, atR); 4564 if(strat->sigdrop) return; 3899 4565 clearSbatch(h, k, pos, strat); 3900 4566 } … … 4176 4842 } 4177 4843 } 4844 } 4845 } 4846 4847 4848 // sorts by degree and pLtCmp 4849 // but puts pure monomials at the beginning 4850 int posInSMonFirst (const kStrategy strat, const int length,const poly p, 4851 const int ecart_p) 4852 { 4853 if (length<0) return 0; 4854 polyset set=strat->S; 4855 if(pNext(p) == NULL) 4856 { 4857 int mon = 0; 4858 for(int i = 0;i<=length;i++) 4859 { 4860 if(set[i] != NULL && pNext(set[i]) == NULL) 4861 mon++; 4862 } 4863 int o = p_Deg(p,currRing); 4864 int op = p_Deg(set[mon],currRing); 4865 4866 if ((op < o) 4867 || ((op == o) && (pLtCmp(set[mon],p) == -1))) 4868 return length+1; 4869 int i; 4870 int an = 0; 4871 int en= mon; 4872 loop 4873 { 4874 if (an >= en-1) 4875 { 4876 op = p_Deg(set[an],currRing); 4877 if ((op < o) 4878 || ((op == o) && (pLtCmp(set[an],p) == -1))) 4879 return en; 4880 return an; 4881 } 4882 i=(an+en) / 2; 4883 op = p_Deg(set[i],currRing); 4884 if ((op < o) 4885 || ((op == o) && (pLtCmp(set[i],p) == -1))) 4886 an=i; 4887 else 4888 en=i; 4889 } 4890 } 4891 if(pNext(p) != NULL) 4892 { 4893 int o = p_Deg(p,currRing); 4894 int op = p_Deg(set[length],currRing); 4895 4896 if ((op < o) 4897 || ((op == o) && (pLtCmp(set[length],p) == -1))) 4898 return length+1; 4899 int i; 4900 int an = 0; 4901 for(i=0;i<=length;i++) 4902 if(set[i] != NULL && pNext(set[i]) == NULL) 4903 an++; 4904 int en= length; 4905 loop 4906 { 4907 if (an >= en-1) 4908 { 4909 op = p_Deg(set[an],currRing); 4910 if ((op < o) 4911 || ((op == o) && (pLtCmp(set[an],p) == -1))) 4912 return en; 4913 return an; 4914 } 4915 i=(an+en) / 2; 4916 op = p_Deg(set[i],currRing); 4917 if ((op < o) 4918 || ((op == o) && (pLtCmp(set[i],p) == -1))) 4919 an=i; 4920 else 4921 en=i; 4922 } 4923 } 4924 } 4925 4926 // sorts by degree and pLtCmp in the block between start,end; 4927 // but puts pure monomials at the beginning 4928 int posInIdealMonFirst (const ideal F, const poly p,int start,int end) 4929 { 4930 if(end < 0 || end >= IDELEMS(F)) 4931 end = IDELEMS(F); 4932 if (end<0) return 0; 4933 if(pNext(p) == NULL) return start; 4934 polyset set=F->m; 4935 int o = p_Deg(p,currRing); 4936 int op; 4937 int i; 4938 int an = start; 4939 for(i=start;i<end;i++) 4940 if(set[i] != NULL && pNext(set[i]) == NULL) 4941 an++; 4942 if(an == end-1) 4943 return end; 4944 int en= end; 4945 loop 4946 { 4947 if(an>=en) 4948 return en; 4949 if (an == en-1) 4950 { 4951 op = p_Deg(set[an],currRing); 4952 if ((op < o) 4953 || ((op == o) && (pLtCmp(set[an],p) == -1))) 4954 return en; 4955 return an; 4956 } 4957 i=(an+en) / 2; 4958 op = p_Deg(set[i],currRing); 4959 if ((op < o) 4960 || ((op == o) && (pLtCmp(set[i],p) == -1))) 4961 an=i; 4962 else 4963 en=i; 4178 4964 } 4179 4965 } … … 5053 5839 LObject* p,const kStrategy /*strat*/) 5054 5840 { 5055 if (length<0) return 0; 5056 if (pLmCmp(set[length].sig,p->sig)== currRing->OrdSgn) 5057 return length+1; 5058 5059 int i; 5060 int an = 0; 5061 int en= length; 5062 loop 5063 { 5064 if (an >= en-1) 5065 { 5066 if (pLmCmp(set[an].sig,p->sig) == currRing->OrdSgn) return en; 5067 return an; 5068 } 5069 i=(an+en) / 2; 5070 if (pLmCmp(set[i].sig,p->sig) == currRing->OrdSgn) an=i; 5071 else en=i; 5072 /*aend. fuer lazy == in !=- machen */ 5073 } 5841 if (length<0) return 0; 5842 if (pLtCmp(set[length].sig,p->sig)== currRing->OrdSgn) 5843 return length+1; 5844 5845 int i; 5846 int an = 0; 5847 int en= length; 5848 loop 5849 { 5850 if (an >= en-1) 5851 { 5852 if (pLtCmp(set[an].sig,p->sig) == currRing->OrdSgn) return en; 5853 return an; 5854 } 5855 i=(an+en) / 2; 5856 if (pLtCmp(set[i].sig,p->sig) == currRing->OrdSgn) an=i; 5857 else en=i; 5858 /*aend. fuer lazy == in !=- machen */ 5859 } 5860 } 5861 //sorts the pair list in this order: pLtCmp on the sigs, FDeg, pLtCmp on the polys 5862 int posInLSigRing (const LSet set, const int length, 5863 LObject* p,const kStrategy /*strat*/) 5864 { 5865 assume(currRing->OrdSgn == 1 && rField_is_Ring(currRing)); 5866 if (length<0) return 0; 5867 if (pLtCmp(set[length].sig,p->sig)== 1) 5868 return length+1; 5869 5870 int an,en,i; 5871 an = 0; 5872 en = length+1; 5873 int cmp; 5874 loop 5875 { 5876 if (an >= en-1) 5877 { 5878 if(an == en) 5879 return en; 5880 cmp = pLtCmp(set[an].sig,p->sig); 5881 if (cmp == 1) 5882 return en; 5883 if (cmp == -1) 5884 return an; 5885 if (cmp == 0) 5886 { 5887 if (set[an].FDeg > p->FDeg) 5888 return en; 5889 if (set[an].FDeg < p->FDeg) 5890 return an; 5891 if (set[an].FDeg == p->FDeg) 5892 { 5893 cmp = pLtCmp(set[an].p,p->p); 5894 if(cmp == 1) 5895 return en; 5896 else 5897 return an; 5898 } 5899 } 5900 } 5901 i=(an+en) / 2; 5902 cmp = pLtCmp(set[i].sig,p->sig); 5903 if (cmp == 1) 5904 an = i; 5905 if (cmp == -1) 5906 en = i; 5907 if (cmp == 0) 5908 { 5909 if (set[i].FDeg > p->FDeg) 5910 an = i; 5911 if (set[i].FDeg < p->FDeg) 5912 en = i; 5913 if (set[i].FDeg == p->FDeg) 5914 { 5915 cmp = pLtCmp(set[i].p,p->p); 5916 if(cmp == 1) 5917 an = i; 5918 else 5919 en = i; 5920 } 5921 } 5922 } 5074 5923 } 5075 5924 … … 5150 5999 { 5151 6000 if (strat->syzl==0) return 0; 5152 if (pL mCmp(strat->syz[strat->syzl-1],sig) != currRing->OrdSgn)6001 if (pLtCmp(strat->syz[strat->syzl-1],sig) != currRing->OrdSgn) 5153 6002 return strat->syzl; 5154 6003 int i; … … 5159 6008 if (an >= en-1) 5160 6009 { 5161 if (pL mCmp(strat->syz[an],sig) != currRing->OrdSgn) return en;6010 if (pLtCmp(strat->syz[an],sig) != currRing->OrdSgn) return en; 5162 6011 return an; 5163 6012 } 5164 6013 i=(an+en) / 2; 5165 if (pL mCmp(strat->syz[i],sig) != currRing->OrdSgn) an=i;6014 if (pLtCmp(strat->syz[i],sig) != currRing->OrdSgn) an=i; 5166 6015 else en=i; 5167 6016 /*aend. fuer lazy == in !=- machen */ … … 5242 6091 int i; 5243 6092 int an = 0; 6093 int en= length; 6094 loop 6095 { 6096 if (an >= en-1) 6097 { 6098 op = set[an].GetpFDeg(); 6099 if ((op > o) 6100 || ((op == o) && (pLtCmpOrdSgnDiffM(set[an].p,p->p)))) 6101 return en; 6102 return an; 6103 } 6104 i=(an+en) / 2; 6105 op = set[i].GetpFDeg(); 6106 if ((op > o) 6107 || ((op == o) && (pLtCmpOrdSgnDiffM(set[i].p,p->p)))) 6108 an=i; 6109 else 6110 en=i; 6111 } 6112 } 6113 6114 int posInLF5CRing (const LSet set, int start,const int length, 6115 LObject* p,const kStrategy strat) 6116 { 6117 if (length<0) return 0; 6118 if(start == (length +1)) return (length+1); 6119 int o = p->GetpFDeg(); 6120 int op = set[length].GetpFDeg(); 6121 6122 if ((op > o) 6123 || ((op == o) && (pLtCmpOrdSgnDiffM(set[length].p,p->p)))) 6124 return length+1; 6125 int i; 6126 int an = start; 5244 6127 int en= length; 5245 6128 loop … … 5890 6773 pWrite(pHead(strat->syz[k])); 5891 6774 #endif 5892 if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing)) 6775 if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing) 6776 #ifdef HAVE_RINGS 6777 && (!rField_is_Ring(currRing) || 6778 (n_DivBy(pGetCoeff(sig), pGetCoeff(strat->syz[k]),currRing) && pLtCmp(sig,strat->syz[k]) == 1)) 6779 #endif 6780 ) 5893 6781 { 5894 6782 //#if 1 … … 5896 6784 PrintS("DELETE!\n"); 5897 6785 #endif 6786 #if ADIDEBUG 6787 printf("\nsyzCrit:\n");pWrite(strat->syz[k]);pWrite(sig); 6788 #endif 6789 strat->nrsyzcrit++; 5898 6790 //printf("- T -\n\n"); 5899 6791 return TRUE; … … 5939 6831 pWrite(pHead(strat->syz[k])); 5940 6832 #endif 5941 if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing)) 6833 if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing) 6834 #ifdef HAVE_RINGS 6835 && (!rField_is_Ring(currRing) || 6836 (n_DivBy(pGetCoeff(sig), pGetCoeff(strat->syz[k]),currRing) && pLtCmp(sig,strat->syz[k]) == 1)) 6837 #endif 6838 ) 6839 { 6840 #if ADIDEBUG 6841 printf("\nsyzCrit:\n");pWrite(strat->syz[k]);pWrite(sig); 6842 #endif 6843 strat->nrsyzcrit++; 5942 6844 return TRUE; 6845 } 5943 6846 } 5944 6847 return FALSE; … … 5952 6855 { 5953 6856 //printf("Faugere Rewritten Criterion\n"); 6857 if(rField_is_Ring(currRing)) 6858 return FALSE; 5954 6859 //#if 1 5955 6860 #ifdef DEBUGF5 … … 5965 6870 pWrite(pHead(strat->S[k])); 5966 6871 #endif 5967 if (p_LmShortDivisibleBy(strat->sig[k], strat->sevSig[k], sig, not_sevSig, currRing)) 6872 if (p_LmShortDivisibleBy(strat->sig[k], strat->sevSig[k], sig, not_sevSig, currRing) 6873 #ifdef HAVE_RINGS 6874 && (!rField_is_Ring(currRing) || (n_DivBy(pGetCoeff(sig),pGetCoeff(strat->sig[k]),currRing) && pLmCmp(sig,strat->sig[k]) == 1 )) 6875 #endif 6876 ) 5968 6877 { 5969 6878 //#if 1 … … 5971 6880 PrintS("DELETE!\n"); 5972 6881 #endif 6882 #if ADIDEBUG 6883 printf("\nFaugere RewCrit: * divisible by *\n");pWrite(sig);pWrite(strat->sig[k]); 6884 #endif 6885 strat->nrrewcrit++; 5973 6886 return TRUE; 5974 6887 } … … 6007 6920 BOOLEAN arriRewCriterion(poly /*sig*/, unsigned long /*not_sevSig*/, poly /*lm*/, kStrategy strat, int start=0) 6008 6921 { 6922 return FALSE; 6009 6923 poly p1 = pOne(); 6010 6924 poly p2 = pOne(); 6011 6925 for (int ii=strat->sl; ii>start; ii--) 6012 6926 { 6013 if (p_LmShortDivisibleBy(strat->sig[ii], strat->sevSig[ii], strat->P.sig, ~strat->P.sevSig, currRing)) 6927 if (p_LmShortDivisibleBy(strat->sig[ii], strat->sevSig[ii], strat->P.sig, ~strat->P.sevSig, currRing) 6928 #ifdef HAVE_RINGS 6929 && (!(rField_is_Ring(currRing)) || n_DivBy(pGetCoeff(strat->P.sig),pGetCoeff(strat->sig[ii]),currRing)) 6930 #endif 6931 ) 6014 6932 { 6015 6933 p_ExpVectorSum(p1,strat->P.sig,strat->S[ii],currRing); 6016 6934 p_ExpVectorSum(p2,strat->sig[ii],strat->P.p,currRing); 6935 #ifdef HAVE_RINGS 6936 if((rField_is_Ring(currRing) && !(pLtCmp(p1,p2) == 1)) 6937 || (!rField_is_Ring(currRing) && !(pLmCmp(p1,p2) == 1))) 6938 #else 6017 6939 if (!(pLmCmp(p1,p2) == 1)) 6018 { 6940 #endif 6941 { 6942 #if ADIDEBUG 6943 printf("\narriRewCrit deleted: sig, P.sig\n"); 6944 6945 #endif 6019 6946 pDelete(&p1); 6020 6947 pDelete(&p2); … … 6030 6957 BOOLEAN arriRewCriterionPre(poly sig, unsigned long not_sevSig, poly lm, kStrategy strat, int /*start=0*/) 6031 6958 { 6959 #ifdef HAVE_RINGS 6960 //Over Rings, there are still some changes to do: considering coeffs 6961 if(rField_is_Ring(currRing)) 6962 return FALSE; 6963 #endif 6032 6964 int found = -1; 6033 for (int i=strat->Bl; i>-1; i--) 6034 { 6035 if (pLmEqual(strat->B[i].sig,sig)) 6965 for (int i=strat->Bl; i>-1; i--) { 6966 if (pLmEqual(strat->B[i].sig,sig) 6967 #ifdef HAVE_RINGS 6968 && (rField_is_Ring(currRing) && n_Equal(pGetCoeff(strat->B[i].sig),pGetCoeff(sig),currRing)) 6969 #endif 6970 ) 6036 6971 { 6037 6972 found = i; … … 6565 7500 //Print("%d/%d polynomials in set L (for lazy alg.)",lrmax+1,strat->Lmax); 6566 7501 Print("product criterion:%d chain criterion:%d\n",strat->cp,strat->c3); 7502 if (hilbcount!=0) Print("hilbert series criterion:%d\n",hilbcount); 7503 /* in usual case strat->cv is 0, it gets changed only in shift routines */ 7504 if (strat->cv!=0) Print("shift V criterion:%d\n",strat->cv); 7505 /*mflush();*/ 7506 } 7507 7508 void messageStatSBA (int hilbcount,kStrategy strat) 7509 { 7510 //PrintS("\nUsage/Allocation of temporary storage:\n"); 7511 //Print("%d/%d polynomials in standard base\n",srmax,IDELEMS(Shdl)); 7512 //Print("%d/%d polynomials in set L (for lazy alg.)",lrmax+1,strat->Lmax); 7513 Print("syz criterion:%d rew criterion:%d\n",strat->nrsyzcrit,strat->nrrewcrit); 7514 //Print("product criterion:%d chain criterion:%d\n",strat->cp,strat->c3); 6567 7515 if (hilbcount!=0) Print("hilbert series criterion:%d\n",hilbcount); 6568 7516 /* in usual case strat->cv is 0, it gets changed only in shift routines */ … … 6974 7922 if( strat->S[0] ) 6975 7923 { 6976 if( strat->S[1] )7924 if( strat->S[1] && !rField_is_Ring(currRing)) 6977 7925 { 6978 7926 omFreeSize(strat->syzIdx,(strat->syzidxmax)*sizeof(int)); … … 7041 7989 { 7042 7990 Q.sig = pOne(); 7991 #ifdef HAVE_RINGS 7992 if(rField_is_Ring(currRing)) 7993 p_SetCoeff(Q.sig,nCopy(p_GetCoeff(strat->S[k],currRing)),currRing); 7994 #endif 7043 7995 p_ExpVectorCopy(Q.sig,strat->S[k],currRing); 7044 7996 p_SetCompP (Q.sig, comp, currRing); 7045 7997 poly q = p_One(currRing); 7998 #ifdef HAVE_RINGS 7999 if(rField_is_Ring(currRing)) 8000 p_SetCoeff(q,nCopy(p_GetCoeff(strat->S[i],currRing)),currRing); 8001 #endif 7046 8002 p_ExpVectorCopy(q,strat->S[i],currRing); 7047 8003 q = p_Neg (q, currRing); … … 7081 8037 { 7082 8038 Q.sig = pOne(); 8039 #ifdef HAVE_RINGS 8040 if(rField_is_Ring(currRing)) 8041 p_SetCoeff(Q.sig,nCopy(p_GetCoeff(strat->S[k],currRing)),currRing); 8042 #endif 7083 8043 p_ExpVectorCopy(Q.sig,strat->S[k],currRing); 7084 8044 p_SetCompP (Q.sig, comp, currRing); 7085 8045 poly q = p_One(currRing); 8046 #ifdef HAVE_RINGS 8047 if(rField_is_Ring(currRing)) 8048 p_SetCoeff(q,nCopy(p_GetCoeff(strat->L[strat->Ll].p,currRing)),currRing); 8049 #endif 7086 8050 p_ExpVectorCopy(q,strat->L[strat->Ll].p,currRing); 7087 8051 q = p_Neg (q, currRing); … … 7959 8923 // appear due to the fact that the critical pairs are already sorted 7960 8924 // by increasing signature. 8925 // True. However, in the case of integers we need to put the element 8926 // that caused the signature drop on the first position 7961 8927 if (atS <= strat->sl) 7962 8928 { … … 7964 8930 memmove(&(strat->S[atS+1]), &(strat->S[atS]), 7965 8931 (strat->sl - atS + 1)*sizeof(poly)); 8932 memmove(&(strat->sig[atS+1]), &(strat->sig[atS]), 8933 (strat->sl - atS + 1)*sizeof(poly)); 8934 memmove(&(strat->sevSig[atS+1]), &(strat->sevSig[atS]), 8935 (strat->sl - atS + 1)*sizeof(unsigned long)); 7966 8936 memmove(&(strat->ecartS[atS+1]), &(strat->ecartS[atS]), 7967 8937 (strat->sl - atS + 1)*sizeof(int)); … … 7983 8953 strat->sevS[i] = strat->sevS[i-1]; 7984 8954 strat->S_2_R[i] = strat->S_2_R[i-1]; 8955 strat->sig[i] = strat->sig[i-1]; 8956 strat->sevSig[i] = strat->sevSig[i-1]; 7985 8957 } 7986 8958 if (strat->lenS!=NULL) … … 8107 9079 #if ADIDEBUG 8108 9080 printf("\nenterT: add in position %i\n",atT); 8109 pWrite(p.p); 9081 pWrite(p.p);pWrite(p.sig); 8110 9082 #endif 8111 9083 //printf("\nenterT: neue hingefÃŒgt: lÀnge = %i, ecart = %i\n",p.length,p.ecart); … … 8242 9214 void enterSyz(LObject &p, kStrategy strat, int atT) 8243 9215 { 9216 #if ADIDEBUG 9217 printf("\n Entersyz:\n");pWrite(p.sig); 9218 #endif 8244 9219 int i; 8245 9220 strat->newt = TRUE; … … 8271 9246 //i = strat->syzl; 8272 9247 i = atT; 9248 //Makes sure the syz saves just the signature 9249 #ifdef HAVE_RINGS 9250 if(rField_is_Ring(currRing)) 9251 pNext(p.sig) = NULL; 9252 #endif 8273 9253 strat->syz[atT] = p.sig; 8274 9254 strat->sevSyz[atT] = p.sevSig; … … 8282 9262 while (cc>-1) 8283 9263 { 9264 //printf("\nCheck if syz is div by L\n");pWrite(strat->syz[atT]);pWrite(strat->L[cc].sig); 9265 //printf("\npLmShDivBy(syz,L) = %i\nn_DivBy(L,syz) = %i\n pLtCmp(L,syz) = %i",p_LmShortDivisibleBy( strat->syz[atT], strat->sevSyz[atT],strat->L[cc].sig, ~strat->L[cc].sevSig, currRing), n_DivBy(pGetCoeff(strat->L[cc].sig),pGetCoeff(strat->syz[atT]),currRing), pLtCmp(strat->L[cc].sig,strat->syz[atT])==1); 8284 9266 if (p_LmShortDivisibleBy( strat->syz[atT], strat->sevSyz[atT], 8285 strat->L[cc].sig, ~strat->L[cc].sevSig, currRing)) 8286 { 9267 strat->L[cc].sig, ~strat->L[cc].sevSig, currRing) 9268 #ifdef HAVE_RINGS 9269 &&(rField_is_Ring(currRing)) 9270 && n_DivBy(pGetCoeff(strat->L[cc].sig),pGetCoeff(strat->syz[atT]),currRing) && (pLtCmp(strat->L[cc].sig,strat->syz[atT])==1) 9271 #endif 9272 ) 9273 { 9274 //printf("\nYES!\n"); 9275 #if ADIDEBUG 9276 printf("\n syzCrit deleted!\n");pWrite(strat->L[cc].p);pWrite(strat->L[cc].sig); 9277 #endif 8287 9278 deleteInL(strat->L,&strat->Ll,cc,strat); 8288 9279 } … … 8825 9816 else if (BTEST1(12) || BTEST1(14) || BTEST1(16) || BTEST1(18)) 8826 9817 strat->posInT = posInT1; 8827 #ifdef HAVE_RINGS8828 9818 if (rField_is_Ring(currRing)) 8829 9819 { … … 8833 9823 strat->posInT = posInT11; 8834 9824 } 8835 #endif8836 9825 strat->posInLDependsOnLength = FALSE; 8837 9826 strat->posInLSba = posInLSig; 8838 9827 //strat->posInL = posInLSig; 8839 9828 strat->posInL = posInLF5C; 9829 /* 9830 if (rField_is_Ring(currRing)) 9831 { 9832 strat->posInLSba = posInLSigRing; 9833 strat->posInL = posInL11Ring; 9834 }*/ 8840 9835 //strat->posInT = posInTSig; 8841 9836 } … … 8901 9896 else 8902 9897 { 8903 /*Shdl=*/initSLSba(F, Q,strat); /*sets also S, ecartS, fromQ */ 8904 // /*Shdl=*/initS(F, Q,strat); /*sets also S, ecartS, fromQ */ 9898 initSLSba(F, Q,strat); /*sets also S, ecartS, fromQ */ 8905 9899 } 8906 9900 } … … 8925 9919 omFreeSize((ADDRESS)strat->sevS,IDELEMS(strat->Shdl)*sizeof(unsigned long)); 8926 9920 omFreeSize((ADDRESS)strat->sevSig,IDELEMS(strat->Shdl)*sizeof(unsigned long)); 8927 omFreeSize((ADDRESS)strat->syz,(strat->syzmax)*sizeof(poly)); 8928 omFreeSize((ADDRESS)strat->sevSyz,(strat->syzmax)*sizeof(unsigned long)); 8929 if (strat->sbaOrder == 1) 8930 { 8931 omFreeSize(strat->syzIdx,(strat->syzidxmax)*sizeof(int)); 9921 if(strat->syzmax>0) 9922 { 9923 omFreeSize((ADDRESS)strat->syz,(strat->syzmax)*sizeof(poly)); 9924 omFreeSize((ADDRESS)strat->sevSyz,(strat->syzmax)*sizeof(unsigned long)); 9925 if (strat->sbaOrder == 1) 9926 { 9927 omFreeSize(strat->syzIdx,(strat->syzidxmax)*sizeof(int)); 9928 } 8932 9929 } 8933 9930 omFreeSize(strat->S_2_R,IDELEMS(strat->Shdl)*sizeof(int)); … … 9594 10591 //pWrite(p); 9595 10592 //pWrite(strat->S[i]); 9596 while(ok == FALSE )10593 while(ok == FALSE && p != NULL) 9597 10594 { 9598 10595 if(pLmDivisibleBy(strat->S[i], p)) … … 9604 10601 { 9605 10602 pLmDelete(&p); 10603 h->p = p; 9606 10604 deleted = TRUE; 9607 10605 } … … 9642 10640 strat->initEcart(h); 9643 10641 } 9644 #endif 9645 9646 #ifdef HAVE_RINGS 10642 10643 void postReduceByMonSig(LObject* h, kStrategy strat) 10644 { 10645 if(!nCoeff_is_Ring_Z(currRing->cf)) 10646 return; 10647 poly hSig = h->sig; 10648 poly pH = h->GetP(); 10649 poly p,pp; 10650 p = pH; 10651 bool deleted = FALSE, ok = FALSE; 10652 for(int i = 0; i<=strat->sl; i++) 10653 { 10654 p = pH; 10655 if(pNext(strat->S[i]) == NULL) 10656 { 10657 while(ok == FALSE && p!=NULL) 10658 { 10659 if(pLmDivisibleBy(strat->S[i], p)) 10660 { 10661 poly sigMult = pDivideM(pHead(p),pHead(strat->S[i])); 10662 sigMult = ppMult_mm(sigMult,pCopy(strat->sig[i])); 10663 if(sigMult!= NULL && pLtCmp(hSig,sigMult) == 1) 10664 { 10665 number dummy = n_IntMod(p->coef, strat->S[i]->coef, currRing->cf); 10666 p_SetCoeff(p,dummy,currRing); 10667 } 10668 pDelete(&sigMult); 10669 } 10670 if(nIsZero(p->coef)) 10671 { 10672 pLmDelete(&p); 10673 h->p = p; 10674 deleted = TRUE; 10675 } 10676 else 10677 { 10678 ok = TRUE; 10679 } 10680 } 10681 pp = pNext(p); 10682 while(pp != NULL) 10683 { 10684 if(pLmDivisibleBy(strat->S[i], pp)) 10685 { 10686 poly sigMult = pDivideM(pHead(p),pHead(strat->S[i])); 10687 sigMult = ppMult_mm(sigMult,pCopy(strat->sig[i])); 10688 if(sigMult!= NULL && pLtCmp(hSig,sigMult) == 1) 10689 { 10690 number dummy = n_IntMod(pp->coef, strat->S[i]->coef, currRing->cf); 10691 p_SetCoeff(pp,dummy,currRing); 10692 if(nIsZero(pp->coef)) 10693 { 10694 pLmDelete(&pNext(p)); 10695 pp = pNext(p); 10696 deleted = TRUE; 10697 } 10698 else 10699 { 10700 p = pp; 10701 pp = pNext(p); 10702 } 10703 } 10704 else 10705 { 10706 p = pp; 10707 pp = pNext(p); 10708 } 10709 pDelete(&sigMult); 10710 } 10711 else 10712 { 10713 p = pp; 10714 pp = pNext(p); 10715 } 10716 } 10717 } 10718 } 10719 h->SetLmCurrRing(); 10720 if(deleted) 10721 strat->initEcart(h); 10722 10723 } 10724 9647 10725 /*! 9648 10726 used for GB over ZZ: final reduction by constant elements … … 10088 11166 if (lmBin != NULL) 10089 11167 omMergeStickyBinIntoBin(lmBin, currRing->PolyBin); 10090 if (tailBin != NULL )11168 if (tailBin != NULL && !rField_is_Ring(currRing)) 10091 11169 omMergeStickyBinIntoBin(tailBin, 10092 11170 (tailRing != NULL ? tailRing->PolyBin: -
kernel/GBEngine/kutil.h
r34183a rc66a53 355 355 int newIdeal; 356 356 int minim; 357 #ifdef HAVE_RINGS 358 bool sigdrop; //This is used to check sigdrop in sba over Z 359 int nrsyzcrit; // counts how many pairs are deleted by SyzCrit 360 int nrrewcrit; // counts how many pairs are deleted by FaugereRewCrit 361 int sbaEnterS; // sba over Z strategy: if sigdrop element has _*gen(sbaEnterS+1), then 362 // add directly sbaEnterS elements into S 363 int blockred; // counter for blocked reductions in redSig 364 int blockredmax; 365 #endif 357 366 #ifdef HAVE_SHIFTBBA 358 367 int lV; … … 419 428 int posInS (const kStrategy strat, const int length, const poly p, 420 429 const int ecart_p); 430 int posInSMonFirst (const kStrategy strat, const int length, const poly p, 431 const int ecart_p); 432 int posInIdealMonFirst (const ideal F, const poly p,int start = 0,int end = -1); 421 433 int posInT0 (const TSet set,const int length,LObject &p); 422 434 int posInT1 (const TSet set,const int length,LObject &p); … … 447 459 int posInLSig (const LSet set, const int length, 448 460 LObject* L,const kStrategy strat); 461 int posInLSigRing (const LSet set, const int length, 462 LObject* L,const kStrategy strat); 449 463 int posInLRing (const LSet set, const int length, 450 464 LObject* L,const kStrategy strat); … … 455 469 LObject* L,const kStrategy strat); 456 470 int posInL11Ring (const LSet set, const int length, 471 LObject* L,const kStrategy strat); 472 int posInLF5CRing (const LSet set, int start , const int length, 457 473 LObject* L,const kStrategy strat); 458 474 int posInL11Ringls (const LSet set, const int length, … … 492 508 int redRiloc (LObject* h,kStrategy strat); 493 509 void enterExtendedSpoly(poly h,kStrategy strat); 510 void enterExtendedSpolySig(poly h,poly hSig,kStrategy strat); 494 511 void superenterpairs (poly h,int k,int ecart,int pos,kStrategy strat, int atR = -1); 512 void superenterpairsSig (poly h,poly hSig,int hFrom,int k,int ecart,int pos,kStrategy strat, int atR = -1); 495 513 poly kCreateZeroPoly(long exp[], long cabsind, poly* t_p, ring leadRing, ring tailRing); 496 514 long ind2(long arg); … … 509 527 void pairs (); 510 528 BOOLEAN enterOneStrongPoly (int i,poly p,int /*ecart*/, int /*isFromQ*/,kStrategy strat, int atR = -1, bool enterTstrong = FALSE); 529 BOOLEAN sbaCheckGcdPair (LObject* h,kStrategy strat); 530 BOOLEAN enterOneStrongPolySig (int i,poly p,poly sig,int /*ecart*/, int /*isFromQ*/,kStrategy strat, int atR = -1); 511 531 void message (int i,int* reduc,int* olddeg,kStrategy strat,int red_result); 512 532 void messageStat (int hilbcount,kStrategy strat); 533 void messageStatSBA (int hilbcount,kStrategy strat); 513 534 #ifdef KDEBUG 514 535 void messageSets (kStrategy strat); … … 751 772 poly preIntegerCheck(ideal F, ideal Q); 752 773 void postReduceByMon(LObject* h, kStrategy strat); 774 void postReduceByMonSig(LObject* h, kStrategy strat); 753 775 void finalReduceByMon(kStrategy strat); 754 776 #endif -
kernel/GBEngine/nc.cc
r1798a0 rc66a53 306 306 h2->m[j]=0; 307 307 } 308 // W[1.. idElems(I)]308 // W[1..IDELEMS(I)] 309 309 if (flag >0) 310 310 { -
kernel/GBEngine/syz1.cc
r1798a0 rc66a53 1992 1992 while ((k<syzstr->length) && (rr[k]!=NULL)) 1993 1993 { 1994 (*resolution)[k+1] = id Size(rr[k]);1994 (*resolution)[k+1] = idElem(rr[k]); 1995 1995 k++; 1996 1996 } -
kernel/GBEngine/syz3.cc
r1798a0 rc66a53 238 238 * only for tests 239 239 */ 240 #ifdef SING_NDEBUG241 static void syTestPairs(SSet resPairs,int length,ideal /*old_generators*/)242 #else243 240 static void syTestPairs(SSet resPairs,int length,ideal old_generators) 244 #endif245 241 { 246 242 int i=0;
Note: See TracChangeset
for help on using the changeset viewer.