Changeset ff38ee in git for kernel/GBEngine
- Timestamp:
- May 13, 2016, 1:27:46 PM (8 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 4596097b8e3e6df729c105beb4dafc60320b218b
- Parents:
- 978a8c14d698f02ec7d3aef83bbb6613f67c74951c1d660c7201e1779c8af50b3966da3a6e5cbe7c
- Location:
- kernel/GBEngine
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/GBEngine/kspoly.cc
r1c1d660 rff38ee 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 #ifdef HAVE_RINGS 246 if(rField_is_Ring(currRing)) 247 { 248 pSetCoeff(sigMult,nMult(nDiv(pGetCoeff(PR->p),pGetCoeff(PW->p)), pGetCoeff(sigMult))); 249 } 250 #endif 237 251 //#if 1 238 252 #ifdef DEBUGF5 … … 244 258 printf("--------------\n"); 245 259 #endif 246 int sigSafe = p_LmCmp(PR->sig,sigMult,currRing); 260 int sigSafe; 261 #ifdef HAVE_RINGS 262 if(rField_is_Ring(currRing)) 263 sigSafe = p_LtCmp(PR->sig,sigMult,currRing); 264 else 265 #endif 266 sigSafe = p_LmCmp(PR->sig,sigMult,currRing); 247 267 // now we can delete the copied polynomial data used for checking for 248 268 // sig-safeness of the reduction step … … 252 272 253 273 #endif 274 #ifdef HAVE_RINGS 275 if(rField_is_Ring(currRing)) 276 { 277 // Set the sig 278 if(pLmCmp(PR->sig, sigMult) == 0) 279 { 280 //The sigs have the same lm, have to substract 281 PR->sig = pSub(PR->sig, pCopy(sigMult)); 282 //It may happen that now the signature is 0 (drop) 283 if(PR->sig == NULL) 284 { 285 #if ADIDEBUG 286 printf("\nPossible sigdrop in ksreducepolysig (lost signature)\n"); 287 #endif 288 strat->sigdrop=TRUE; 289 } 290 } 291 else 292 { 293 if(sigSafe == -1) 294 { 295 // do not allow this reduction - it will increase it's signature 296 // and the partially standard basis is just till the old sig, not the new one 297 PR->is_redundant = TRUE; 298 return 3; 299 } 300 } 301 } 302 #endif 254 303 //pDelete(&f1); 255 304 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; … … 361 410 } 362 411 #endif 363 364 412 #if defined(KDEBUG) && defined(TEST_OPT_DEBUG_RED) 365 413 if (TEST_OPT_DEBUG) -
kernel/GBEngine/kstd1.cc
r1c1d660 rff38ee 2503 2503 #ifdef KDEBUG 2504 2504 idTest(F); 2505 idTest(Q); 2505 if(Q != NULL) 2506 idTest(Q); 2506 2507 2507 2508 #if MYTEST … … 2526 2527 else 2527 2528 #endif 2528 #ifdef HAVE_RINGS2529 if (rField_is_Ring(currRing))2530 r=bba(F,Q,NULL,hilb,strat);2531 else2532 #endif2533 2529 { 2534 2530 if (rHasLocalOrMixedOrdering(currRing)) … … 2544 2540 r=sba(F,Q,*w,hilb,strat); 2545 2541 else 2542 { 2543 //It is set to True, just to know that it is the first run 2544 strat->sigdrop = FALSE; 2545 strat->sbaEnterS = -1; 2546 2546 r=sba(F,Q,NULL,hilb,strat); 2547 #if ADIDEBUG 2548 printf("\nSBA Run 1: %i elements (syzCrit = %i)\n",IDELEMS(r),strat->nrsyzcrit); 2549 //idPrint(r); 2550 //getchar(); 2551 #endif 2552 int sbarun = 2; 2553 while(strat->sigdrop) 2554 { 2555 r=sba(r,Q,NULL,hilb,strat); 2556 #if ADIDEBUG 2557 printf("SBA Run %i: %i elements (syzCrit = %i)\n",sbarun++,IDELEMS(r),strat->nrsyzcrit); 2558 //idPrint(r); 2559 //getchar(); 2560 #endif 2561 } 2562 } 2547 2563 } 2548 2564 } … … 2558 2574 //Print("%d reductions canceled \n",strat->cel); 2559 2575 HCord=strat->HCord; 2560 delete(strat);2576 //delete(strat); 2561 2577 if ((delete_w)&&(w!=NULL)&&(*w!=NULL)) delete *w; 2562 2578 return r; -
kernel/GBEngine/kstd2.cc
r1c1d660 rff38ee 20 20 #endif /* ifndef SING_NDEBUG */ 21 21 22 #define ADIDEBUG 022 #define ADIDEBUG 1 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 { 713 return 1; 724 // over ZZ: cleanup coefficients by complete reduction with monomials 725 postReduceByMonSig(h, strat); 726 if(nIsZero(pGetCoeff(h->p))) return 2; 727 j = kFindDivisibleByInT(strat, h,start); 728 if(j < 0) 729 { 730 if(strat->tl >= 0) 731 h->i_r1 = strat->tl; 732 else 733 h->i_r1 = -1; 734 if (h->GetLmTailRing() == NULL) 735 { 736 if (h->lcm!=NULL) pLmDelete(h->lcm); 737 h->Clear(); 738 return 0; 739 } 740 #ifdef HAVE_RINGS 741 if(rField_is_Ring(currRing)) 742 { 743 //Check for sigdrop after reduction 744 if(pLtCmp(beforeredsig,h->sig) == 1) 745 { 746 #if ADIDEBUG 747 printf("\nSigDrop after reduce\n");pWrite(beforeredsig);pWrite(h->sig); 748 #endif 749 strat->sigdrop = TRUE; 750 //Reduce it as much as you can 751 int red_result = redRing(h,strat); 752 if(red_result == 0) 753 { 754 //It reduced to 0, cancel the sigdrop 755 #if ADIDEBUG 756 printf("\nReduced to 0 via redRing. Cancel sigdrop\n"); 757 #endif 758 strat->sigdrop = FALSE; 759 p_Delete(&h->sig,currRing);h->sig = NULL; 760 return 0; 761 } 762 else 763 { 764 #if ADIDEBUG 765 printf("\nReduced to this via redRing.SIGDROP\n");pWrite(h->p); 766 #endif 767 //strat->enterS(*h, strat->sl+1, strat, strat->tl); 768 return 0; 769 } 770 } 771 p_Delete(&beforeredsig,currRing); 772 } 773 #endif 774 return 1; 775 } 714 776 } 715 777 … … 732 794 break; 733 795 if ((strat->T[i].pLength < li) 734 && 735 p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i], 796 #ifdef HAVE_RINGS 797 && (!rField_is_Ring(currRing) || n_DivBy(pGetCoeff(h_p),pGetCoeff(strat->T[i].p),currRing->cf)) 798 #endif 799 && p_LmShortDivisibleBy(strat->T[i].GetLmTailRing(), strat->sevT[i], 736 800 h_p, not_sev, strat->tailRing)) 737 801 { … … 772 836 printf("INDEX OF REDUCER T: %d\n",ii); 773 837 #endif 838 #if ADIDEBUG 839 printf("\nWe reduce it with:\n");p_Write(strat->T[ii].p,strat->tailRing);pWrite(strat->T[ii].sig); 840 #endif 774 841 sigSafe = ksReducePolySig(h, &(strat->T[ii]), strat->S_2_R[ii], NULL, NULL, strat); 842 #if ADIDEBUG 843 printf("\nAfter small reduction:\n");pWrite(h->p);pWrite(h->sig); 844 #endif 845 #ifdef HAVE_RINGS 846 if(rField_is_Ring(currRing) && h->p == NULL && h->sig == NULL) 847 { 848 //Trivial case catch 849 strat->sigdrop = FALSE; 850 } 851 if(rField_is_Ring(currRing) && strat->sigdrop) 852 { 853 return 1; 854 } 855 #endif 775 856 #if SBA_PRINT_REDUCTION_STEPS 776 857 if (sigSafe != 3) … … 874 955 loop 875 956 { 957 #ifdef HAVE_RINGS 958 if(rField_is_Ring(currRing) && strat->sigdrop) 959 break; 960 #endif 876 961 Ln.SetShortExpVector(); 877 962 if (withT) … … 904 989 } 905 990 strat->redTailChange=TRUE; 906 int ret = ksReducePolyTailSig(L, With, &Ln); 991 #if ADIDEBUG 992 printf("\nWill TAILreduce * with *:\n");pWrite(Ln.p);pWrite(Ln.sig); 993 pWrite(With->p);pWrite(With->sig);pWrite(L->sig); 994 #endif 995 int ret = ksReducePolyTailSig(L, With, &Ln, strat); 996 #ifdef HAVE_RINGS 997 if(rField_is_Ring(currRing) && strat->sigdrop) 998 { 999 //Cannot break the loop here so easily 1000 break; 1001 } 1002 if(rField_is_Ring(currRing)) 1003 L->sig = Ln.sig; 1004 //Because Ln.sig is set to L->sig, but in ksReducePolyTailSig -> ksReducePolySig 1005 // I delete it an then set Ln.sig. Hence L->sig is lost 1006 #endif 1007 #if ADIDEBUG 1008 printf("\nAfter small TAILreduce:\n");pWrite(Ln.p);pWrite(Ln.sig);pWrite(L->sig); 1009 #endif 907 1010 #if SBA_PRINT_REDUCTION_STEPS 908 1011 if (ret != 3) … … 935 1038 L->pLength++; 936 1039 } 937 938 1040 all_done: 939 1041 Ln.Delete(); … … 1560 1662 } 1561 1663 #endif 1562 getchar();1664 //getchar(); 1563 1665 #endif 1564 1666 #ifdef KDEBUG … … 1908 2010 sba_interreduction_operations = 0; 1909 2011 #endif 1910 2012 1911 2013 ideal F1 = F0; 1912 2014 ring sRing, currRingOld; … … 1923 2025 // sort ideal F 1924 2026 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]; 2027 #if REV_BLOCK_SBA || SIG_DROP_FIRST 2028 //#ifdef HAVE_RINGS 2029 if(rField_is_Ring(currRing) && strat->sigdrop) 2030 { 2031 #if REV_BLOCK_SBA 2032 for (int i=0; i<IDELEMS(F1);++i) 2033 F->m[i] = F1->m[i]; 2034 #else 2035 //Now I put the element on pos 0 already with enterS 2036 #if 0 2037 for (int i=IDELEMS(F1)-1; i>0;i--) 2038 F->m[i] = F1->m[i-1]; 2039 F->m[0] = F1->m[IDELEMS(F1)-1]; 2040 #else 2041 for (int i=0; i<IDELEMS(F1);++i) 2042 F->m[i] = F1->m[i]; 2043 //Put the SigDrop element on the correct position (think of sbaEnterS) 2044 if(strat->sbaEnterS >= 0) 2045 { 2046 poly dummy; 2047 dummy = pCopy(F->m[0]); //the sigdrop element 2048 for(int i = 0;i<strat->sbaEnterS;i++) 2049 F->m[i] = F->m[i+1]; 2050 F->m[strat->sbaEnterS] = dummy; 2051 } 2052 #endif 2053 #endif 2054 } 2055 else 2056 #endif 2057 { 2058 intvec *sort = idSort(F1); 2059 for (int i=0; i<sort->length();++i) 2060 F->m[i] = F1->m[(*sort)[i]-1]; 2061 } 2062 #ifdef HAVE_RINGS 2063 if(rField_is_Ring(currRing)) 2064 strat->sigdrop = FALSE; 2065 strat->nrsyzcrit = 0; 2066 #endif 1928 2067 #if SBA_INTERRED_START 1929 2068 F = kInterRed(F,NULL); … … 1941 2080 BOOLEAN withT = TRUE; 1942 2081 strat->max_lower_index = 0; 1943 1944 2082 //initBuchMoraCrit(strat); /*set Gebauer, honey, sugarCrit*/ 1945 2083 initSbaCrit(strat); /*set Gebauer, honey, sugarCrit*/ … … 1953 2091 srmax = strat->sl; 1954 2092 reduc = olddeg = lrmax = 0; 1955 1956 2093 #ifndef NO_BUCKETS 1957 2094 if (!TEST_OPT_NOT_BUCKETS) … … 1964 2101 1965 2102 // strat->posInT = posInT_pLength; 1966 kTest_TS(strat); 1967 2103 1968 2104 #ifdef KDEBUG 1969 2105 #if MYTEST … … 1989 2125 } 1990 2126 1991 2127 #if 1 2128 if(rField_is_Ring(currRing) && strat->sbaEnterS >= 0) 2129 { 2130 for(int i = 0;i<strat->sbaEnterS;i++) 2131 { 2132 //Update: now the element is at the corect place 2133 //i+1 because on the 0 position is the sigdrop element 2134 enterT(strat->L[strat->Ll-(i)],strat); 2135 strat->enterS(strat->L[strat->Ll-(i)], strat->sl+1, strat, strat->tl); 2136 } 2137 strat->Ll = strat->Ll - strat->sbaEnterS; 2138 strat->sbaEnterS = -1; 2139 } 2140 #endif 2141 kTest_TS(strat); 1992 2142 #ifdef KDEBUG 1993 2143 //kDebugPrint(strat); … … 1996 2146 while (strat->Ll >= 0) 1997 2147 { 2148 #if ADIDEBUG 2149 printf("\n ------------------------NEW LOOP\n"); 2150 printf("\nShdl = \n"); 2151 #if 0 2152 idPrint(strat->Shdl); 2153 #else 2154 for(int ii = 0; ii<=strat->sl;ii++) 2155 { 2156 printf("\nS[%i]: ",ii);p_Write(strat->S[ii],strat->tailRing); 2157 printf("sig: ");pWrite(strat->sig[ii]); 2158 } 2159 #endif 2160 #if 0 2161 for(int iii = 0; iii< strat->syzl; iii++) 2162 { 2163 printf("\nsyz[%i]:\n",iii); 2164 p_Write(strat->syz[iii], currRing); 2165 } 2166 #endif 2167 #if 0 2168 for(int iii = 0; iii<= strat->tl; iii++) 2169 { 2170 printf("\nT[%i]:\n",iii); 2171 p_Write(strat->T[iii].p, currRing); 2172 } 2173 #endif 2174 printf("\n list L\n"); 2175 int iii; 2176 #if 1 2177 for(iii = 0; iii<= strat->Ll; iii++) 2178 { 2179 printf("\nL[%i]:\n",iii); 2180 p_Write(strat->L[iii].p, currRing); 2181 p_Write(strat->L[iii].p1, currRing); 2182 p_Write(strat->L[iii].p2, currRing); 2183 p_Write(strat->L[iii].sig, currRing); 2184 } 2185 #else 2186 { 2187 printf("L[%i]:",strat->Ll); 2188 p_Write(strat->L[strat->Ll].p, strat->tailRing); 2189 p_Write(strat->L[strat->Ll].p1, strat->tailRing); 2190 p_Write(strat->L[strat->Ll].p2, strat->tailRing); 2191 p_Write(strat->L[strat->Ll].sig, strat->tailRing); 2192 } 2193 #endif 2194 //getchar(); 2195 #endif 1998 2196 if (strat->Ll > lrmax) lrmax =strat->Ll;/*stat.*/ 1999 2197 #ifdef KDEBUG … … 2031 2229 // initialize new syzygy rules for the next iteration step 2032 2230 initSyzRules(strat); 2033 2034 2231 } 2035 2232 /********************************************************************* … … 2040 2237 strat->P = strat->L[strat->Ll]; 2041 2238 strat->Ll--; 2239 2240 #ifdef HAVE_RINGS 2241 if(rField_is_Ring(currRing)) 2242 strat->sbaEnterS = pGetComp(strat->P.sig) - 1; 2243 #endif 2244 2245 #if ADIDEBUG 2246 printf("\n-------------------------\nThis is the current element P\n"); 2247 pWrite(strat->P.p); 2248 pWrite(strat->P.p1); 2249 pWrite(strat->P.p2); 2250 pWrite(strat->P.sig); 2251 #endif 2042 2252 /* reduction of the element chosen from L */ 2043 2253 … … 2131 2341 red_result = 2; 2132 2342 } 2343 #ifdef HAVE_RINGS 2344 if(rField_is_Ring(currRing)) 2345 { 2346 strat->P.pLength = pLength(strat->P.p); 2347 if(strat->P.sig != NULL) 2348 strat->P.sevSig = pGetShortExpVector(strat->P.sig); 2349 if(strat->P.p != NULL) 2350 strat->P.sev = pGetShortExpVector(strat->P.p); 2351 } 2352 #endif 2353 #if ADIDEBUG 2354 printf("\nAfter reduce (redresult=%i): \n",red_result);pWrite(strat->P.p);pWrite(strat->P.sig); 2355 #endif 2356 #ifdef HAVE_RINGS 2357 //sigdrop case 2358 if(rField_is_Ring(currRing) && strat->sigdrop) 2359 { 2360 //First reduce it as much as one can 2361 #if ADIDEBUG 2362 printf("\nSigdrop in the reduce. Trying redring\n"); 2363 #endif 2364 red_result = redRing(&strat->P,strat); 2365 if(red_result == 0) 2366 { 2367 #if ADIDEBUG 2368 printf("\nSigdrop cancelled since redRing reduced to 0\n"); 2369 #endif 2370 strat->sigdrop = FALSE; 2371 } 2372 else 2373 { 2374 #if ADIDEBUG 2375 printf("\nStill Sigdrop - redRing reduced to:\n");pWrite(strat->P.p); 2376 #endif 2377 strat->enterS(strat->P, 0, strat, strat->tl); 2378 break; 2379 } 2380 } 2381 #endif 2382 2133 2383 if (errorreported) break; 2134 2384 … … 2148 2398 if (!kStratChangeTailRing(strat)) { Werror("OVERFLOW.."); break;} 2149 2399 } 2150 2151 2400 // reduction to non-zero new poly 2152 2401 if (red_result == 1) … … 2170 2419 // the one with highest signature 2171 2420 int pos = strat->sl+1; 2172 2173 2421 #ifdef KDEBUG 2174 2422 #if MYTEST … … 2180 2428 // in the ring case we cannot expect LC(f) = 1, 2181 2429 // therefore we call pContent instead of pNorm 2430 #ifdef HAVE_RINGS 2431 poly beforetailred; 2432 if(rField_is_Ring(currRing)) 2433 beforetailred = pCopy(strat->P.sig); 2434 #endif 2182 2435 #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)) 2436 #ifdef HAVE_RINGS 2437 if(rField_is_Ring(currRing)) 2438 { 2439 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2440 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT); 2441 } 2442 else 2443 #endif 2444 { 2445 if (strat->sbaOrder != 2) { 2446 if (TEST_OPT_INTSTRATEGY) 2188 2447 { 2189 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT);2190 2448 strat->P.pCleardenom(); 2449 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2450 { 2451 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT); 2452 strat->P.pCleardenom(); 2453 } 2191 2454 } 2455 else 2456 { 2457 strat->P.pNorm(); 2458 if ((TEST_OPT_REDSB)||(TEST_OPT_REDTAIL)) 2459 strat->P.p = redtailSba(&(strat->P),pos-1,strat, withT); 2460 } 2461 } 2462 } 2463 // It may happen that we have lost the sig in redtailsba 2464 // It cannot reduce to 0 since here we are doing just tail reduction. 2465 // Best case scenerio: remains the leading term 2466 #ifdef HAVE_RINGS 2467 if(rField_is_Ring(currRing) && strat->sigdrop) 2468 { 2469 #if ADIDEBUG 2470 printf("\n Still sigdrop after redtailSba - it reduced to \n");pWrite(strat->P.p); 2471 #endif 2472 strat->enterS(strat->P, 0, strat, strat->tl); 2473 break; 2474 } 2475 #endif 2476 #endif 2477 #ifdef HAVE_RINGS 2478 if(rField_is_Ring(currRing)) 2479 { 2480 if(strat->P.sig == NULL || pLtCmp(beforetailred,strat->P.sig) == 1) 2481 { 2482 #if ADIDEBUG 2483 printf("\nSigDrop after TAILred\n");pWrite(beforetailred);pWrite(strat->P.sig); 2484 #endif 2485 strat->sigdrop = TRUE; 2486 //Reduce it as much as you can 2487 red_result = redRing(&strat->P,strat); 2488 if(red_result == 0) 2489 { 2490 //It reduced to 0, cancel the sigdrop 2491 #if ADIDEBUG 2492 printf("\nReduced to 0 via redRing. Cancel sigdrop\n"); 2493 #endif 2494 strat->sigdrop = FALSE; 2495 p_Delete(&strat->P.sig,currRing);strat->P.sig = NULL; 2192 2496 } 2193 2497 else 2194 2498 { 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 2499 #if ADIDEBUG 2500 printf("\nReduced to this via redRing.SIGDROP\n");pWrite(strat->P.p); 2501 #endif 2502 strat->enterS(strat->P, 0, strat, strat->tl); 2503 break; 2504 } 2505 } 2506 p_Delete(&beforetailred,currRing); 2507 if(!nGreaterZero(pGetCoeff(strat->P.p))) 2508 { 2509 strat->P.p = pNeg(strat->P.p); 2510 strat->P.sig = pNeg(strat->P.sig); 2511 } 2512 } 2513 #endif 2201 2514 2202 2515 // remove sigsafe label since it is no longer valid for the next element to … … 2259 2572 #ifdef HAVE_RINGS 2260 2573 if (rField_is_Ring(currRing)) 2261 superenterpairs (strat->P.p,strat->sl,strat->P.ecart,pos,strat, strat->tl);2574 superenterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl); 2262 2575 else 2263 2576 #endif 2264 2577 enterpairsSig(strat->P.p,strat->P.sig,strat->sl+1,strat->sl,strat->P.ecart,pos,strat, strat->tl); 2578 #if ADIDEBUG 2579 printf("\nThis element is added to S\n"); 2580 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); 2581 #endif 2265 2582 // posInS only depends on the leading term 2583 2584 #ifdef HAVE_RINGS 2585 if(rField_is_Ring(currRing) && strat->sigdrop) 2586 break; 2587 #endif 2588 strat->P.sevSig = p_GetShortExpVector(strat->P.sig,currRing); 2266 2589 strat->enterS(strat->P, pos, strat, strat->tl); 2590 2267 2591 if(strat->sbaOrder != 1) 2268 2592 { … … 2432 2756 zeroreductions++; 2433 2757 #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 2758 #ifdef HAVE_RINGS 2759 if(rField_is_Ring(currRing) && strat->P.p == NULL && strat->P.sig == NULL) 2760 { 2761 //Catch the case when p = 0, sig = 0 2762 } 2763 else 2764 #endif 2765 { 2766 int pos = posInSyz(strat, strat->P.sig); 2767 enterSyz(strat->P, strat, pos); 2768 //#if 1 2769 #ifdef DEBUGF5 2770 Print("ADDING STUFF TO SYZ : "); 2771 //pWrite(strat->P.p); 2772 pWrite(strat->P.sig); 2773 #endif 2774 } 2442 2775 } 2443 2776 if (strat->P.p1 == NULL && strat->minim > 0) … … 2452 2785 kTest_TS(strat); 2453 2786 } 2787 #if 0 2788 if(strat->sigdrop) 2789 printf("\nSigDrop!\n"); 2790 else 2791 printf("\nEnded with no SigDrop\n"); 2792 #endif 2793 // Clean strat->P for the next sba call 2794 #ifdef HAVE_RINGS 2795 if(rField_is_Ring(currRing) && strat->sigdrop) 2796 { 2797 //This is used to know how many elements can we directly add to S in the next run 2798 if(strat->P.sig != NULL) 2799 strat->sbaEnterS = pGetComp(strat->P.sig)-1; 2800 //else we already set it at the beggining of the loop 2801 #ifdef KDEBUG 2802 memset(&(strat->P), 0, sizeof(strat->P)); 2803 #endif /* KDEBUG */ 2804 } 2805 #endif 2454 2806 #ifdef KDEBUG 2455 2807 #if MYTEST 2456 PrintS(" bba finish GB: currRing: "); rWrite(currRing);2808 PrintS("sba finish GB: currRing: "); rWrite(currRing); 2457 2809 #endif /* MYTEST */ 2458 2810 if (TEST_OPT_DEBUG) messageSets(strat); … … 2480 2832 } 2481 2833 } 2482 2483 2834 /* complete reduction of the standard basis--------- */ 2484 2835 if (TEST_OPT_REDSB) … … 2504 2855 size_syz = strat->syzl; 2505 2856 #endif 2506 exitSba(strat);2507 2857 // if (TEST_OPT_WEIGHTM) 2508 2858 // { … … 2516 2866 if (TEST_OPT_PROT) messageStat(hilbcount,strat); 2517 2867 if (Q!=NULL) updateResult(strat->Shdl,Q,strat); 2518 2519 2868 #ifdef KDEBUG 2520 2869 #if MYTEST 2521 PrintS(" bba_end: currRing: "); rWrite(currRing);2870 PrintS("sba_end: currRing: "); rWrite(currRing); 2522 2871 #endif /* MYTEST */ 2523 2872 #endif /* KDEBUG */ … … 2525 2874 size_g_non_red = IDELEMS(strat->Shdl); 2526 2875 #endif 2876 //This is again done better at the beginning of the next loop because else damage S 2877 //Put the element that caused the sigdrop ast the beginning 2878 #if 0 2879 //#if SIG_DROP_FIRST 2880 poly dummy; 2881 dummy = pCopy(strat->Shdl->m[strat->sl]); 2882 for(int k=strat->sl;k>=1;k--) 2883 { 2884 strat->Shdl->m[k] = strat->Shdl->m[k-1]; 2885 strat->sig[k] = strat->sig[k-1]; 2886 } 2887 strat->Shdl->m[0] = dummy; 2888 #endif 2889 idTest(strat->Shdl); 2890 // I have to add the initial input polynomials which where not used (p1 and p2 = NULL) 2891 #ifdef HAVE_RINGS 2892 int k; 2893 if(rField_is_Ring(currRing)) 2894 { 2895 //for(k = strat->sl;k>=0;k--) 2896 // {printf("\nS[%i] = %p\n",k,strat->Shdl->m[k]);pWrite(strat->Shdl->m[k]);} 2897 k = strat->Ll; 2898 #if 1 2899 // 1 - adds just the unused ones, 0 - adds everthing 2900 for(;k>=0 && (strat->L[k].p1 != NULL || strat->L[k].p2 != NULL);k--) 2901 { 2902 //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); 2903 deleteInL(strat->L,&strat->Ll,k,strat); 2904 } 2905 #endif 2906 //for(int kk = strat->sl;kk>=0;kk--) 2907 // {printf("\nS[%i] = %p\n",kk,strat->Shdl->m[kk]);pWrite(strat->Shdl->m[kk]);} 2908 //idPrint(strat->Shdl); 2909 idTest(strat->Shdl); 2910 //printf("\nk = %i\n",k); 2911 for(;k>=0 && strat->L[k].p1 == NULL && strat->L[k].p2 == NULL;k--) 2912 { 2913 //printf("\nAdded k = %i\n",k); 2914 strat->enterS(strat->L[k], strat->sl+1, strat, strat->tl); 2915 //printf("\nThis elements was added from L on pos %i\n",strat->sl);pWrite(strat->S[strat->sl]);pWrite(strat->sig[strat->sl]); 2916 } 2917 } 2918 // 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 2919 #if 0 2920 if(strat->sigdrop && rField_is_Ring(currRing)) 2921 { 2922 for(k=strat->sl;k>=0;k--) 2923 { 2924 printf("\nsig[%i] = ",i);pWrite(strat->sig[k]); 2925 if(strat->sig[k] == NULL) 2926 strat->sig[k] = pCopy(strat->sig[k-1]); 2927 } 2928 } 2929 #endif 2930 #endif 2931 //Never do this - you will damage S 2932 //idSkipZeroes(strat->Shdl); 2933 //idPrint(strat->Shdl); 2934 idTest(strat->Shdl); 2935 #if REV_BLOCK_SBA 2936 #if ADIDEBUG 2937 printf("\nSBA Endrun before block reverse sigdrop sorting: \n"); 2938 for(k = 0; k<=strat->sl; k++) 2939 { 2940 printf("[%i]:",k);pWrite(strat->Shdl->m[k]); 2941 if(strat->sig[k]!= NULL) 2942 {printf(" ");pWrite(strat->sig[k]);} 2943 else 2944 printf(" 0\n"); 2945 } 2946 #endif 2947 //Reverse Blockwise Sorting of output needed for the Sig Drop Problem 2948 #ifdef HAVE_RINGS 2949 if(rField_is_Ring(currRing) && strat->sigdrop) 2950 { 2951 poly dummy; 2952 int i,j; 2953 for(i=0;i<=strat->sl;) 2954 { 2955 k = pGetComp(strat->sig[i]); 2956 for(j = i; j<=strat->sl && strat->sig[j]!= NULL && pGetComp(strat->sig[j]) == k;++j) 2957 { 2958 //printf("\n%i is ok",j); 2959 } 2960 if(j == strat->sl && strat->sig[j] == NULL) 2961 j++; 2962 j--; 2963 //printf("\ni = %i, j = %i\n",i,j); 2964 //getchar(); 2965 for(k=0;k<(j-i)/2;k++) 2966 { 2967 //printf("\n%i <> %i\n",i+k,j-k); 2968 dummy = pCopy(strat->Shdl->m[i+k]); 2969 strat->Shdl->m[i+k] = strat->Shdl->m[j-k]; 2970 strat->Shdl->m[j-k] = pCopy(dummy); 2971 p_Delete(&dummy, currRing); 2972 if(strat->sig[i+k]!= NULL) 2973 dummy = pCopy(strat->sig[i+k]); 2974 else 2975 dummy = NULL; 2976 strat->sig[i+k] = strat->sig[j-k]; 2977 if(dummy!= NULL) 2978 { 2979 strat->sig[j-k] = pCopy(dummy); 2980 p_Delete(&dummy, currRing); 2981 } 2982 } 2983 i = j+1; 2984 } 2985 } 2986 #endif 2987 #if ADIDEBUG 2988 printf("\nSBA Endrun after block reverse sigdrop sorting: \n"); 2989 for(k = 0; k<=strat->sl; k++) 2990 { 2991 printf("[%i]:",k);pWrite(strat->Shdl->m[k]); 2992 if(strat->sig[k]!= NULL) 2993 {printf(" ");pWrite(strat->sig[k]);} 2994 else 2995 printf(" 0\n"); 2996 } 2997 #endif 2998 #endif 2527 2999 if ((strat->sbaOrder == 1 || strat->sbaOrder == 3) && sRing!=currRingOld) 2528 3000 { … … 2530 3002 F0 = idrMoveR (F1, sRing, currRing); 2531 3003 strat->Shdl = idrMoveR_NoSort (strat->Shdl, sRing, currRing); 3004 rChangeCurrRing (sRing); 3005 exitSba(strat); 3006 rChangeCurrRing (currRingOld); 2532 3007 rDelete (sRing); 2533 3008 } 2534 id_DelDiv(strat->Shdl, currRing); 3009 #ifdef HAVE_RINGS 3010 if(rField_is_Ring(currRing) && !strat->sigdrop) 3011 #endif 3012 id_DelDiv(strat->Shdl, currRing); 2535 3013 idSkipZeroes(strat->Shdl); 2536 3014 idTest(strat->Shdl); -
kernel/GBEngine/kutil.cc
r1c1d660 rff38ee 12 12 #define MYTEST 0 13 13 14 #define ADIDEBUG 014 #define ADIDEBUG 1 15 15 16 16 #include <kernel/mod2.h> … … 513 513 pGetShallowCopyDeleteProc(strat->tailRing, currRing) : 514 514 NULL); 515 516 515 for (j=0; j<=strat->tl; j++) 517 516 { … … 534 533 } 535 534 else 536 pDelete(&p); 535 { 536 //pDelete(&p); 537 p = NULL; 538 } 537 539 break; 538 540 } … … 821 823 { 822 824 int i; 823 824 825 // test P 825 826 kFalseReturn(kTest_L(&(strat->P), strat->tailRing, … … 1524 1525 return TRUE; 1525 1526 } 1527 1528 1529 BOOLEAN enterOneStrongPolySig (int i,poly p,poly sig,int /*ecart*/, int /*isFromQ*/,kStrategy strat, int atR) 1530 { 1531 number d, s, t; 1532 assume(atR >= 0); 1533 poly m1, m2, gcd,si; 1534 assume(i<=strat->sl); 1535 si = strat->S[i]; 1536 //printf("\n--------------------------------\n"); 1537 //pWrite(p);pWrite(si); 1538 d = n_ExtGcd(pGetCoeff(p), pGetCoeff(si), &s, &t, currRing->cf); 1539 1540 if (nIsZero(s) || nIsZero(t)) // evtl. durch divBy tests ersetzen 1541 { 1542 nDelete(&d); 1543 nDelete(&s); 1544 nDelete(&t); 1545 return FALSE; 1546 } 1547 1548 k_GetStrongLeadTerms(p, si, currRing, m1, m2, gcd, strat->tailRing); 1549 //p_Test(m1,strat->tailRing); 1550 //p_Test(m2,strat->tailRing); 1551 /*if(!enterTstrong) 1552 { 1553 while (! kCheckStrongCreation(atR, m1, i, m2, strat) ) 1554 { 1555 memset(&(strat->P), 0, sizeof(strat->P)); 1556 kStratChangeTailRing(strat); 1557 strat->P = *(strat->R[atR]); 1558 p_LmFree(m1, strat->tailRing); 1559 p_LmFree(m2, strat->tailRing); 1560 p_LmFree(gcd, currRing); 1561 k_GetStrongLeadTerms(p, si, currRing, m1, m2, gcd, strat->tailRing); 1562 } 1563 }*/ 1564 pSetCoeff0(m1, s); 1565 pSetCoeff0(m2, t); 1566 pSetCoeff0(gcd, d); 1567 p_Test(m1,strat->tailRing); 1568 p_Test(m2,strat->tailRing); 1569 //printf("\n===================================\n"); 1570 //pWrite(m1);pWrite(m2);pWrite(gcd); 1571 #ifdef KDEBUG 1572 if (TEST_OPT_DEBUG) 1573 { 1574 // Print("t = %d; s = %d; d = %d\n", nInt(t), nInt(s), nInt(d)); 1575 PrintS("m1 = "); 1576 p_wrp(m1, strat->tailRing); 1577 PrintS(" ; m2 = "); 1578 p_wrp(m2, strat->tailRing); 1579 PrintS(" ; gcd = "); 1580 wrp(gcd); 1581 PrintS("\n--- create strong gcd poly: "); 1582 Print("\n p: %d", i); 1583 wrp(p); 1584 Print("\n strat->S[%d]: ", i); 1585 wrp(si); 1586 PrintS(" ---> "); 1587 } 1588 #endif 1589 1590 pNext(gcd) = p_Add_q(pp_Mult_mm(pNext(p), m1, strat->tailRing), pp_Mult_mm(pNext(si), m2, strat->tailRing), strat->tailRing); 1591 1592 #ifdef KDEBUG 1593 if (TEST_OPT_DEBUG) 1594 { 1595 wrp(gcd); 1596 PrintLn(); 1597 } 1598 #endif 1599 1600 //Check and set the signatures 1601 poly pSigMult = p_Copy(sig,currRing); 1602 poly sSigMult = p_Copy(strat->sig[i],currRing); 1603 pSigMult = p_Mult_mm(pSigMult,m1,currRing); 1604 sSigMult = p_Mult_mm(sSigMult,m2,currRing); 1605 p_LmDelete(m1, strat->tailRing); 1606 p_LmDelete(m2, strat->tailRing); 1607 poly pairsig; 1608 if(pLmCmp(pSigMult,sSigMult) == 0) 1609 { 1610 //Same lm, have to add them 1611 pairsig = p_Add_q(pSigMult,sSigMult,currRing); 1612 //This might be zero 1613 } 1614 else 1615 { 1616 //Set the sig to either pSigMult or sSigMult 1617 if(pLtCmp(pSigMult,sSigMult)==1) 1618 { 1619 pairsig = pSigMult; 1620 pDelete(&sSigMult); 1621 } 1622 else 1623 { 1624 pairsig = sSigMult; 1625 pDelete(&pSigMult); 1626 } 1627 } 1628 1629 LObject h; 1630 h.p = gcd; 1631 h.tailRing = strat->tailRing; 1632 h.sig = pairsig; 1633 int posx; 1634 h.pCleardenom(); 1635 strat->initEcart(&h); 1636 h.sev = pGetShortExpVector(h.p); 1637 h.i_r1 = -1;h.i_r2 = -1; 1638 if (currRing!=strat->tailRing) 1639 h.t_p = k_LmInit_currRing_2_tailRing(h.p, strat->tailRing); 1640 if(h.sig == NULL) 1641 { 1642 #if ADIDEBUG 1643 printf("\nPossible sigdrop in enterpairSig (due to lost of sig)\n"); 1644 #endif 1645 //sigdrop since we loose the signature 1646 strat->sigdrop = TRUE; 1647 //Try to reduce it as far as we can via redRing 1648 int red_result = redRing(&h,strat); 1649 #if ADIDEBUG 1650 printf("\nAfter redRing reduce:\n");pWrite(h.p); 1651 #endif 1652 if(red_result == 0) 1653 { 1654 // Cancel the sigdrop 1655 #if ADIDEBUG 1656 printf("\nCancel the sigdrop. It reduced to 0\n"); 1657 #endif 1658 p_Delete(&h.sig,currRing);h.sig = NULL; 1659 strat->sigdrop = FALSE; 1660 return FALSE; 1661 } 1662 else 1663 { 1664 #if ADIDEBUG 1665 printf("\nSigdrop. end\n"); 1666 #endif 1667 strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1); 1668 #if 1 1669 strat->enterS(h,0,strat,strat->tl); 1670 #endif 1671 return FALSE; 1672 } 1673 } 1674 if(!nGreaterZero(pGetCoeff(h.sig))) 1675 { 1676 h.sig = pNeg(h.sig); 1677 h.p = pNeg(h.p); 1678 } 1679 #ifdef HAVE_RINGS 1680 1681 if(rField_is_Ring(currRing) && 1682 pLtCmp(h.sig,sig) == -1 1683 ) 1684 { 1685 #if ADIDEBUG 1686 printf("\nSigDrop in enteronestrongpolySig\n"); 1687 pWrite(h.sig); 1688 pWrite(p);pWrite(sig); 1689 pWrite(strat->S[i]);pWrite(strat->sig[i]); 1690 #endif 1691 strat->sigdrop = TRUE; 1692 // Completely reduce it 1693 int red_result = redRing(&h,strat); 1694 if(red_result == 0) 1695 { 1696 // Reduced to 0 1697 #if ADIDEBUG 1698 printf("\nCancel the sigdrop after redRing (=0)\n"); 1699 #endif 1700 strat->sigdrop = FALSE; 1701 p_Delete(&h.sig,currRing);h.sig = NULL; 1702 return FALSE; 1703 } 1704 else 1705 { 1706 #if ADIDEBUG 1707 printf("\nAfter redRing still sigdrop:\n");pWrite(h.p); 1708 #endif 1709 strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1); 1710 // 0 - add just the original poly causing the sigdrop, 1 - add also this 1711 #if 1 1712 strat->enterS(h,0,strat, strat->tl+1); 1713 #endif 1714 return FALSE; 1715 } 1716 } 1717 #endif 1718 #if ADIDEBUG 1719 printf("\nThis strong poly was added to L:\n");pWrite(h.p);pWrite(h.p1);pWrite(h.p2);pWrite(h.sig); 1720 #endif 1721 //Check for sigdrop 1722 if(gcd != NULL && pLtCmp(sig,pairsig) > 0 && pLtCmp(strat->sig[i],pairsig) > 0) 1723 { 1724 #if ADIDEBUG 1725 printf("\nSigDrop in strongpair\noriginals: ");pWrite(sig);pWrite(strat->sig[i]); 1726 printf("\nnow: ");pWrite(pairsig); 1727 #endif 1728 strat->sigdrop = TRUE; 1729 //Enter this element to S 1730 strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1); 1731 strat->enterS(h,strat->sl+1,strat,strat->tl+1); 1732 } 1733 #if 1 1734 h.p1 = p;h.p2 = strat->S[i]; 1735 #endif 1736 if (atR >= 0) 1737 { 1738 h.i_r2 = strat->S_2_R[i]; 1739 h.i_r1 = atR; 1740 } 1741 else 1742 { 1743 h.i_r1 = -1; 1744 h.i_r2 = -1; 1745 } 1746 if (strat->Ll==-1) 1747 posx =0; 1748 else 1749 posx = strat->posInLSba(strat->L,strat->Ll,&h,strat); 1750 enterL(&strat->L,&strat->Ll,&strat->Lmax,h,posx); 1751 return TRUE; 1752 } 1526 1753 #endif 1527 1754 … … 2054 2281 #endif 2055 2282 { 2283 #if ADIDEBUG 2284 printf("\nTrying to add p and S[%i]\n",i); 2285 pWrite(p);pWrite(pSig); 2286 pWrite(strat->S[i]);pWrite(strat->sig[i]); 2287 #endif 2056 2288 assume(i<=strat->sl); 2057 2058 2289 int l; 2059 2290 poly m1 = NULL,m2 = NULL; // we need the multipliers for the s-polynomial to compute … … 2080 2311 2081 2312 // set coeffs of multipliers m1 and m2 2082 pSetCoeff0(m1, nInit(1)); 2083 pSetCoeff0(m2, nInit(1)); 2084 //#if 1 2313 #ifdef HAVE_RINGS 2314 if(rField_is_Ring(currRing)) 2315 { 2316 number s = nCopy(pGetCoeff(strat->S[i])); 2317 number t = nCopy(pGetCoeff(p)); 2318 pSetCoeff0(Lp.lcm, n_Lcm(s, t, currRing->cf)); 2319 ksCheckCoeff(&s, &t, currRing->cf); 2320 pSetCoeff0(m1,s); 2321 pSetCoeff0(m2,t); 2322 #if ADIDEBUG 2323 printf("\nIn Spoly: m1, m2 :\n");pWrite(m1);pWrite(m2); 2324 #endif 2325 } 2326 else 2327 #endif 2328 { 2329 pSetCoeff0(m1, nInit(1)); 2330 pSetCoeff0(m2, nInit(1)); 2331 } 2085 2332 #ifdef DEBUGF5 2086 2333 Print("P1 "); … … 2093 2340 pWrite(m2); 2094 2341 #endif 2342 2095 2343 // get multiplied signatures for testing 2096 pSigMult = currRing->p_Procs->pp_Mult_mm(pSigMult,m1,currRing);2344 pSigMult = pp_Mult_mm(pSigMult,m1,currRing); 2097 2345 pSigMultNegSev = ~p_GetShortExpVector(pSigMult,currRing); 2098 sSigMult = currRing->p_Procs->pp_Mult_mm(sSigMult,m2,currRing);2346 sSigMult = pp_Mult_mm(sSigMult,m2,currRing); 2099 2347 sSigMultNegSev = ~p_GetShortExpVector(sSigMult,currRing); 2100 2101 2348 //#if 1 2102 2349 #ifdef DEBUGF5 … … 2107 2354 Lp.checked = 0; 2108 2355 #endif 2109 int sigCmp = p_LmCmp(pSigMult,sSigMult,currRing); 2356 int sigCmp; 2357 #ifdef HAVE_RINGS 2358 if(rField_is_Ring(currRing)) 2359 sigCmp = p_LtCmp(pSigMult,sSigMult,currRing); 2360 else 2361 #endif 2362 sigCmp = p_LmCmp(pSigMult,sSigMult,currRing); 2110 2363 //#if 1 2111 2364 #if DEBUGF5 … … 2114 2367 pWrite(sSigMult); 2115 2368 #endif 2369 //In the ring case we already build the sig 2370 #ifdef HAVE_RINGS 2371 if(rField_is_Ring(currRing)) 2372 { 2373 if(sigCmp == 0) 2374 { 2375 #if ADIDEBUG 2376 printf("\nPossible sigdrop in enterpairSig (due to lost of sig)\n"); 2377 #endif 2378 //sigdrop since we loose the signature 2379 strat->sigdrop = TRUE; 2380 //Try to reduce it as far as we can via redRing 2381 Lp.p = pCopy(p); 2382 int red_result = redRing(&Lp,strat); 2383 #if ADIDEBUG 2384 printf("\nAfter redRing reduce:\n");pWrite(Lp.p); 2385 #endif 2386 if(red_result == 0) 2387 { 2388 // Cancel the sigdrop 2389 #if ADIDEBUG 2390 printf("\nCancel the sigdrop. It reduced to 0\n"); 2391 #endif 2392 p_Delete(&Lp.sig,currRing);Lp.sig = NULL; 2393 strat->sigdrop = FALSE; 2394 return; 2395 } 2396 else 2397 { 2398 #if ADIDEBUG 2399 printf("\nSigdrop. end\n"); 2400 #endif 2401 strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1); 2402 #if 1 2403 strat->enterS(Lp,0,strat,strat->tl); 2404 #endif 2405 return; 2406 } 2407 } 2408 if(p_LmCmp(pSigMult,sSigMult,currRing) == 0) 2409 { 2410 //Same lm, have to substract 2411 Lp.sig = p_Sub(pCopy(pSigMult),pCopy(sSigMult),currRing); 2412 } 2413 else 2414 { 2415 if(sigCmp == 1) 2416 { 2417 Lp.sig = pCopy(pSigMult); 2418 } 2419 if(sigCmp == -1) 2420 { 2421 Lp.sig = pNeg(pCopy(sSigMult)); 2422 } 2423 } 2424 Lp.sevSig = p_GetShortExpVector(Lp.sig,currRing); 2425 } 2426 #endif 2427 2428 #if 0 2116 2429 if(sigCmp==0) 2117 2430 { … … 2131 2444 return; 2132 2445 } 2446 #endif 2133 2447 // testing by syzCrit = F5 Criterion 2134 2448 // testing by rewCrit1 = Rewritten Criterion … … 2139 2453 ) 2140 2454 { 2455 #if ADIDEBUG 2456 printf("\nDELETED!\n"); 2457 #endif 2141 2458 pDelete(&pSigMult); 2142 2459 pDelete(&sSigMult); … … 2166 2483 else 2167 2484 { 2168 #ifdef HAVE_PLURAL 2169 if ( rIsPluralRing(currRing) ) 2170 { 2171 if(pHasNotCF(p, strat->S[i])) 2172 { 2173 if(ncRingType(currRing) == nc_lie) 2174 { 2175 // generalized prod-crit for lie-type 2176 strat->cp++; 2177 Lp.p = nc_p_Bracket_qq(pCopy(p),strat->S[i], currRing); 2178 } 2179 else 2180 if( ALLOW_PROD_CRIT(strat) ) 2181 { 2182 // product criterion for homogeneous case in SCA 2183 strat->cp++; 2184 Lp.p = NULL; 2485 //Build p 2486 #ifdef HAVE_RINGS 2487 if(rField_is_Ring(currRing)) 2488 { 2489 poly p1 = p_Copy(p,currRing); 2490 poly p2 = p_Copy(strat->S[i],currRing); 2491 p1 = p_Mult_mm(p1,m1,currRing); 2492 p2 = p_Mult_mm(p2,m2,currRing); 2493 Lp.p = p_Sub(p1,p2,currRing); 2494 if(Lp.p != NULL) 2495 Lp.sev = p_GetShortExpVector(Lp.p,currRing); 2496 } 2497 else 2498 #endif 2499 { 2500 #ifdef HAVE_PLURAL 2501 if ( rIsPluralRing(currRing) ) 2502 { 2503 if(pHasNotCF(p, strat->S[i])) 2504 { 2505 if(ncRingType(currRing) == nc_lie) 2506 { 2507 // generalized prod-crit for lie-type 2508 strat->cp++; 2509 Lp.p = nc_p_Bracket_qq(pCopy(p),strat->S[i], currRing); 2510 } 2511 else 2512 if( ALLOW_PROD_CRIT(strat) ) 2513 { 2514 // product criterion for homogeneous case in SCA 2515 strat->cp++; 2516 Lp.p = NULL; 2517 } 2518 else 2519 { 2520 Lp.p = // nc_CreateSpoly(strat->S[i],p,currRing); 2521 nc_CreateShortSpoly(strat->S[i], p, currRing); 2522 2523 assume(pNext(Lp.p)==NULL); // TODO: this may be violated whenever ext.prod.crit. for Lie alg. is used 2524 pNext(Lp.p) = strat->tail; // !!! 2525 } 2185 2526 } 2186 2527 else … … 2191 2532 assume(pNext(Lp.p)==NULL); // TODO: this may be violated whenever ext.prod.crit. for Lie alg. is used 2192 2533 pNext(Lp.p) = strat->tail; // !!! 2193 } 2534 2535 } 2536 2537 2538 #if MYTEST 2539 if (TEST_OPT_DEBUG) 2540 { 2541 PrintS("enterOnePairNormal::\n strat->S[i]: "); pWrite(strat->S[i]); 2542 PrintS("p: "); pWrite(p); 2543 PrintS("SPoly: "); pWrite(Lp.p); 2544 } 2545 #endif 2546 2194 2547 } 2195 2548 else 2196 { 2197 Lp.p = // nc_CreateSpoly(strat->S[i],p,currRing); 2198 nc_CreateShortSpoly(strat->S[i], p, currRing); 2199 2200 assume(pNext(Lp.p)==NULL); // TODO: this may be violated whenever ext.prod.crit. for Lie alg. is used 2201 pNext(Lp.p) = strat->tail; // !!! 2202 2203 } 2204 2205 2206 #if MYTEST 2207 if (TEST_OPT_DEBUG) 2208 { 2209 PrintS("enterOnePairNormal::\n strat->S[i]: "); pWrite(strat->S[i]); 2210 PrintS("p: "); pWrite(p); 2211 PrintS("SPoly: "); pWrite(Lp.p); 2212 } 2213 #endif 2214 2215 } 2216 else 2217 #endif 2218 { 2219 assume(!rIsPluralRing(currRing)); 2220 Lp.p = ksCreateShortSpoly(strat->S[i], p, strat->tailRing); 2221 #if MYTEST 2222 if (TEST_OPT_DEBUG) 2223 { 2224 PrintS("enterOnePairNormal::\n strat->S[i]: "); pWrite(strat->S[i]); 2225 PrintS("p: "); pWrite(p); 2226 PrintS("commutative SPoly: "); pWrite(Lp.p); 2227 } 2228 #endif 2229 2230 } 2549 #endif 2550 { 2551 assume(!rIsPluralRing(currRing)); 2552 Lp.p = ksCreateShortSpoly(strat->S[i], p, strat->tailRing); 2553 #if MYTEST 2554 if (TEST_OPT_DEBUG) 2555 { 2556 PrintS("enterOnePairNormal::\n strat->S[i]: "); pWrite(strat->S[i]); 2557 PrintS("p: "); pWrite(p); 2558 PrintS("commutative SPoly: "); pWrite(Lp.p); 2559 } 2560 #endif 2561 2562 } 2563 } 2231 2564 } 2232 2565 // store from which element this pair comes from for further tests 2233 2566 //Lp.from = strat->sl+1; 2234 if(sigCmp==currRing->OrdSgn) 2235 { 2236 // pSig > sSig 2237 pDelete (&sSigMult); 2238 Lp.sig = pSigMult; 2239 Lp.sevSig = ~pSigMultNegSev; 2567 #ifdef HAVE_RINGS 2568 if(rField_is_Ring(currRing)) 2569 { 2570 //Put the sig to be > 0 2571 if(!nGreaterZero(pGetCoeff(Lp.sig))) 2572 { 2573 Lp.sig = pNeg(Lp.sig); 2574 Lp.p = pNeg(Lp.p); 2575 } 2240 2576 } 2241 2577 else 2242 { 2243 // pSig < sSig 2244 pDelete (&pSigMult); 2245 Lp.sig = sSigMult; 2246 Lp.sevSig = ~sSigMultNegSev; 2578 #endif 2579 { 2580 if(sigCmp==currRing->OrdSgn) 2581 { 2582 // pSig > sSig 2583 pDelete (&sSigMult); 2584 Lp.sig = pSigMult; 2585 Lp.sevSig = ~pSigMultNegSev; 2586 } 2587 else 2588 { 2589 // pSig < sSig 2590 pDelete (&pSigMult); 2591 Lp.sig = sSigMult; 2592 Lp.sevSig = ~sSigMultNegSev; 2593 } 2247 2594 } 2248 2595 if (Lp.p == NULL) … … 2257 2604 if (strat->rewCrit3(Lp.sig,~Lp.sevSig,Lp.p,strat,strat->sl+1)) { 2258 2605 pLmFree(Lp.lcm); 2606 #if ADIDEBUG 2607 printf("\nrewCrit3 deletes it!\n"); 2608 #endif 2259 2609 pDelete(&Lp.sig); 2260 2610 Lp.lcm=NULL; … … 2298 2648 (!rIsPluralRing(currRing)) 2299 2649 // || (rIsPluralRing(currRing) && (ncRingType(currRing) != nc_lie)) 2650 #ifdef HAVE_RINGS 2651 && !rField_is_Ring(currRing) 2652 #endif 2300 2653 ) 2301 2654 { … … 2318 2671 if (TEST_OPT_INTSTRATEGY) 2319 2672 { 2320 if (!rIsPluralRing(currRing)) 2673 if (!rIsPluralRing(currRing) 2674 #ifdef HAVE_RINGS 2675 && !rField_is_Ring(currRing) 2676 #endif 2677 ) 2321 2678 nDelete(&(Lp.p->coef)); 2322 2679 } 2323 2324 l = strat->posInLSba(strat->B,strat->Bl,&Lp,strat); 2325 enterL(&strat->B,&strat->Bl,&strat->Bmax,Lp,l); 2680 // Check for sigdrop 2681 #ifdef HAVE_RINGS 2682 if(rField_is_Ring(currRing) && 2683 pLtCmp(Lp.sig,pSig) == -1 2684 ) 2685 { 2686 #if ADIDEBUG 2687 printf("\nSigDrop in enteronepairSig\n");pWrite(Lp.sig); 2688 pWrite(p);pWrite(pSig); 2689 pWrite(strat->S[i]);pWrite(strat->sig[i]); 2690 #endif 2691 strat->sigdrop = TRUE; 2692 // Completely reduce it 2693 int red_result = redRing(&Lp,strat); 2694 if(red_result == 0) 2695 { 2696 // Reduced to 0 2697 #if ADIDEBUG 2698 printf("\nCancel the sigdrop after redRing (=0)\n"); 2699 #endif 2700 strat->sigdrop = FALSE; 2701 p_Delete(&Lp.sig,currRing);Lp.sig = NULL; 2702 return; 2703 } 2704 else 2705 { 2706 #if ADIDEBUG 2707 printf("\nAfter redRing still sigdrop:\n");pWrite(Lp.p); 2708 #endif 2709 strat->enterS(strat->P,strat->sl+1,strat, strat->tl+1); 2710 // 0 - add just the original poly causing the sigdrop, 1 - add also this 2711 #if 1 2712 strat->enterS(Lp,0,strat, strat->tl+1); 2713 #endif 2714 return; 2715 } 2716 } 2717 #endif 2718 #if ADIDEBUG 2719 printf("\nThis spair was added to B:\n"); 2720 pWrite(Lp.p); 2721 pWrite(Lp.p1); 2722 pWrite(Lp.p2); 2723 pWrite(Lp.sig); 2724 #endif 2725 l = strat->posInLSba(strat->L,strat->Ll,&Lp,strat); 2726 enterL(&strat->L,&strat->Ll,&strat->Lmax,Lp,l); 2326 2727 } 2327 2728 } … … 3109 3510 if ((isFromQ)&&(strat->fromQ!=NULL)) 3110 3511 { 3111 for (j=0; j<=k ; j++)3512 for (j=0; j<=k && !strat->sigdrop; j++) 3112 3513 { 3113 3514 if (!strat->fromQ[j]) … … 3122 3523 { 3123 3524 new_pair=TRUE; 3124 for (j=0; j<=k ; j++)3525 for (j=0; j<=k && !strat->sigdrop; j++) 3125 3526 { 3126 3527 enterOnePairSig(j,h,hSig,hFrom,ecart,isFromQ,strat, atR); … … 3131 3532 else 3132 3533 { 3133 for (j=0; j<=k ; j++)3534 for (j=0; j<=k && !strat->sigdrop; j++) 3134 3535 { 3135 3536 if ((pGetComp(h)==pGetComp(strat->S[j])) … … 3143 3544 } 3144 3545 3546 #if 0 3145 3547 if (new_pair) 3146 3548 { … … 3152 3554 strat->chainCrit(h,ecart,strat); 3153 3555 } 3556 #endif 3154 3557 } 3155 3558 } … … 3767 4170 } 3768 4171 } 3769 /* 3770 ring r=256,(x,y,z),dp; 3771 ideal I=12xz-133y, 2xy-z; 3772 */ 4172 } 4173 4174 void initenterstrongPairsSig (poly h,poly hSig, int hFrom, int k,int ecart,int isFromQ,kStrategy strat, int atR = -1) 4175 { 4176 const int iCompH = pGetComp(h); 4177 if (!nIsOne(pGetCoeff(h))) 4178 { 4179 int j; 4180 4181 for (j=0; j<=k && !strat->sigdrop; j++) 4182 { 4183 // Print("j:%d, Ll:%d\n",j,strat->Ll); 4184 // if (((unsigned long) pGetCoeff(h) % (unsigned long) pGetCoeff(strat->S[j]) != 0) && 4185 // ((unsigned long) pGetCoeff(strat->S[j]) % (unsigned long) pGetCoeff(h) != 0)) 4186 if (((iCompH == pGetComp(strat->S[j])) 4187 || (0 == pGetComp(strat->S[j]))) 4188 && ((iCompH<=strat->syzComp)||(strat->syzComp==0))) 4189 { 4190 enterOneStrongPolySig(j,h,hSig,ecart,isFromQ,strat, atR); 4191 } 4192 } 4193 } 3773 4194 } 3774 4195 #endif … … 3900 4321 void superenterpairs (poly h,int k,int ecart,int pos,kStrategy strat, int atR) 3901 4322 { 3902 #if ADIDEBUG3903 PrintS("\nEnter superenterpairs\n");3904 int iii = strat->Ll;3905 printf("\nstrat->tl = %i\n",strat->tl);3906 #endif3907 4323 assume (rField_is_Ring(currRing)); 3908 4324 // enter also zero divisor * poly, if this is non zero and of smaller degree 3909 4325 if (!(rField_is_Domain(currRing))) enterExtendedSpoly(h, strat); 3910 //#if ADIDEBUG3911 #if 03912 if(iii==strat->Ll)3913 {3914 PrintS("\n enterExtendedSpoly has not changed the list L.\n");3915 }3916 else3917 {3918 PrintLn();3919 PrintS("\n enterExtendedSpoly changed the list L:\n");3920 for(iii=0;iii<=strat->Ll;iii++)3921 {3922 Print("\n L[%d]:\n",iii);3923 PrintS(" ");p_Write(strat->L[iii].p,strat->tailRing);3924 PrintS(" ");p_Write(strat->L[iii].p1,strat->tailRing);3925 PrintS(" ");p_Write(strat->L[iii].p2,strat->tailRing);3926 }3927 }3928 printf("\nstrat->tl = %i\n",strat->tl);3929 iii = strat->Ll;3930 #endif3931 4326 initenterpairs(h, k, ecart, 0, strat, atR); 3932 //#if ADIDEBUG3933 #if 03934 if(iii==strat->Ll)3935 {3936 PrintS("\n initenterpairs has not changed the list L.\n");3937 }3938 else3939 {3940 PrintS("\n initenterpairs changed the list L:\n");3941 for(iii=0;iii<=strat->Ll;iii++)3942 {3943 Print("\n L[%d]:\n",iii);3944 PrintS(" ");p_Write(strat->L[iii].p1,strat->tailRing);3945 PrintS(" ");p_Write(strat->L[iii].p2,strat->tailRing);3946 PrintS(" ");p_Write(strat->L[iii].p,strat->tailRing);3947 }3948 }3949 printf("\nstrat->tl = %i\n",strat->tl);3950 iii = strat->Ll;3951 #endif3952 4327 initenterstrongPairs(h, k, ecart, 0, strat, atR); 3953 //#if ADIDEBUG3954 #if 03955 if(iii==strat->Ll)3956 {3957 PrintS("\n initenterstrongPairs has not changed the list L.\n");3958 }3959 else3960 {3961 PrintS("\n initenterstrongPairs changed the list L:\n");3962 for(iii=0;iii<=strat->Ll;iii++)3963 {3964 Print("\n L[%d]:\n",iii);3965 PrintS(" ");p_Write(strat->L[iii].p1,strat->tailRing);3966 PrintS(" ");p_Write(strat->L[iii].p2,strat->tailRing);3967 PrintS(" ");p_Write(strat->L[iii].p,strat->tailRing);3968 }3969 }3970 printf("\nstrat->tl = %i\n",strat->tl);3971 PrintS("\nEnd of superenterpairs\n");3972 #endif3973 4328 clearSbatch(h, k, pos, strat); 3974 #if ADIDEBUG 3975 printf("\nstrat->tl = %i\n",strat->tl); 3976 #endif 4329 } 4330 4331 void superenterpairsSig (poly h,poly hSig,int hFrom,int k,int ecart,int pos,kStrategy strat, int atR) 4332 { 4333 assume (rField_is_Ring_Z(currRing)); 4334 // enter also zero divisor * poly, if this is non zero and of smaller degree 4335 //if (!(rField_is_Domain(currRing))) enterExtendedSpoly(h, strat); 4336 #if ADIDEBUG 4337 printf("\n Trying to add spolys\n"); 4338 #endif 4339 initenterpairsSig(h, hSig, hFrom, k, ecart, 0, strat, atR); 4340 #if ADIDEBUG 4341 printf("\n Trying to add gcd-polys\n"); 4342 #endif 4343 initenterstrongPairsSig(h, hSig, hFrom,k, ecart, 0, strat, atR); 4344 clearSbatch(h, k, pos, strat); 3977 4345 } 3978 4346 #endif … … 4938 5306 { 4939 5307 if (length<0) return 0; 4940 if (pL mCmp(set[length].sig,p->sig)== currRing->OrdSgn)5308 if (pLtCmp(set[length].sig,p->sig)== currRing->OrdSgn) 4941 5309 return length+1; 4942 5310 … … 4948 5316 if (an >= en-1) 4949 5317 { 4950 if (pL mCmp(set[an].sig,p->sig) == currRing->OrdSgn) return en;5318 if (pLtCmp(set[an].sig,p->sig) == currRing->OrdSgn) return en; 4951 5319 return an; 4952 5320 } 4953 5321 i=(an+en) / 2; 4954 if (pL mCmp(set[i].sig,p->sig) == currRing->OrdSgn) an=i;5322 if (pLtCmp(set[i].sig,p->sig) == currRing->OrdSgn) an=i; 4955 5323 else en=i; 4956 5324 /*aend. fuer lazy == in !=- machen */ … … 5042 5410 { 5043 5411 if (strat->syzl==0) return 0; 5044 if (pL mCmp(strat->syz[strat->syzl-1],sig) != currRing->OrdSgn)5412 if (pLtCmp(strat->syz[strat->syzl-1],sig) != currRing->OrdSgn) 5045 5413 return strat->syzl; 5046 5414 int i; … … 5051 5419 if (an >= en-1) 5052 5420 { 5053 if (pL mCmp(strat->syz[an],sig) != currRing->OrdSgn) return en;5421 if (pLtCmp(strat->syz[an],sig) != currRing->OrdSgn) return en; 5054 5422 return an; 5055 5423 } 5056 5424 i=(an+en) / 2; 5057 if (pL mCmp(strat->syz[i],sig) != currRing->OrdSgn) an=i;5425 if (pLtCmp(strat->syz[i],sig) != currRing->OrdSgn) an=i; 5058 5426 else en=i; 5059 5427 /*aend. fuer lazy == in !=- machen */ … … 5685 6053 pWrite(pHead(strat->syz[k])); 5686 6054 #endif 5687 if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing)) 6055 if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing) 6056 #ifdef HAVE_RINGS 6057 && (!rField_is_Ring(currRing) || 6058 (n_DivBy(pGetCoeff(sig), pGetCoeff(strat->syz[k]),currRing) && pLtCmp(sig,strat->syz[k]) == 1)) 6059 #endif 6060 ) 5688 6061 { 5689 6062 //#if 1 … … 5691 6064 PrintS("DELETE!\n"); 5692 6065 #endif 6066 #if ADIDEBUG 6067 printf("\nsyzCrit:\n");pWrite(strat->syz[k]);pWrite(sig); 6068 #endif 6069 strat->nrsyzcrit++; 5693 6070 //printf("- T -\n\n"); 5694 6071 return TRUE; … … 5734 6111 pWrite(pHead(strat->syz[k])); 5735 6112 #endif 5736 if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing)) 6113 if (p_LmShortDivisibleBy(strat->syz[k], strat->sevSyz[k], sig, not_sevSig, currRing) 6114 #ifdef HAVE_RINGS 6115 && (!rField_is_Ring(currRing) || 6116 (n_DivBy(pGetCoeff(sig), pGetCoeff(strat->syz[k]),currRing) && pLtCmp(sig,strat->syz[k]) == 1)) 6117 #endif 6118 ) 6119 { 6120 #if ADIDEBUG 6121 printf("\nsyzCrit:\n");pWrite(strat->syz[k]);pWrite(sig); 6122 #endif 6123 strat->nrsyzcrit++; 5737 6124 return TRUE; 6125 } 5738 6126 } 5739 6127 return FALSE; … … 5746 6134 BOOLEAN faugereRewCriterion(poly sig, unsigned long not_sevSig, poly /*lm*/, kStrategy strat, int start=0) 5747 6135 { 6136 //return FALSE; 5748 6137 //printf("Faugere Rewritten Criterion\n"); 5749 6138 //#if 1 … … 5760 6149 pWrite(pHead(strat->S[k])); 5761 6150 #endif 5762 if (p_LmShortDivisibleBy(strat->sig[k], strat->sevSig[k], sig, not_sevSig, currRing)) 6151 if (p_LmShortDivisibleBy(strat->sig[k], strat->sevSig[k], sig, not_sevSig, currRing) 6152 #ifdef HAVE_RINGS 6153 && (!rField_is_Ring(currRing) || n_DivBy(pGetCoeff(sig),pGetCoeff(strat->sig[k]),currRing)) 6154 #endif 6155 ) 5763 6156 { 5764 6157 //#if 1 … … 5766 6159 PrintS("DELETE!\n"); 5767 6160 #endif 6161 printf("\nFaugere RewCrit: * divisible by *\n");pWrite(sig);pWrite(strat->sig[k]); 5768 6162 return TRUE; 5769 6163 } … … 5802 6196 BOOLEAN arriRewCriterion(poly /*sig*/, unsigned long /*not_sevSig*/, poly /*lm*/, kStrategy strat, int start=0) 5803 6197 { 6198 return FALSE; 5804 6199 poly p1 = pOne(); 5805 6200 poly p2 = pOne(); 5806 6201 for (int ii=strat->sl; ii>start; ii--) 5807 6202 { 5808 if (p_LmShortDivisibleBy(strat->sig[ii], strat->sevSig[ii], strat->P.sig, ~strat->P.sevSig, currRing)) 6203 if (p_LmShortDivisibleBy(strat->sig[ii], strat->sevSig[ii], strat->P.sig, ~strat->P.sevSig, currRing) 6204 #ifdef HAVE_RINGS 6205 && (!(rField_is_Ring(currRing)) || n_DivBy(pGetCoeff(strat->P.sig),pGetCoeff(strat->sig[ii]),currRing)) 6206 #endif 6207 ) 5809 6208 { 5810 6209 p_ExpVectorSum(p1,strat->P.sig,strat->S[ii],currRing); 5811 6210 p_ExpVectorSum(p2,strat->sig[ii],strat->P.p,currRing); 6211 #ifdef HAVE_RINGS 6212 if((rField_is_Ring(currRing) && !(pLtCmp(p1,p2) == 1)) 6213 || (!rField_is_Ring(currRing) && !(pLmCmp(p1,p2) == 1))) 6214 #else 5812 6215 if (!(pLmCmp(p1,p2) == 1)) 5813 { 6216 #endif 6217 { 6218 #if ADIDEBUG 6219 printf("\narriRewCrit deleted: sig, P.sig\n"); 6220 6221 #endif 5814 6222 pDelete(&p1); 5815 6223 pDelete(&p2); … … 5825 6233 BOOLEAN arriRewCriterionPre(poly sig, unsigned long not_sevSig, poly lm, kStrategy strat, int /*start=0*/) 5826 6234 { 6235 #ifdef HAVE_RINGS 6236 //Over Rings, there are still some changes to do: considering coeffs 6237 if(rField_is_Ring(currRing)) 6238 return FALSE; 6239 #endif 5827 6240 int found = -1; 5828 6241 for (int i=strat->Bl; i>-1; i--) { 5829 if (pLmEqual(strat->B[i].sig,sig)) { 6242 if (pLmEqual(strat->B[i].sig,sig) 6243 #ifdef HAVE_RINGS 6244 && (rField_is_Ring(currRing) && n_Equal(pGetCoeff(strat->B[i].sig),pGetCoeff(sig),currRing)) 6245 #endif 6246 ) 6247 { 5830 6248 found = i; 5831 6249 break; … … 6735 7153 if( strat->S[0] ) 6736 7154 { 6737 if( strat->S[1] )7155 if( strat->S[1] && !rField_is_Ring(currRing)) 6738 7156 { 6739 7157 omFreeSize(strat->syzIdx,(strat->syzidxmax)*sizeof(int)); … … 6802 7220 { 6803 7221 Q.sig = pOne(); 7222 #ifdef HAVE_RINGS 7223 if(rField_is_Ring(currRing)) 7224 p_SetCoeff(Q.sig,nCopy(p_GetCoeff(strat->S[k],currRing)),currRing); 7225 #endif 6804 7226 p_ExpVectorCopy(Q.sig,strat->S[k],currRing); 6805 7227 p_SetCompP (Q.sig, comp, currRing); 6806 7228 poly q = p_One(currRing); 7229 #ifdef HAVE_RINGS 7230 if(rField_is_Ring(currRing)) 7231 p_SetCoeff(q,nCopy(p_GetCoeff(strat->S[i],currRing)),currRing); 7232 #endif 6807 7233 p_ExpVectorCopy(q,strat->S[i],currRing); 6808 7234 q = p_Neg (q, currRing); … … 6842 7268 { 6843 7269 Q.sig = pOne(); 7270 #ifdef HAVE_RINGS 7271 if(rField_is_Ring(currRing)) 7272 p_SetCoeff(Q.sig,nCopy(p_GetCoeff(strat->S[k],currRing)),currRing); 7273 #endif 6844 7274 p_ExpVectorCopy(Q.sig,strat->S[k],currRing); 6845 7275 p_SetCompP (Q.sig, comp, currRing); 6846 7276 poly q = p_One(currRing); 7277 #ifdef HAVE_RINGS 7278 if(rField_is_Ring(currRing)) 7279 p_SetCoeff(q,nCopy(p_GetCoeff(strat->L[strat->Ll].p,currRing)),currRing); 7280 #endif 6847 7281 p_ExpVectorCopy(q,strat->L[strat->Ll].p,currRing); 6848 7282 q = p_Neg (q, currRing); … … 7720 8154 // appear due to the fact that the critical pairs are already sorted 7721 8155 // by increasing signature. 8156 // True. However, in the case of integers we need to put the element 8157 // that caused the signature drop on the first position 7722 8158 if (atS <= strat->sl) 7723 8159 { … … 7726 8162 memmove(&(strat->S[atS+1]), &(strat->S[atS]), 7727 8163 (strat->sl - atS + 1)*sizeof(poly)); 8164 memmove(&(strat->sig[atS+1]), &(strat->sig[atS]), 8165 (strat->sl - atS + 1)*sizeof(poly)); 8166 memmove(&(strat->sevSig[atS+1]), &(strat->sevSig[atS]), 8167 (strat->sl - atS + 1)*sizeof(unsigned long)); 7728 8168 memmove(&(strat->ecartS[atS+1]), &(strat->ecartS[atS]), 7729 8169 (strat->sl - atS + 1)*sizeof(int)); … … 7745 8185 strat->sevS[i] = strat->sevS[i-1]; 7746 8186 strat->S_2_R[i] = strat->S_2_R[i-1]; 8187 strat->sig[i] = strat->sig[i-1]; 8188 strat->sevSig[i] = strat->sevSig[i-1]; 7747 8189 } 7748 8190 if (strat->lenS!=NULL) … … 7869 8311 #if ADIDEBUG 7870 8312 printf("\nenterT: add in position %i\n",atT); 7871 pWrite(p.p); 8313 pWrite(p.p);pWrite(p.sig); 7872 8314 #endif 7873 8315 //printf("\nenterT: neue hingefÃŒgt: lÀnge = %i, ecart = %i\n",p.length,p.ecart); … … 8003 8445 void enterSyz(LObject &p, kStrategy strat, int atT) 8004 8446 { 8447 #if ADIDEBUG 8448 printf("\n Entersyz:\n");pWrite(p.sig); 8449 #endif 8005 8450 int i; 8006 8451 strat->newt = TRUE; … … 8032 8477 //i = strat->syzl; 8033 8478 i = atT; 8479 //Makes sure the syz saves just the signature 8480 #ifdef HAVE_RINGS 8481 if(rField_is_Ring(currRing)) 8482 pNext(p.sig) = NULL; 8483 #endif 8034 8484 strat->syz[atT] = p.sig; 8035 8485 strat->sevSyz[atT] = p.sevSig; … … 8043 8493 while (cc>-1) 8044 8494 { 8495 //printf("\nCheck if syz is div by L\n");pWrite(strat->syz[atT]);pWrite(strat->L[cc].sig); 8496 //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); 8045 8497 if (p_LmShortDivisibleBy( strat->syz[atT], strat->sevSyz[atT], 8046 strat->L[cc].sig, ~strat->L[cc].sevSig, currRing)) 8047 { 8498 strat->L[cc].sig, ~strat->L[cc].sevSig, currRing) 8499 #ifdef HAVE_RINGS 8500 &&(rField_is_Ring(currRing)) 8501 && n_DivBy(pGetCoeff(strat->L[cc].sig),pGetCoeff(strat->syz[atT]),currRing) && (pLtCmp(strat->L[cc].sig,strat->syz[atT])==1) 8502 #endif 8503 ) 8504 { 8505 //printf("\nYES!\n"); 8506 #if ADIDEBUG 8507 printf("\n syzCrit deleted!\n");pWrite(strat->L[cc].p);pWrite(strat->L[cc].sig); 8508 #endif 8048 8509 deleteInL(strat->L,&strat->Ll,cc,strat); 8049 8510 } … … 8591 9052 else 8592 9053 { 8593 /*Shdl=*/initSLSba(F, Q,strat); /*sets also S, ecartS, fromQ */ 8594 // /*Shdl=*/initS(F, Q,strat); /*sets also S, ecartS, fromQ */ 9054 initSLSba(F, Q,strat); /*sets also S, ecartS, fromQ */ 8595 9055 } 8596 9056 } … … 8618 9078 omFreeSize((ADDRESS)strat->sevS,IDELEMS(strat->Shdl)*sizeof(unsigned long)); 8619 9079 omFreeSize((ADDRESS)strat->sevSig,IDELEMS(strat->Shdl)*sizeof(unsigned long)); 8620 omFreeSize((ADDRESS)strat->syz,(strat->syzmax)*sizeof(poly)); 8621 omFreeSize((ADDRESS)strat->sevSyz,(strat->syzmax)*sizeof(unsigned long)); 8622 if (strat->sbaOrder == 1) 8623 { 8624 omFreeSize(strat->syzIdx,(strat->syzidxmax)*sizeof(int)); 9080 if(strat->syzmax>0) 9081 { 9082 omFreeSize((ADDRESS)strat->syz,(strat->syzmax)*sizeof(poly)); 9083 omFreeSize((ADDRESS)strat->sevSyz,(strat->syzmax)*sizeof(unsigned long)); 9084 if (strat->sbaOrder == 1) 9085 { 9086 omFreeSize(strat->syzIdx,(strat->syzidxmax)*sizeof(int)); 9087 } 8625 9088 } 8626 9089 omFreeSize(strat->S_2_R,IDELEMS(strat->Shdl)*sizeof(int)); … … 9238 9701 if(pLmDivisibleBy(strat->S[i], p)) 9239 9702 { 9703 number dummy = n_IntMod(p->coef, strat->S[i]->coef, currRing->cf); 9704 p_SetCoeff(p,dummy,currRing); 9705 } 9706 if(nIsZero(p->coef)) 9707 { 9708 pLmDelete(&p); 9709 deleted = TRUE; 9710 } 9711 else 9712 { 9713 ok = TRUE; 9714 } 9715 } 9716 pp = pNext(p); 9717 while(pp != NULL) 9718 { 9719 if(pLmDivisibleBy(strat->S[i], pp)) 9720 { 9721 number dummy = n_IntMod(pp->coef, strat->S[i]->coef, currRing->cf); 9722 p_SetCoeff(pp,dummy,currRing); 9723 if(nIsZero(pp->coef)) 9724 { 9725 pLmDelete(&pNext(p)); 9726 pp = pNext(p); 9727 deleted = TRUE; 9728 } 9729 else 9730 { 9731 p = pp; 9732 pp = pNext(p); 9733 } 9734 } 9735 else 9736 { 9737 p = pp; 9738 pp = pNext(p); 9739 } 9740 } 9741 } 9742 } 9743 h->SetLmCurrRing(); 9744 if(deleted) 9745 strat->initEcart(h); 9746 } 9747 9748 void postReduceByMonSig(LObject* h, kStrategy strat) 9749 { 9750 if(!nCoeff_is_Ring_Z(currRing->cf)) 9751 return; 9752 printf("\npostreducebymon\n"); 9753 poly hSig = h->sig; 9754 poly pH = h->GetP(); 9755 poly p,pp; 9756 p = pH; 9757 bool deleted = FALSE, ok = FALSE; 9758 for(int i = 0; i<=strat->sl; i++) 9759 { 9760 p = pH; 9761 if(pNext(strat->S[i]) == NULL) 9762 { 9763 printf("\n------------------\n"); 9764 pWrite(p); 9765 pWrite(strat->S[i]); 9766 while(ok == FALSE) 9767 { 9768 if(pLmDivisibleBy(strat->S[i], p)) 9769 { 9770 poly dum = pDivideM(pHead(p),pHead(strat->S[i])); 9771 pWrite(dum);getchar(); 9240 9772 number dummy = n_IntMod(p->coef, strat->S[i]->coef, currRing->cf); 9241 9773 p_SetCoeff(p,dummy,currRing); -
kernel/GBEngine/kutil.h
r1c1d660 rff38ee 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 sbaEnterS; // sba over Z strategy: if sigdrop element has _*gen(sbaEnterS+1), then 361 // add directly sbaEnterS elements into S 362 #endif 357 363 #ifdef HAVE_SHIFTBBA 358 364 int lV; … … 485 491 void enterExtendedSpoly(poly h,kStrategy strat); 486 492 void superenterpairs (poly h,int k,int ecart,int pos,kStrategy strat, int atR = -1); 493 void superenterpairsSig (poly h,poly hSig,int hFrom,int k,int ecart,int pos,kStrategy strat, int atR = -1); 487 494 poly kCreateZeroPoly(long exp[], long cabsind, poly* t_p, ring leadRing, ring tailRing); 488 495 long ind2(long arg); … … 501 508 void pairs (); 502 509 BOOLEAN enterOneStrongPoly (int i,poly p,int /*ecart*/, int /*isFromQ*/,kStrategy strat, int atR = -1, bool enterTstrong = FALSE); 510 BOOLEAN enterOneStrongPolySig (int i,poly p,poly sig,int /*ecart*/, int /*isFromQ*/,kStrategy strat, int atR = -1); 503 511 void message (int i,int* reduc,int* olddeg,kStrategy strat,int red_result); 504 512 void messageStat (int hilbcount,kStrategy strat); … … 740 748 poly preIntegerCheck(ideal F, ideal Q); 741 749 void postReduceByMon(LObject* h, kStrategy strat); 750 void postReduceByMonSig(LObject* h, kStrategy strat); 742 751 void finalReduceByMon(kStrategy strat); 743 752 #endif -
kernel/GBEngine/syz.cc
r978a8c rff38ee 865 865 { 866 866 if ((pGetComp(res[i]->m[j])>l) 867 || ((i>1) && (res[i-1]->m[pGetComp(res[i]->m[j])-1]==NULL))) 867 // usual resolutions do not the following, but artifulal built may: (tr. #763) 868 //|| ((i>1) && (res[i-1]->m[pGetComp(res[i]->m[j])-1]==NULL)) 869 ) 868 870 { 869 871 WerrorS("input not a resolvent");
Note: See TracChangeset
for help on using the changeset viewer.