Changeset 094031 in git for kernel/GBEngine/kstd2.cc
- Timestamp:
- May 11, 2016, 9:27:07 AM (8 years ago)
- Branches:
- (u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', 'fc741b6502fd8a97288eaa3eba6e5220f3c3df87')
- Children:
- ae57df01d23de4585edc0ab0e326957b7c5d6713
- Parents:
- a94fcf8caf88c19db9ef8352748fc35986436105
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/GBEngine/kstd2.cc
ra94fcf8 r094031 22 22 #define ADIDEBUG 0 23 23 #define ADIDEBUG_COUNT 0 24 #define REV_BLOCK_SBA 0 25 #define SIG_DROP_FIRST 1 24 26 25 27 #if MYTEST … … 640 642 } 641 643 642 KINLINE int ksReducePolyTailSig(LObject* PR, TObject* PW, LObject* Red )644 KINLINE int ksReducePolyTailSig(LObject* PR, TObject* PW, LObject* Red, kStrategy strat) 643 645 { 644 646 BOOLEAN ret; … … 651 653 pWrite(Red->GetLmCurrRing()); 652 654 */ 653 ret = ksReducePolySig(Red, PW, 1, NULL, &coef); 654 655 ret = ksReducePolySig(Red, PW, 1, NULL, &coef, strat); 655 656 656 657 if (!ret) … … 678 679 int redSig (LObject* h,kStrategy strat) 679 680 { 681 #ifdef HAVE_RINGS 682 poly beforeredsig; 683 if(rField_is_Ring(currRing)) 684 beforeredsig = pCopy(h->sig); 685 #endif 680 686 if (strat->tl<0) return 1; 681 687 //if (h->GetLmTailRing()==NULL) return 0; // HS: SHOULD NOT BE NEEDED! 682 688 //printf("FDEGS: %ld -- %ld\n",h->FDeg, h->pFDeg()); 683 689 assume(h->FDeg == h->pFDeg()); 690 #if ADIDEBUG 691 printf("\n--------------------------redSig-------------------------------------\n"); 692 printf("\nBefore redSig:\n"); 693 p_Write(h->p,strat->tailRing);pWrite(h->sig); 694 #endif 684 695 //#if 1 685 696 #ifdef DEBUGF5 … … 711 722 if (j < 0) 712 723 { 724 #ifdef HAVE_RINGS 725 if(rField_is_Ring(currRing)) 726 { 727 //Check for sigdrop after reduction 728 if(pLtCmp(beforeredsig,h->sig) == 1) 729 { 730 #if ADIDEBUG 731 printf("\nSigDrop after reduce\n");pWrite(beforeredsig);pWrite(h->sig); 732 #endif 733 strat->sigdrop = TRUE; 734 //Reduce it as much as you can 735 int red_result = redRing(h,strat); 736 if(red_result == 0) 737 { 738 //It reduced to 0, cancel the sigdrop 739 #if ADIDEBUG 740 printf("\nReduced to 0 via redRing. Cancel sigdrop\n"); 741 #endif 742 strat->sigdrop = FALSE; 743 p_Delete(&h->sig,currRing);h->sig = NULL; 744 } 745 else 746 { 747 #if ADIDEBUG 748 printf("\nReduced to this via redRing.SIGDROP\n");pWrite(h->p); 749 #endif 750 //strat->enterS(*h, strat->sl+1, strat, strat->tl); 751 return 0; 752 } 753 } 754 p_Delete(&beforeredsig,currRing); 755 } 756 #endif 713 757 return 1; 714 758 } … … 732 776 break; 733 777 if ((strat->T[i].pLength < li) 734 && 735 p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i], 778 #ifdef HAVE_RINGS 779 && (!rField_is_Ring(currRing) || n_DivBy(pGetCoeff(h_p),pGetCoeff(strat->T[i].p),currRing->cf)) 780 #endif 781 && p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i], 736 782 h_p, not_sev, strat->tailRing)) 737 783 { … … 772 818 printf("INDEX OF REDUCER T: %d\n",ii); 773 819 #endif 820 #if ADIDEBUG 821 printf("\nWe reduce it with:\n");p_Write(strat->T[ii].p,strat->tailRing);pWrite(strat->T[ii].sig); 822 #endif 774 823 sigSafe = ksReducePolySig(h, &(strat->T[ii]), strat->S_2_R[ii], NULL, NULL, strat); 824 #if ADIDEBUG 825 printf("\nAfter small reduction:\n");pWrite(h->p);pWrite(h->sig); 826 #endif 827 #ifdef HAVE_RINGS 828 if(rField_is_Ring(currRing) && h->p == NULL && h->sig == NULL) 829 { 830 //Trivial case catch 831 strat->sigdrop = FALSE; 832 } 833 if(rField_is_Ring(currRing) && strat->sigdrop) 834 { 835 return 1; 836 } 837 #endif 775 838 #if SBA_PRINT_REDUCTION_STEPS 776 839 if (sigSafe != 3) … … 874 937 loop 875 938 { 939 #ifdef HAVE_RINGS 940 if(rField_is_Ring(currRing) && strat->sigdrop) 941 break; 942 #endif 876 943 Ln.SetShortExpVector(); 877 944 if (withT) … … 904 971 } 905 972 strat->redTailChange=TRUE; 906 int ret = ksReducePolyTailSig(L, With, &Ln); 973 #if ADIDEBUG 974 printf("\nWill TAILreduce * with *:\n");pWrite(Ln.p);pWrite(Ln.sig); 975 pWrite(With->p);pWrite(With->sig);pWrite(L->sig); 976 #endif 977 int ret = ksReducePolyTailSig(L, With, &Ln, strat); 978 #ifdef HAVE_RINGS 979 if(rField_is_Ring(currRing) && strat->sigdrop) 980 { 981 //Cannot break the loop here so easily 982 break; 983 } 984 if(rField_is_Ring(currRing)) 985 L->sig = Ln.sig; 986 //Because Ln.sig is set to L->sig, but in ksReducePolyTailSig -> ksReducePolySig 987 // I delete it an then set Ln.sig. Hence L->sig is lost 988 #endif 989 #if ADIDEBUG 990 printf("\nAfter small TAILreduce:\n");pWrite(Ln.p);pWrite(Ln.sig);pWrite(L->sig); 991 #endif 907 992 #if SBA_PRINT_REDUCTION_STEPS 908 993 if (ret != 3) … … 935 1020 L->pLength++; 936 1021 } 937 938 1022 all_done: 939 1023 Ln.Delete(); … … 1560 1644 } 1561 1645 #endif 1562 getchar();1646 //getchar(); 1563 1647 #endif 1564 1648 #ifdef KDEBUG … … 1908 1992 sba_interreduction_operations = 0; 1909 1993 #endif 1910 1994 1911 1995 ideal F1 = F0; 1912 1996 ring sRing, currRingOld; … … 1923 2007 // sort ideal F 1924 2008 ideal F = idInit(IDELEMS(F1),F1->rank); 1925 intvec *sort = idSort(F1); 1926 for (int i=0; i<sort->length();++i) 1927 F->m[i] = F1->m[(*sort)[i]-1]; 2009 #if REV_BLOCK_SBA || SIG_DROP_FIRST 2010 //#ifdef HAVE_RINGS 2011 if(rField_is_Ring(currRing) && strat->sigdrop) 2012 { 2013 #if REV_BLOCK_SBA 2014 for (int i=0; i<IDELEMS(F1);++i) 2015 F->m[i] = F1->m[i]; 2016 #else 2017 //Now I put the element on pos 0 already with enterS 2018 #if 0 2019 for (int i=IDELEMS(F1)-1; i>0;i--) 2020 F->m[i] = F1->m[i-1]; 2021 F->m[0] = F1->m[IDELEMS(F1)-1]; 2022 #else 2023 for (int i=0; i<IDELEMS(F1);++i) 2024 F->m[i] = F1->m[i]; 2025 //Put the SigDrop element on the correct position (think of sbaEnterS) 2026 if(strat->sbaEnterS >= 0) 2027 { 2028 poly dummy; 2029 dummy = pCopy(F->m[0]); //the sigdrop element 2030 for(int i = 0;i<strat->sbaEnterS;i++) 2031 F->m[i] = F->m[i+1]; 2032 F->m[strat->sbaEnterS] = dummy; 2033 } 2034 #endif 2035 #endif 2036 } 2037 else 2038 #endif 2039 { 2040 intvec *sort = idSort(F1); 2041 for (int i=0; i<sort->length();++i) 2042 F->m[i] = F1->m[(*sort)[i]-1]; 2043 } 2044 #ifdef HAVE_RINGS 2045 if(rField_is_Ring(currRing)) 2046 strat->sigdrop = FALSE; 2047 strat->nrsyzcrit = 0; 2048 #endif 1928 2049 #if SBA_INTERRED_START 1929 2050 F = kInterRed(F,NULL); … … 1941 2062 BOOLEAN withT = TRUE; 1942 2063 strat->max_lower_index = 0; 1943 1944 2064 //initBuchMoraCrit(strat); /*set Gebauer, honey, sugarCrit*/ 1945 2065 initSbaCrit(strat); /*set Gebauer, honey, sugarCrit*/ … … 1953 2073 srmax = strat->sl; 1954 2074 reduc = olddeg = lrmax = 0; 1955 1956 2075 #ifndef NO_BUCKETS 1957 2076 if (!TEST_OPT_NOT_BUCKETS) … … 1964 2083 1965 2084 // strat->posInT = posInT_pLength; 1966 kTest_TS(strat); 1967 2085 1968 2086 #ifdef KDEBUG 1969 2087 #if MYTEST … … 1989 2107 } 1990 2108 1991 2109 #if 1 2110 if(rField_is_Ring(currRing) && strat->sbaEnterS >= 0) 2111 { 2112 for(int i = 0;i<strat->sbaEnterS;i++) 2113 { 2114 //Update: now the element is at the corect place 2115 //i+1 because on the 0 position is the sigdrop element 2116 enterT(strat->L[strat->Ll-(i)],strat); 2117 strat->enterS(strat->L[strat->Ll-(i)], strat->sl+1, strat, strat->tl); 2118 } 2119 strat->Ll = strat->Ll - strat->sbaEnterS; 2120 strat->sbaEnterS = -1; 2121 } 2122 #endif 2123 kTest_TS(strat); 1992 2124 #ifdef KDEBUG 1993 2125 //kDebugPrint(strat); … … 1996 2128 while (strat->Ll >= 0) 1997 2129 { 2130 #if ADIDEBUG 2131 printf("\n ------------------------NEW LOOP\n"); 2132 printf("\nShdl = \n"); 2133 #if 0 2134 idPrint(strat->Shdl); 2135 #else 2136 for(int ii = 0; ii<=strat->sl;ii++) 2137 { 2138 printf("\nS[%i]: ",ii);p_Write(strat->S[ii],strat->tailRing); 2139 printf("sig: ");pWrite(strat->sig[ii]); 2140 } 2141 #endif 2142 #if 0 2143 for(int iii = 0; iii< strat->syzl; iii++) 2144 { 2145 printf("\nsyz[%i]:\n",iii); 2146 p_Write(strat->syz[iii], currRing); 2147 } 2148 #endif 2149 #if 0 2150 for(int iii = 0; iii<= strat->tl; iii++) 2151 { 2152 printf("\nT[%i]:\n",iii); 2153 p_Write(strat->T[iii].p, currRing); 2154 } 2155 #endif 2156 printf("\n list L\n"); 2157 int iii; 2158 #if 1 2159 for(iii = 0; iii<= strat->Ll; iii++) 2160 { 2161 printf("\nL[%i]:\n",iii); 2162 p_Write(strat->L[iii].p, currRing); 2163 p_Write(strat->L[iii].p1, currRing); 2164 p_Write(strat->L[iii].p2, currRing); 2165 p_Write(strat->L[iii].sig, currRing); 2166 } 2167 #else 2168 { 2169 printf("L[%i]:",strat->Ll); 2170 p_Write(strat->L[strat->Ll].p, strat->tailRing); 2171 p_Write(strat->L[strat->Ll].p1, strat->tailRing); 2172 p_Write(strat->L[strat->Ll].p2, strat->tailRing); 2173 p_Write(strat->L[strat->Ll].sig, strat->tailRing); 2174 } 2175 #endif 2176 //getchar(); 2177 #endif 1998 2178 if (strat->Ll > lrmax) lrmax =strat->Ll;/*stat.*/ 1999 2179 #ifdef KDEBUG … … 2031 2211 // initialize new syzygy rules for the next iteration step 2032 2212 initSyzRules(strat); 2033 2034 2213 } 2035 2214 /********************************************************************* … … 2040 2219 strat->P = strat->L[strat->Ll]; 2041 2220 strat->Ll--; 2221 2222 #ifdef HAVE_RINGS 2223 if(rField_is_Ring(currRing)) 2224 strat->sbaEnterS = pGetComp(strat->P.sig) - 1; 2225 #endif 2226 2227 #if ADIDEBUG 2228 printf("\n-------------------------\nThis is the current element P\n"); 2229 pWrite(strat->P.p); 2230 pWrite(strat->P.p1); 2231 pWrite(strat->P.p2); 2232 pWrite(strat->P.sig); 2233 #endif 2042 2234 /* reduction of the element chosen from L */ 2043 2235 … … 2131 2323 red_result = 2; 2132 2324 } 2325 #ifdef HAVE_RINGS 2326 if(rField_is_Ring(currRing)) 2327 { 2328 strat->P.pLength = pLength(strat->P.p); 2329 if(strat->P.sig != NULL) 2330 strat->P.sevSig = pGetShortExpVector(strat->P.sig); 2331 if(strat->P.p != NULL) 2332 strat->P.sev = pGetShortExpVector(strat->P.p); 2333 } 2334 #endif 2335 #if ADIDEBUG 2336 printf("\nAfter reduce (redresult=%i): \n",red_result);pWrite(strat->P.p);pWrite(strat->P.sig); 2337 #endif 2338 #ifdef HAVE_RINGS 2339 //sigdrop case 2340 if(rField_is_Ring(currRing) && strat->sigdrop) 2341 { 2342 //First reduce it as much as one can 2343 #if ADIDEBUG 2344 printf("\nSigdrop in the reduce. Trying redring\n"); 2345 #endif 2346 red_result = redRing(&strat->P,strat); 2347 if(red_result == 0) 2348 { 2349 #if ADIDEBUG 2350 printf("\nSigdrop cancelled since redRing reduced to 0\n"); 2351 #endif 2352 strat->sigdrop = FALSE; 2353 } 2354 else 2355 { 2356 #if ADIDEBUG 2357 printf("\nStill Sigdrop - redRing reduced to:\n");pWrite(strat->P.p); 2358 #endif 2359 strat->enterS(strat->P, 0, strat, strat->tl); 2360 break; 2361 } 2362 } 2363 #endif 2364 2133 2365 if (errorreported) break; 2134 2366 … … 2148 2380 if (!kStratChangeTailRing(strat)) { Werror("OVERFLOW.."); break;} 2149 2381 } 2150 2151 2382 // reduction to non-zero new poly 2152 2383 if (red_result == 1) … … 2170 2401 // the one with highest signature 2171 2402 int pos = strat->sl+1; 2172 2173 2403 #ifdef KDEBUG 2174 2404 #if MYTEST … … 2180 2410 // in the ring case we cannot expect LC(f) = 1, 2181 2411 // therefore we call pContent instead of pNorm 2412 #ifdef HAVE_RINGS 2413 poly beforetailred; 2414 if(rField_is_Ring(currRing)) 2415 beforetailred = pCopy(strat->P.sig); 2416 #endif 2182 2417 #if SBA_TAIL_RED 2183 if (strat->sbaOrder != 2) { 2184 if ((TEST_OPT_INTSTRATEGY) || (rField_is_Ring(currRing))) 2185 { 2186 strat->P.pCleardenom(); 2187 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2418 #ifdef HAVE_RINGS 2419 if(rField_is_Ring(currRing)) 2420 { 2421 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2422 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT); 2423 } 2424 else 2425 #endif 2426 { 2427 if (strat->sbaOrder != 2) { 2428 if (TEST_OPT_INTSTRATEGY) 2188 2429 { 2189 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);2190 2430 strat->P.pCleardenom(); 2431 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2432 { 2433 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT); 2434 strat->P.pCleardenom(); 2435 } 2191 2436 } 2437 else 2438 { 2439 strat->P.pNorm(); 2440 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2441 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT); 2442 } 2443 } 2444 } 2445 // It may happen that we have lost the sig in redtailsba 2446 // It cannot reduce to 0 since here we are doing just tail reduction. 2447 // Best case scenerio: remains the leading term 2448 #ifdef HAVE_RINGS 2449 if(rField_is_Ring(currRing) && strat->sigdrop) 2450 { 2451 #if ADIDEBUG 2452 printf("\n Still sigdrop after redtailSba - it reduced to \n");pWrite(strat->P.p); 2453 #endif 2454 strat->enterS(strat->P, 0, strat, strat->tl); 2455 break; 2456 } 2457 #endif 2458 #endif 2459 #ifdef HAVE_RINGS 2460 if(rField_is_Ring(currRing)) 2461 { 2462 if(strat->P.sig == NULL || pLtCmp(beforetailred,strat->P.sig) == 1) 2463 { 2464 #if ADIDEBUG 2465 printf("\nSigDrop after TAILred\n");pWrite(beforetailred);pWrite(strat->P.sig); 2466 #endif 2467 strat->sigdrop = TRUE; 2468 //Reduce it as much as you can 2469 red_result = redRing(&strat->P,strat); 2470 if(red_result == 0) 2471 { 2472 //It reduced to 0, cancel the sigdrop 2473 #if ADIDEBUG 2474 printf("\nReduced to 0 via redRing. Cancel sigdrop\n"); 2475 #endif 2476 strat->sigdrop = FALSE; 2477 p_Delete(&strat->P.sig,currRing);strat->P.sig = NULL; 2192 2478 } 2193 2479 else 2194 2480 { 2195 strat->P.pNorm(); 2196 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2197 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT); 2198 } 2199 } 2200 #endif 2481 #if ADIDEBUG 2482 printf("\nReduced to this via redRing.SIGDROP\n");pWrite(strat->P.p); 2483 #endif 2484 strat->enterS(strat->P, 0, strat, strat->tl); 2485 break; 2486 } 2487 } 2488 p_Delete(&beforetailred,currRing); 2489 if(!nGreaterZero(pGetCoeff(strat->P.p))) 2490 { 2491 strat->P.p = pNeg(strat->P.p); 2492 strat->P.sig = pNeg(strat->P.sig); 2493 } 2494 } 2495 #endif 2201 2496 2202 2497 // remove sigsafe label since it is no longer valid for the next element to … … 2259 2554 #ifdef HAVE_RINGS 2260 2555 if (rField_is_Ring(currRing)) 2261 superenterpairs (strat->P.p,strat->sl,strat->P.ecart,pos,strat, strat->tl);2556 superenterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl); 2262 2557 else 2263 2558 #endif 2264 2559 enterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl); 2560 #if ADIDEBUG 2561 printf("\nThis element is added to S\n"); 2562 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); 2563 #endif 2265 2564 // posInS only depends on the leading term 2565 2566 #ifdef HAVE_RINGS 2567 if(rField_is_Ring(currRing) && strat->sigdrop) 2568 break; 2569 #endif 2570 strat->P.sevSig = p_GetShortExpVector(strat->P.sig,currRing); 2266 2571 strat->enterS(strat->P, pos, strat, strat->tl); 2572 2267 2573 if(strat->sbaOrder != 1) 2268 2574 { … … 2432 2738 zeroreductions++; 2433 2739 #endif 2434 int pos = posInSyz(strat, strat->P.sig); 2435 enterSyz(strat->P, strat, pos); 2436 //#if 1 2437 #ifdef DEBUGF5 2438 Print("ADDING STUFF TO SYZ : "); 2439 //pWrite(strat->P.p); 2440 pWrite(strat->P.sig); 2441 #endif 2740 #ifdef HAVE_RINGS 2741 if(rField_is_Ring(currRing) && strat->P.p == NULL && strat->P.sig == NULL) 2742 { 2743 //Catch the case when p = 0, sig = 0 2744 } 2745 else 2746 #endif 2747 { 2748 int pos = posInSyz(strat, strat->P.sig); 2749 enterSyz(strat->P, strat, pos); 2750 //#if 1 2751 #ifdef DEBUGF5 2752 Print("ADDING STUFF TO SYZ : "); 2753 //pWrite(strat->P.p); 2754 pWrite(strat->P.sig); 2755 #endif 2756 } 2442 2757 } 2443 2758 if (strat->P.p1 == NULL && strat->minim > 0) … … 2452 2767 kTest_TS(strat); 2453 2768 } 2769 #if 0 2770 if(strat->sigdrop) 2771 printf("\nSigDrop!\n"); 2772 else 2773 printf("\nEnded with no SigDrop\n"); 2774 #endif 2775 // Clean strat->P for the next sba call 2776 #ifdef HAVE_RINGS 2777 if(rField_is_Ring(currRing) && strat->sigdrop) 2778 { 2779 //This is used to know how many elements can we directly add to S in the next run 2780 if(strat->P.sig != NULL) 2781 strat->sbaEnterS = pGetComp(strat->P.sig)-1; 2782 //else we already set it at the beggining of the loop 2783 #ifdef KDEBUG 2784 memset(&(strat->P), 0, sizeof(strat->P)); 2785 #endif /* KDEBUG */ 2786 } 2787 #endif 2454 2788 #ifdef KDEBUG 2455 2789 #if MYTEST 2456 PrintS(" bba finish GB: currRing: "); rWrite(currRing);2790 PrintS("sba finish GB: currRing: "); rWrite(currRing); 2457 2791 #endif /* MYTEST */ 2458 2792 if (TEST_OPT_DEBUG) messageSets(strat); … … 2480 2814 } 2481 2815 } 2482 2483 2816 /* complete reduction of the standard basis--------- */ 2484 2817 if (TEST_OPT_REDSB) … … 2504 2837 size_syz = strat->syzl; 2505 2838 #endif 2506 exitSba(strat);2507 2839 // if (TEST_OPT_WEIGHTM) 2508 2840 // { … … 2516 2848 if (TEST_OPT_PROT) messageStat(hilbcount,strat); 2517 2849 if (Q!=NULL) updateResult(strat->Shdl,Q,strat); 2518 2519 2850 #ifdef KDEBUG 2520 2851 #if MYTEST 2521 PrintS(" bba_end: currRing: "); rWrite(currRing);2852 PrintS("sba_end: currRing: "); rWrite(currRing); 2522 2853 #endif /* MYTEST */ 2523 2854 #endif /* KDEBUG */ … … 2525 2856 size_g_non_red = IDELEMS(strat->Shdl); 2526 2857 #endif 2858 //This is again done better at the beginning of the next loop because else damage S 2859 //Put the element that caused the sigdrop ast the beginning 2860 #if 0 2861 //#if SIG_DROP_FIRST 2862 poly dummy; 2863 dummy = pCopy(strat->Shdl->m[strat->sl]); 2864 for(int k=strat->sl;k>=1;k--) 2865 { 2866 strat->Shdl->m[k] = strat->Shdl->m[k-1]; 2867 strat->sig[k] = strat->sig[k-1]; 2868 } 2869 strat->Shdl->m[0] = dummy; 2870 #endif 2871 idTest(strat->Shdl); 2872 // I have to add the initial input polynomials which where not used (p1 and p2 = NULL) 2873 #ifdef HAVE_RINGS 2874 int k; 2875 if(rField_is_Ring(currRing)) 2876 { 2877 //for(k = strat->sl;k>=0;k--) 2878 // {printf("\nS[%i] = %p\n",k,strat->Shdl->m[k]);pWrite(strat->Shdl->m[k]);} 2879 k = strat->Ll; 2880 #if 1 2881 // 1 - adds just the unused ones, 0 - adds everthing 2882 for(;k>=0 && (strat->L[k].p1 != NULL || strat->L[k].p2 != NULL);k--) 2883 { 2884 //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); 2885 deleteInL(strat->L,&strat->Ll,k,strat); 2886 } 2887 #endif 2888 //for(int kk = strat->sl;kk>=0;kk--) 2889 // {printf("\nS[%i] = %p\n",kk,strat->Shdl->m[kk]);pWrite(strat->Shdl->m[kk]);} 2890 //idPrint(strat->Shdl); 2891 idTest(strat->Shdl); 2892 //printf("\nk = %i\n",k); 2893 for(;k>=0 && strat->L[k].p1 == NULL && strat->L[k].p2 == NULL;k--) 2894 { 2895 //printf("\nAdded k = %i\n",k); 2896 strat->enterS(strat->L[k], strat->sl+1, strat, strat->tl); 2897 //printf("\nThis elements was added from L on pos %i\n",strat->sl);pWrite(strat->S[strat->sl]);pWrite(strat->sig[strat->sl]); 2898 } 2899 } 2900 // 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 2901 #if 0 2902 if(strat->sigdrop && rField_is_Ring(currRing)) 2903 { 2904 for(k=strat->sl;k>=0;k--) 2905 { 2906 printf("\nsig[%i] = ",i);pWrite(strat->sig[k]); 2907 if(strat->sig[k] == NULL) 2908 strat->sig[k] = pCopy(strat->sig[k-1]); 2909 } 2910 } 2911 #endif 2912 #endif 2913 //Never do this - you will damage S 2914 //idSkipZeroes(strat->Shdl); 2915 //idPrint(strat->Shdl); 2916 idTest(strat->Shdl); 2917 #if REV_BLOCK_SBA 2918 #if ADIDEBUG 2919 printf("\nSBA Endrun before block reverse sigdrop sorting: \n"); 2920 for(k = 0; k<=strat->sl; k++) 2921 { 2922 printf("[%i]:",k);pWrite(strat->Shdl->m[k]); 2923 if(strat->sig[k]!= NULL) 2924 {printf(" ");pWrite(strat->sig[k]);} 2925 else 2926 printf(" 0\n"); 2927 } 2928 #endif 2929 //Reverse Blockwise Sorting of output needed for the Sig Drop Problem 2930 #ifdef HAVE_RINGS 2931 if(rField_is_Ring(currRing) && strat->sigdrop) 2932 { 2933 poly dummy; 2934 int i,j; 2935 for(i=0;i<=strat->sl;) 2936 { 2937 k = pGetComp(strat->sig[i]); 2938 for(j = i; j<=strat->sl && strat->sig[j]!= NULL && pGetComp(strat->sig[j]) == k;++j) 2939 { 2940 //printf("\n%i is ok",j); 2941 } 2942 if(j == strat->sl && strat->sig[j] == NULL) 2943 j++; 2944 j--; 2945 //printf("\ni = %i, j = %i\n",i,j); 2946 //getchar(); 2947 for(k=0;k<(j-i)/2;k++) 2948 { 2949 //printf("\n%i <> %i\n",i+k,j-k); 2950 dummy = pCopy(strat->Shdl->m[i+k]); 2951 strat->Shdl->m[i+k] = strat->Shdl->m[j-k]; 2952 strat->Shdl->m[j-k] = pCopy(dummy); 2953 p_Delete(&dummy, currRing); 2954 if(strat->sig[i+k]!= NULL) 2955 dummy = pCopy(strat->sig[i+k]); 2956 else 2957 dummy = NULL; 2958 strat->sig[i+k] = strat->sig[j-k]; 2959 if(dummy!= NULL) 2960 { 2961 strat->sig[j-k] = pCopy(dummy); 2962 p_Delete(&dummy, currRing); 2963 } 2964 } 2965 i = j+1; 2966 } 2967 } 2968 #endif 2969 #if ADIDEBUG 2970 printf("\nSBA Endrun after block reverse sigdrop sorting: \n"); 2971 for(k = 0; k<=strat->sl; k++) 2972 { 2973 printf("[%i]:",k);pWrite(strat->Shdl->m[k]); 2974 if(strat->sig[k]!= NULL) 2975 {printf(" ");pWrite(strat->sig[k]);} 2976 else 2977 printf(" 0\n"); 2978 } 2979 #endif 2980 #endif 2527 2981 if ((strat->sbaOrder == 1 || strat->sbaOrder == 3) && sRing!=currRingOld) 2528 2982 { … … 2530 2984 F0 = idrMoveR (F1, sRing, currRing); 2531 2985 strat->Shdl = idrMoveR_NoSort (strat->Shdl, sRing, currRing); 2986 rChangeCurrRing (sRing); 2987 exitSba(strat); 2988 rChangeCurrRing (currRingOld); 2532 2989 rDelete (sRing); 2533 2990 } 2534 id_DelDiv(strat->Shdl, currRing); 2991 #ifdef HAVE_RINGS 2992 if(rField_is_Ring(currRing) && !strat->sigdrop) 2993 #endif 2994 id_DelDiv(strat->Shdl, currRing); 2535 2995 idSkipZeroes(strat->Shdl); 2536 2996 idTest(strat->Shdl);
Note: See TracChangeset
for help on using the changeset viewer.