restart --A Gr\"obner basis as an ideal instead of a matrix GB:=(I)->ideal flatten entries gens gb I --------------------------------------------------- --symbolic LC that could be zero redCoeff:=(LC,NEQk)->( if NEQk !={} then( ilc=ideal(promote(LC,ring(NEQk#0))); for i to #NEQk-1 do( ilc=saturate(ilc,ideal(NEQk#i)); ); lc=(gens(ilc))_(0,0); ) else( lc=LC; ); lc ) ------------------------------------------------------------- rad:=(f,R)->flatten entries gens radical promote(ideal(f),R) ------------------------------------------------------------- multihomRing:=(n,field)->( --reverse ordering of subscripts------------------------- l=for i to 2*n-1 list 2*n-i; --subscripted variables ll=for i to #l-1 list y_(l#i); --subcripted coordinate values lll=for i to #l-1 list z_(l#i); --ring of subcripted coordinate values F=field[lll,MonomialOrder=>Lex]; --ring of subcripted variables R=F[ll,MonomialOrder=>Lex] ); --------------------------------------------------------- multihomVariety:=(n,R,multihom)->( --non-homogeneous constraints to force canonical reps for elements of P^1 nonhom=ideal( for i to 2*n-1 list if i%2==0 then y_(i+1)*(y_(i+1)-1) else (y_(i+1)-1)*(y_i-1)); EQ={GB radical (multihom+nonhom)}; NEQ={{}}; PREV={-1}; ---------------------------------------------- phi:=(j)->map(R,R,matrix{ for i to 2*n-1 list( if i>= 2*n-j then z_(2*n-i) else y_(2*n-i) )} ); --------------------------------------------------- psi=map(R,R,matrix{gens(R)}|matrix{gens(R)}); --------------------------------------------------------------------------------------------- currentnode=0; nextnode=1; sizeEQ=1; while currentnode < sizeEQ do( varno=1; found=0; while found==0 and varno< 2*n do( EQk=psi(EQ#currentnode); NEQk=NEQ#currentnode; p=(phi(varno))(EQk); for i to numgens(p)-1 do( if leadMonomial(p_i)!=1 then( m=redCoeff(leadCoefficient(p_i),NEQk); if m!=0 then( degm=for i from 1 to 2*n list degree(z_i,lift(m,F)); if degm!=for i to 2*n-1 list 0 then( J=(gens radical ideal promote(m,R))_(0,0); found=varno; break; ); ); ); if found>0 then break; ); varno=varno+1; ); if found >0 and found < 2*n then( I=GB(radical((phi(found))(EQk+ideal(J)))); NEQk=unique(for i to #NEQk-1 list ( gens radical saturate(ideal(NEQk#i),I))_(0,0)); NEQkk=for i to #NEQk-1 list (NEQk#i)%I; if member(0,NEQkk) == false then( for ll to #NEQkk-1 do( I=saturate(I,ideal(NEQkk#ll));); EQ=append(EQ,GB(I)); NEQ=append(NEQ,NEQkk); PREV=append(PREV,currentnode); nextnode=nextnode+1; ); I=GB(radical(saturate((phi(found))(EQk),ideal(J)))); NEQk=NEQk|{J}; NEQk=unique(for i to #NEQk-1 list ( gens radical saturate(ideal(NEQk#i),I))_(0,0)); NEQkk=for i to #NEQk-1 list (NEQk#i)%I; if member(0,NEQkk) ==false then( for ll to #NEQkk-1 do( I=saturate(I,ideal(NEQkk#ll));); EQ=append(EQ,GB(I)); NEQ=append(NEQ,NEQkk); PREV=append(PREV,currentnode); nextnode=nextnode+1; ); ); currentnode=currentnode+1; sizeEQ=#EQ; ); {EQ,NEQ,PREV} ); -------------------------------------------------------------- multihomPrint:=(V,R,n,leafs)->( eq=V#0; neq=V#1; prev=V#2; for j to n-1 do(neq=for i to #neq-1 list delete(promote(-z_(2*j+1)+1,R),neq#i)); for i to #(eq)-1 do if eq#i!=1 then if ( leafs==false or member(i,prev)==false) then print(prev#i,i,toString(eq#i),toString(neq#i)) ) ------------------------------------------------------------------------------------------ --Example 1------------------------------------------------------------------------------- R=multihomRing(3,QQ); time V=multihomVariety(3,R, ideal(y_4^3*y_1-y_3*y_2*(y_2+y_1), y_6^2*y_3*y_2-y_5*y_4^2*y_1, y_6^2*y_4*y_1-y_5*y_3*(y_2+y_1))); multihomPrint(V,R,3,true) ------------------------------------------------------------------------------------------ --Example 2------------------------------------------------------------------------------- R=multihomRing(3,QQ); time V=multihomVariety(3,R, ideal(y_2*(y_6^2*y_4+y_6*y_5*y_3+y_5^2*y_3), y_6*(y_6^2*y_4+y_6*y_5*y_3+y_5^2*y_3))); multihomPrint(V,R,3,true) ------------------------------------------------------------------------------------------ --Example 3------------------------------------------------------------------------------- R=multihomRing(4,QQ); time V=multihomVariety(4,R, ideal(y_8^2*y_6*y_3*y_1+y_8*y_7*y_5*y_4*y_1+y_7^2*y_5*y_3*y_2, y_8^2*y_4*y_1+y_8*y_7*y_3*y_2+y_7^2*y_3*y_1)); multihomPrint(V,R,4,true) --Example 4------------------------------------------------------------------------------- --R=multihomRing(4,ZZ/2); --time V=multihomVariety(4,R, -- ideal(y_4^2*y_1^2+y_2^2*y_4*y_3+y_3^2*y_2*y_1, -- y_6^2*y_3^2+y_4^2*y_6*y_5+y_5^2*y_4*y_3, -- y_8^2*y_5^2+y_6^2*y_8*y_7+y_7^2*y_6*y_5)); --multihomPrint(V,R,4,true) ------------------------------------------------------------------------------------------ --Example 5------------------------------------------------------------------------------- R=multihomRing(3,QQ); time V=multihomVariety(3,R, ideal(y_6*y_3*y_2-y_5*y_4*y_1, y_6*y_4*y_1-y_5*y_3*y_2, y_4^2*y_1^2-y_3^2*y_2^2)); multihomPrint(V,R,3,true) ------------------------------------------------------------------------------------------ --Example 6------------------------------------------------------------------------------- R=multihomRing(3,QQ); time V=multihomVariety(3,R, ideal(y_6*y_3*y_2-y_5*(y_4+y_3)*y_1, y_6*y_4*y_1-y_5*y_3*(y_2+y_1), y_4*(y_4+y_3)*y_1^2-y_3^2*y_2*(y_2+y_1))); multihomPrint(V,R,3,true) ------------------------------------------------------------------------------------------ --Example 7------------------------------------------------------------------------------- R=multihomRing(4,QQ); time V=multihomVariety(4,R, ideal(y_8*y_6-y_7*y_5, y_6*y_3*y_2-y_5*y_4*y_1, y_6*y_4*y_1-y_5*y_3*y_2, y_4^2*y_1^2-y_3^2*y_2^2)); multihomPrint(V,R,4,true) ------------------------------------------------------------------------------------------ --Example 8--Whitney umbrella------------------------------------------------------------- R=multihomRing(3,QQ); time V=multihomVariety(3,R, ideal(y_6*y_4^2*y_1^2-y_5*y_3^2*y_2^2)); multihomPrint(V,R,3,true) ------------------------------------------------------------------------------------------ --Example 9--Klein------------------------------------------------------------------------ R=multihomRing(3,QQ); time V=multihomVariety(3,R, ideal( y_4^3*y_1^5+y_4*y_3^2*y_2*y_1^4+y_3^3*y_2^5, y_6*y_3^2*y_2-y_5*y_4^2*y_1, (y_6+y_5)*y_4*y_1^4+y_5*y_3*y_2^4, (y_6^2+y_6*y_5)*y_3*y_1^3+y_5^2*y_4*y_2^3)); multihomPrint(V,R,3,true) ------------------------------------------------------------------------------------------ --Example 10--CLO 8.5.1------------------------------------------------------------------- R=multihomRing(2,QQ); time V=multihomVariety(2,R, ideal( y_4*(y_2^2-y_1^2)+y_3*y_1^2)); multihomPrint(V,R,2,true) time V=multihomVariety(2,R, ideal( y_2*(y_4^2-y_3^2)+y_1*y_3^2)); multihomPrint(V,R,2,true) R=multihomRing(4,QQ); time V=multihomVariety(4,R, ideal( y_7*(3*y_6^2*y_3*y_1+2*y_5^2*y_4*y_2)-2*y_6*y_8*y_3*y_1*y_5, y_7*(2*y_6*y_2*y_3)-2*y_4*y_8*y_5*y_1, y_7*(2*y_6*y_4*y_1-2*y_2*y_5*y_3)-2*y_2*y_8*y_5*y_3, y_6^2*y_3^2*y_1^2+y_4^2*y_5^2*y_1^2+y_2^2*y_5^2*y_1^2-y_5^2*y_3^2*y_1^2)); multihomPrint(V,R,3,true) -------------------------------------- --(1, 4, ideal(z_1-1,y_3,y_4-1,y_5,y_6-1,y_7,y_8-1), {-1152*z_2^7+1763*z_2^5-655*z_2^3+44*z_2}) --(3, 8, ideal( -- z_1-1, -- 1152*z_2^6-1763*z_2^4+655*z_2^2-44, -- y_3^2-y_3, -- 23010*y_4+(268416*z_2^5-367003*z_2^3+98587*z_2+23010)*y_3-23010, -- y_5-y_3, -- 11505*y_6+(-25344*z_2^4+22802*z_2^2+14047)*y_3-11505, -- y_7-y_3, -- 3835*y_8+(-19584*z_2^4+25987*z_2^2+1267)*y_3-3835)) --(5, 9, ideal(z_1,z_2-1,z_3-1,z_4,y_5^2-y_5,y_6+y_5-1,y_7-y_5,y_8+2*y_5-1), {}) --(5, 10, ideal(z_1,z_2-1,z_3-1,y_5,y_6-1,y_7,y_8-1), {z_4}) --(6, 11, ideal(z_1,z_2-1,z_3,z_4-1,z_5-1,y_7,y_8-1), {}) --(7, 14, ideal(z_1-1,z_2,z_3,y_4-1,y_5,y_6-1,y_7,y_8-1), {}) --(12, 15, ideal(z_1,z_2-1,z_3,z_4-1,z_5,z_6-1,z_7-1), {}) --(12, 16, ideal(z_1,z_2-1,z_3,z_4-1,z_5,z_6-1,z_7,y_8-1), {-z_7+1}) --(13, 17, ideal( -- z_1-1, -- z_2, -- z_3-1, -- z_4, -- y_5-1, -- y_6^2-1, -- y_7-1, -- 2*y_8-3*y_6)) --(13, 18, ideal( -- z_1-1, -- z_2, -- z_3-1, -- z_4^2-1, -- y_5-1, -- y_6, -- y_7-1, -- y_8)) --Example robotics-------------------------------------------------------------- R=multihomRing(6,QQ); time V=multihomVariety(6,R, ideal( (4*y_4^2*y_3^2*y_1^4+4*y_3^4*y_2^2*y_1^2)*y_6^2+(-4*y_4^2*y_3^2*y_2*y_1^3-4*y_3^4*y_2^3*y_1)*y_6*y_5+(y_4^4*y_1^4+2*y_4^2*y_3^2*y_2^2*y_1^2+y_3^4*y_2^4-4*y_4^2*y_3^2*y_1^4)*y_5^2, 2*y_4*y_3*y_1^2*y_8*y_5+2*y_3^2*y_2*y_1*y_7*y_6+(-y_4^2*y_1^2-y_3^2*y_2^2)*y_7*y_5, 4*y_3^3*y_2*y_1*y_8*y_6*y_5-2*y_3^3*y_2^2*y_8*y_5^2-4*y_4*y_3^2*y_1^2*y_6^2*y_7+2*y_4*y_3^2*y_2*y_1*y_7*y_6*y_5+y_7*y_5^2*(-y_4^3*y_1^2-y_4*y_3^2*y_2^2+4*y_4*y_3^2*y_1^2), y_8^2*y_5^2+y_7^2*y_6^2-y_7^2*y_5^2, y_10*y_7*y_5*y_3*y_1-y_3*y_2*y_9*y_8*y_5+y_4*y_1*y_9*y_7*y_6, 2*y_12*y_3^2*y_1^2+y_11*(-y_4^2*y_1^2-y_3^2*y_2^2+2*y_3^2*y_1^2) )) multihomPrint(V,R,6,true) --(5, 11, ideal(z_1,z_2-1,z_3-1,z_5,z_6-1,z_7,z_8-1,z_9-1,y_11,y_12-1), {1}) --(5, 12, ideal(z_1,z_2-1,z_3-1,z_5,z_6-1,z_7,z_8-1,z_9,y_10-1,y_11,y_12-1), {1, 1}) --(7, 16, ideal(z_1-1,z_2,z_3-1,y_5-1,y_7-1,y_9-1,y_11-1,2*y_8-z_4,y_10+z_4*y_6,2*y_12-z_4^2+2,4*y_6^2+z_4^2-4), {z_4}) --(8, 17, ideal(z_1-1,z_2,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9-1,y_11,y_12-1), {1}) --(8, 18, ideal(z_1-1,z_2,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9,y_10-1,y_11,y_12-1), {1, 1}) --(9, 19, ideal(z_1-1,z_3-1,z_4,y_5-1,y_7-1,y_9-1,y_11-1,2*y_6-z_2,y_10-z_2*y_8,2*y_12-z_2^2+2,4*y_8^2+z_2^2-4), {z_2}) --(10, 21, ideal(z_1-1,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9-1,y_11,y_12-1), {z_2, 1}) --(10, 22, ideal(z_1-1,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9,y_10-1,y_11,y_12-1), {z_2, 1, 1}) --(15, 27, ideal(z_1-1,z_2,z_3-1,z_4,z_5-1,y_7-1,y_8^2+y_6^2-1,y_9-1,y_10,y_11-1,y_12+1), {}) --(20, 29, ideal(z_1-1,z_3-1,z_5-1,y_7-1,y_9-1,y_11-1,y_8^2+y_6^2-1,y_10-z_2*y_8+z_4*y_6,2*z_4*y_8+2*z_2*y_6-z_4^2-z_2^2,2*y_12-z_4^2-z_2^2+2), {z_2, z_4}) --(23, 31, ideal(z_1,z_2-1,z_3,z_4-1,z_5-1,z_7-1,z_9-1,z_11-1,z_8^2+z_6^2-1), {1}) --(23, 32, ideal(z_1,z_2-1,z_3,z_4-1,z_5-1,z_7-1,z_9-1,z_11,y_12-1,z_8^2+z_6^2-1), {1, 1}) --(24, 33, ideal(z_1,z_2-1,z_3,z_4-1,z_5-1,z_7-1,z_9,z_10-1,z_11-1,z_8^2+z_6^2-1), {1}) --(24, 34, ideal(z_1,z_2-1,z_3,z_4-1,z_5-1,z_7-1,z_9,z_10-1,z_11,y_12-1,z_8^2+z_6^2-1), {1, 1}) --(25, 35, ideal(z_1,z_2-1,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9-1,z_11-1), {1}) --(25, 36, ideal(z_1,z_2-1,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9-1,z_11,y_12-1), {1, 1}) --(26, 37, ideal(z_1,z_2-1,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9,z_10-1,z_11-1), {1}) --(26, 38, ideal(z_1,z_2-1,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9,z_10-1,z_11,y_12-1), {1, 1}) --(28, 39, ideal(z_1-1,z_2,z_3-1,z_4,z_5,z_6-1,z_7,z_8-1,z_9-1,y_11-1,y_12+1), {1}) --(28, 40, ideal(z_1-1,z_2,z_3-1,z_4,z_5,z_6-1,z_7,z_8-1,z_9,y_10-1,y_11-1,y_12+1), {1, 1}) --(30, 41, ideal(z_1-1,z_3-1,z_5,z_6-1,z_7,z_8-1,z_9-1,y_11-1,y_12+1,z_4^2+z_2^2), {z_2, z_4, 1}) --(30, 42, ideal(z_1-1,z_3-1,z_5,z_6-1,z_7,z_8-1,z_9,y_10-1,y_11-1,y_12+1,z_4^2+z_2^2), {z_2, z_4, 1, 1}) --(5, 11, ideal(z_1,z_2-1,z_3-1,z_5,z_6-1,z_7,z_8-1,z_9-1,y_11,y_12-1), {1}) --(5, 12, ideal(z_1,z_2-1,z_3-1,z_5,z_6-1,z_7,z_8-1,z_9,y_10-1,y_11,y_12-1), {1, 1}) --(7, 16, ideal(z_1-1,z_2,z_3-1,y_5-1,y_7-1,y_9-1,y_11-1,2*y_8-z_4,y_10+z_4*y_6,2*y_12-z_4^2+2,4*y_6^2+z_4^2-4), {z_4}) --(8, 17, ideal(z_1-1,z_2,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9-1,y_11,y_12-1), {1}) --(8, 18, ideal(z_1-1,z_2,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9,y_10-1,y_11,y_12-1), {1, 1}) --(9, 19, ideal(z_1-1,z_3-1,z_4,y_5-1,y_7-1,y_9-1,y_11-1,2*y_6-z_2,y_10-z_2*y_8,2*y_12-z_2^2+2,4*y_8^2+z_2^2-4), {z_2}) --(10, 21, ideal(z_1-1,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9-1,y_11,y_12-1), {z_2, 1}) --(10, 22, ideal(z_1-1,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9,y_10-1,y_11,y_12-1), {z_2, 1, 1}) --(15, 27, ideal(z_1-1,z_2,z_3-1,z_4,z_5-1,y_7-1,y_8^2+y_6^2-1,y_9-1,y_10,y_11-1,y_12+1), {}) --(20, 29, ideal(z_1-1,z_3-1,z_5-1,y_7-1,y_9-1,y_11-1,y_8^2+y_6^2-1,y_10-z_2*y_8+z_4*y_6,2*z_4*y_8+2*z_2*y_6-z_4^2-z_2^2,2*y_12-z_4^2-z_2^2+2), {z_2, z_4}) --(23, 31, ideal(z_1,z_2-1,z_3,z_4-1,z_5-1,z_7-1,z_9-1,z_11-1,z_8^2+z_6^2-1), {1}) --(23, 32, ideal(z_1,z_2-1,z_3,z_4-1,z_5-1,z_7-1,z_9-1,z_11,y_12-1,z_8^2+z_6^2-1), {1, 1}) --(24, 33, ideal(z_1,z_2-1,z_3,z_4-1,z_5-1,z_7-1,z_9,z_10-1,z_11-1,z_8^2+z_6^2-1), {1}) --(24, 34, ideal(z_1,z_2-1,z_3,z_4-1,z_5-1,z_7-1,z_9,z_10-1,z_11,y_12-1,z_8^2+z_6^2-1), {1, 1}) --(25, 35, ideal(z_1,z_2-1,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9-1,z_11-1), {1}) --(25, 36, ideal(z_1,z_2-1,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9-1,z_11,y_12-1), {1, 1}) --(26, 37, ideal(z_1,z_2-1,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9,z_10-1,z_11-1), {1}) --(26, 38, ideal(z_1,z_2-1,z_3,z_4-1,z_5,z_6-1,z_7,z_8-1,z_9,z_10-1,z_11,y_12-1), {1, 1}) --(28, 39, ideal(z_1-1,z_2,z_3-1,z_4,z_5,z_6-1,z_7,z_8-1,z_9-1,y_11-1,y_12+1), {1}) --(28, 40, ideal(z_1-1,z_2,z_3-1,z_4,z_5,z_6-1,z_7,z_8-1,z_9,y_10-1,y_11-1,y_12+1), {1, 1}) --(30, 41, ideal(z_1-1,z_3-1,z_5,z_6-1,z_7,z_8-1,z_9-1,y_11-1,y_12+1,z_4^2+z_2^2), {z_2, z_4, 1}) --(30, 42, ideal(z_1-1,z_3-1,z_5,z_6-1,z_7,z_8-1,z_9,y_10-1,y_11-1,y_12+1,z_4^2+z_2^2), {z_2, z_4, 1, 1})