diff --git a/M2/Macaulay2/e/reducedgb-field.cpp b/M2/Macaulay2/e/reducedgb-field.cpp index e57a690238d..a80fff35486 100644 --- a/M2/Macaulay2/e/reducedgb-field.cpp +++ b/M2/Macaulay2/e/reducedgb-field.cpp @@ -104,6 +104,7 @@ void ReducedGB_Field::remainder(POLY &f, bool use_denom, ring_elem &denom) frem->next = nullptr; POLY h = f; exponents_t EXP = ALLOCATE_EXPONENTS(R->exponent_byte_size()); + while (!R->gbvector_is_zero(h.f)) { R->gbvector_get_lead_exponents(F, h.f, EXP); @@ -140,11 +141,25 @@ void ReducedGB_Field::remainder(POLY &f, bool use_denom, ring_elem &denom) } } } + h.f = head.next; - // R->gbvector_remove_content(h.f, h.fsyz, use_denom, denom); - f.f = h.f; + + ring_elem denom1; + ring_elem one_elem = R->get_flattened_coefficients()->one(); + denom1 = R->get_flattened_coefficients()->one(); // is replaced on next line originalR->get_quotient_info()->gbvector_normal_form( - Fsyz, h.fsyz, use_denom, denom); + Fsyz, h.fsyz, true, denom1); + if (EQ != R->get_flattened_coefficients()->compare_elems(denom1, one_elem)) + { + // multiply h.f by denom1. + R->gbvector_mult_by_coeff_to(h.f, denom1); + } + if (use_denom) + { + R->get_flattened_coefficients()->mult_to(denom, denom1); + } + + f.f = h.f; f.fsyz = h.fsyz; } diff --git a/M2/Macaulay2/tests/normal/gbring-lift-bug.m2 b/M2/Macaulay2/tests/normal/gbring-lift-bug.m2 new file mode 100644 index 00000000000..9db9313bc09 --- /dev/null +++ b/M2/Macaulay2/tests/normal/gbring-lift-bug.m2 @@ -0,0 +1,133 @@ + kk = QQ + S = kk[w_(3,0)..w_(3,3), y, x, Degrees => {2:5, 2:6, 2:1}, MonomialOrder => VerticalList{MonomialSize => 32, GRevLex => {2:5, 2:6}, 3:(GRevLex => {}), GRevLex => {2:1}, Position => Up}] + I = ideal( + x^13-y^12-8*y^5*x^7+4*y^10*x-8*y^3*x^8-6*y^8*x^2+4*y^6*x^3-y^4*x^4, + w_(3,1)*y^4+6*w_(3,1)*y^2*x+w_(3,1)*x^2-y^2*x^7-x^8+96*y^3*x^3+16*y*x^4, + w_(3,1)*x^6+20*w_(3,1)*y^3*x+4*w_(3,1)*y*x^2-y^10-8*y^3*x^7+9*y^8*x+12*y*x^8-55*y^6*x^2+319*y^4*x^3+64*y^2*x^4, + w_(3,1)*y^2*x^4+5*w_(3,1)*x^5-16*w_(3,1)*y^3-x^11-4*y^8+80*y*x^7+40*y^6*x-260*y^4*x^2, + 4*w_(3,0)*x-w_(3,1)*y^3-5*w_(3,1)*y*x+y*x^7-96*y^2*x^3+80*x^4, + 4*w_(3,0)*y+w_(3,1)*y^2+w_(3,1)*x-x^7+96*y*x^3, + 4*w_(3,3)*y-w_(3,1)*y^2*x^2-5*w_(3,1)*x^3+x^9-96*y*x^5+4*y^4-64*y^2*x, + w_(3,3)*x^2-4*w_(3,1)*y^2-y^7-4*x^7+10*y^5*x-64*y^3*x^2-16*y*x^3, + w_(3,2)*x-20*w_(3,1)*y-5*y^6+51*y^4*x-336*y^2*x^2+80*x^3, + w_(3,2)*y-5*w_(3,3)*x+20*x^6+y^5-16*y^3*x+160*y*x^2, + w_(3,1)^2-8*w_(3,1)*y^3*x+32*w_(3,1)*y*x^2-y^8*x+14*y^6*x^2-129*y^4*x^3+256*y^2*x^4, + w_(3,0)*w_(3,1)-13*w_(3,1)*y^2*x^2+15*w_(3,1)*x^3-y^7*x^2+5*x^9+15*y^5*x^3-144*y^3*x^4-80*y*x^5, + w_(3,0)^2+12*w_(3,1)*y^3*x^2+52*w_(3,1)*y*x^3-12*y*x^9-y^6*x^3+16*y^4*x^4+992*y^2*x^5-400*x^6, + w_(3,1)*w_(3,3)-8*w_(3,1)*x^5+81*w_(3,1)*y^3-16*w_(3,1)*y*x-y^5*x^5+15*y^3*x^6+20*y^8-64*y*x^7-200*y^6*x+1300*y^4*x^2, + 4*w_(3,0)*w_(3,3)+1109*w_(3,1)*y^2*x+145*w_(3,1)*x^2-4*y^4*x^6-32*y^9-192*y^2*x^7+400*y^7*x+175*x^8-2880*y^5*x^2+17488*y^3*x^3+3600*y*x^4, + w_(3,1)*w_(3,2)+783*w_(3,1)*y^2*x+159*w_(3,1)*x^2-5*y^4*x^6-20*y^9-84*y^2*x^7+280*y^7*x-79*x^8-2100*y^5*x^2+12784*y^3*x^3+1264*y*x^4, + w_(3,0)*w_(3,2)-56*w_(3,1)*y^3*x+503*w_(3,1)*y*x^2-5*y^3*x^7-20*y^8*x-23*y*x^8+300*y^6*x^2-2300*y^4*x^3+8688*y^2*x^4-1600*x^5, + 2*w_(3,3)^2-81*w_(3,1)*y^2*x^3-81*w_(3,1)*x^4-2*y^2*x^9-16*y^7*x^3-15*x^10+160*y^5*x^4-1040*y^3*x^5-1552*y*x^6-2*y^6+64*y^4*x-512*y^2*x^2, + 4*w_(3,2)*w_(3,3)-7*w_(3,1)*y^3*x^3-351*w_(3,1)*y*x^4-13*y*x^10-80*y^6*x^4+800*y^4*x^5-5872*y^2*x^6-4*y^7+1280*x^7+108*y^5*x-1024*y^3*x^2+5120*y*x^3, + w_(3,2)^2+10*w_(3,1)*x^5-480*w_(3,1)*y^3+3200*w_(3,1)*y*x-25*x^11-40*y^3*x^6-121*y^8+160*y*x^7+2022*y^6*x-16081*y^4*x^2+53760*y^2*x^3-6400*x^4) + R = S/I + f = y^4+6*y^2*x+x^2 + H = matrix {{x^8+20*y^3*x^3+4*y*x^4, y^3*x^6+5*y*x^7+96*y^2*x^3+16*x^4, w_(3,1)*y*x^4-116*w_(3,1)*y^2-20*w_(3,1)*x+40*y^2*x^6+4*x^7-4560*y^3*x^2-784*y*x^3, 5*w_(3,1)*y^2*x^3+29*w_(3,1)*x^4+16*w_(3,1)*y+84*y^3*x^5+484*y*x^6+640*y^2*x^2+64*x^3, 4*w_(3,3)*x+5*w_(3,1)*y^3*x^2+29*w_(3,1)*y*x^3-20*y^2*x^5-100*x^6+4*y^3*x-64*y*x^2}} + g = H_(0,1) * H_(0,4) + fm = ideal f + + assert(g % f == 0) + f * (g // f) + g + assert(f * (g // f) - g == 0) -- FAILS in M2 1.25.11 + G = gb(fm, ChangeMatrix => true) + assert((gens G) - (gens fm * getChangeMatrix G) == 0) -- FAILS in M2 1.25.11 + netList (ideal getChangeMatrix G)_* + +-- A second example +T = QQ[w_(5,0)..w_(5,5), y, x, Degrees => {4:4, 2:5, 2:1}, MonomialOrder => + {GRevLex => {4:4, 2:5}, GRevLex => {2:1}} ] +J = ideal(x^13-y^12-8*y^5*x^7+4*y^10*x-8*y^3*x^8-6*y^8*x^2+4*y^6*x^3-y^4*x^4, + w_(5,3)*x^6-4*w_(5,3)*y^5-4*w_(5,3)*y^3*x-4*y^6*x^3-24*y^4*x^4-4*y^2*x^5, + w_(5,3)*y*x^5+20*w_(5,3)*y^4+4*w_(5,3)*y^2*x-4*y^7*x^2-16*x^9+40*y^5*x^3+60*y^3*x^4, + w_(5,3)*y^2*x^4+5*w_(5,3)*x^5-16*w_(5,3)*y^3-4*y^8*x-16*y*x^8+20*y^6*x^2-60*y^4*x^3-20*y^2*x^4, + 5*w_(5,3)*y^3*x^3+29*w_(5,3)*y*x^4+16*w_(5,3)*y^2-20*y^9-80*y^2*x^7+84*y^7*x-64*x^8-140*y^5*x^2+140*y^3*x^3, + w_(5,3)*y^6+6*w_(5,3)*y^4*x+w_(5,3)*y^2*x^2-4*x^10+16*y^5*x^4+16*y^3*x^5, + w_(5,2)*x-w_(5,3)*y-16*x^4, + 16*w_(5,2)*y^2-w_(5,3)*y^2*x^3-5*w_(5,3)*x^4+4*y^8+16*y*x^7-20*y^6*x+60*y^4*x^2-236*y^2*x^3, + 80*w_(5,1)*x^2-96*w_(5,2)*y+w_(5,3)*y*x^3-4*y^7-16*x^7+40*y^5*x-260*y^3*x^2+1536*y*x^3, + 80*w_(5,1)*y^2*x+16*w_(5,2)*y-w_(5,3)*y*x^3+4*y^7-64*x^7-40*y^5*x+260*y^3*x^2-256*y*x^3, + 16*w_(5,1)*y^3+w_(5,3)*x^3-16*y*x^6-4*y^6+40*y^4*x-4*y^2*x^2, + 64*w_(5,0)*x-16*w_(5,1)*y*x+w_(5,3)*x^3-4*y^6+40*y^4*x-260*y^2*x^2+1280*x^3, + 4*w_(5,0)*y+5*w_(5,1)*y^2+w_(5,1)*x-5*x^6+80*y*x^2, + 4*w_(5,5)*y-6*w_(5,3)*y^2+w_(5,3)*x-96*y*x^4-4*y^2, + 2*w_(5,5)*x^2-8*w_(5,1)*y^2-3*w_(5,3)*y*x^2-40*x^6+2*y^5-20*y^3*x, + 4*w_(5,4)*x-16*w_(5,1)*y-5*w_(5,3)*x^2+4*y^4-44*y^2*x+64*x^2, + 4*w_(5,4)*y-4*w_(5,5)*x+w_(5,3)*y*x+80*x^5-4*y^3+64*y*x,w_(5,3)^2-16*x^7, + w_(5,2)*w_(5,3)-16*w_(5,3)*x^3-16*y*x^6, + w_(5,1)*w_(5,3)-4*w_(5,3)*y^3-4*y^4*x^3-20*y^2*x^4, + w_(5,0)*w_(5,3)-4*w_(5,3)*y^2*x+20*w_(5,3)*x^2-4*y^3*x^4, + w_(5,2)^2-32*w_(5,3)*y*x^2-16*y^2*x^5-256*x^6, + 5*w_(5,1)*w_(5,2)+2*w_(5,3)*y*x^4-92*w_(5,3)*y^2-8*y^7*x-32*x^8+60*y^5*x^2-300*y^3*x^3, + w_(5,0)*w_(5,2)-8*w_(5,3)*y^3+20*w_(5,3)*y*x-4*y^4*x^3-64*y^2*x^4+320*x^5, + 4*w_(5,1)^2+16*w_(5,1)*y*x-w_(5,3)*y^2*x^2-4*w_(5,3)*x^3-16*y*x^6+16*y^2*x^2, + 5*w_(5,0)*w_(5,1)+123*w_(5,2)*y-3*w_(5,3)*y*x^3+7*y^7+8*x^7-65*y^5*x+380*y^3*x^2-1968*y*x^3, + 4*w_(5,0)^2+3*w_(5,3)*y^2*x^3+13*w_(5,3)*x^4-12*y^8-48*y*x^7+64*y^6*x-196*y^4*x^2+588*y^2*x^3-1600*x^4, + 16*w_(5,3)*w_(5,5)+5*w_(5,3)*y^2*x^3-355*w_(5,3)*x^4-20*y^8-464*y*x^7+84*y^6*x-140*y^4*x^2+140*y^2*x^3, + 5*w_(5,2)*w_(5,5)+59*w_(5,2)*y-244*w_(5,3)*y*x^3-120*y^2*x^6+16*y^7-1836*x^7-80*y^5*x+240*y^3*x^2-944*y*x^3, + w_(5,1)*w_(5,5)-w_(5,1)*y-12*w_(5,3)*y^4-29*w_(5,3)*y^2*x-6*y^5*x^3-125*y^3*x^4+5*y*x^5, + 4*w_(5,0)*w_(5,5)+325*w_(5,1)*y^2+w_(5,1)*x-48*w_(5,3)*y^3*x+124*w_(5,3)*y*x^2-24*y^4*x^4-380*y^2*x^5+1595*x^6-80*y^5+800*y^3*x, + 4*w_(5,3)*w_(5,4)+3*w_(5,3)*y*x^4-32*w_(5,3)*y^2+64*w_(5,3)*x-12*y^7*x-128*x^8+56*y^5*x^2-140*y^3*x^3, + 4*w_(5,2)*w_(5,4)-15*w_(5,3)*y^2*x^3-186*w_(5,3)*x^4+64*w_(5,3)*y+60*y^8+160*y*x^7-240*y^6*x+364*y^4*x^2-280*y^2*x^3+1024*x^4, + w_(5,1)*w_(5,4)-w_(5,1)*y^2+15*w_(5,1)*x-6*w_(5,3)*y^3*x-4*w_(5,3)*y*x^2-5*y^4*x^4-40*y^2*x^5+5*x^6, + 16*w_(5,0)*w_(5,4)+1344*w_(5,1)*y*x-96*w_(5,3)*y^2*x^2+411*w_(5,3)*x^3-80*y^3*x^5-240*y*x^6+20*y^6-520*y^4*x+4500*y^2*x^2-5120*x^3, + 80*w_(5,5)^2-5951*w_(5,3)*y*x^4+2716*w_(5,3)*y^2+20*w_(5,3)*x-2880*y^2*x^7+764*y^7*x-42064*x^8-3800*y^5*x^2+11260*y^3*x^3-320*y*x^4-80*y^2, + 16*w_(5,4)*w_(5,5)+240*w_(5,5)*x-661*w_(5,3)*x^5-1280*w_(5,3)*y^3+68*w_(5,3)*y*x-480*y*x^8+340*y^6*x^2-2952*y^4*x^3-2860*y^2*x^4+320*x^5-16*y^3, + 4*w_(5,4)^2+496*w_(5,1)*y-166*w_(5,3)*y^4-175*w_(5,3)*y^2*x+172*w_(5,3)*x^2-100*x^9-160*y^5*x^3-1024*y^3*x^4-112*y*x^5-128*y^4+1360*y^2*x-1024*x^2) +RJ = T/J +f = y^4+6*y^2*x+x^2 +H0 = x^7+20*y^3*x^2+4*y*x^3 +H1 = 16*w_(5,1)*y-w_(5,3)*y^2*x-6*w_(5,3)*x^2+16*y^3*x^4+96*y*x^5+64*y^2*x +fm = matrix{{f}} +G = gb(fm, ChangeMatrix => true) +assert((gens G) - fm * getChangeMatrix G == 0) -- FAILS in M2 1.25.11 +assert(f * ((H0 * H1) // f) == H0 * H1) -- -- FAILS in M2 1.25.11 + +-- other possible things that can/did go wrong while fixing the above bugs! + +R = QQ[x,y] +I = ideal(3*x^2-y, y^3) +f = x^2*y^2 +G = gb(gens I, ChangeMatrix => true) +assert((gens G) - ((gens I) * getChangeMatrix G) == 0) -- ok +fm = matrix{{f}} +assert(fm % (gens I) == 0) +liftf = fm // (gens I) +assert(fm == (gens I) * liftf) -- fails (negative of correct answer...). +(gens I) * liftf, fm -- negative of each other... + +R = ZZ/32003[x,y] +I = ideal(3*x^2-y, y^3) +f = x^2*y^2 +G = gb(gens I, ChangeMatrix => true) +assert((gens G) - ((gens I) * getChangeMatrix G) == 0) -- ok +fm = matrix{{f}} +assert(fm % (gens I) == 0) +liftf = fm // (gens I) +assert(fm == (gens I) * liftf) -- fails (off by a factor of 9!) +(gens I) * liftf, fm + +R = ZZ[x,y] +I = ideal(3*x^2-y, y^3) +f = 3*x^2*y^2 +G = gb(gens I, ChangeMatrix => true) +assert((gens G) - ((gens I) * getChangeMatrix G) == 0) -- ok +fm = matrix{{f}} +assert(fm % (gens I) == 0) +liftf = fm // (gens I) +assert(fm == (gens I) * liftf) -- ok +(gens I) * liftf, fm -- ok + +kk = frac(QQ[a]) +R = kk[x,y] +I = ideal(3*x^2-y, y^3) +f = x^2*y^2 +G = gb(gens I, ChangeMatrix => true) +assert((gens G) - ((gens I) * getChangeMatrix G) == 0) -- ok +fm = matrix{{f}} +assert(fm % (gens I) == 0) +liftf = fm // (gens I) +assert(fm == (gens I) * liftf) -- fails (off by a factor of 9!) +(gens I) * liftf, fm + +end--