### To use this code, change '.txt' to '.sage' and use "sage Dynamic.sage" command. ###Name of variables should be in the second line of this code maple.read("#/path to Functions.txt/# Functions.txt") R.< #Variable names# > = PolynomialRing(QQ) import time lp = MixedIntegerLinearProgram() y = lp.new_variable(real=True, nonnegative=True) lp.set_objective(None) def Dynamic(F,n): t1 = time.time() Fh = F; kk = maple.nops(Fh); G = [] B = [] lt = [] bound = [] order = [] To = 0 Ti = 0 for i in range(0,maple.nops(n)): lp.add_constraint(y[i] >= 0) m = 0 for i in range(0,maple.nops(n)): m = m+y[i] lp.add_constraint(m == 50) while maple.nops(Fh) != 0: f1 = Fh.pop() f = f1[0] p = lp.polyhedron() bou = p.vertices_list() ine = p.inequalities_list() ineq = [] Mn = 0 for i in range(0,len(ine)): Mn = 0 for j in range(0,maple.nops(n)): Mn = Mn+ine[i][j+1]*y[j] Mn = Mn+ine[i][0] ineq.append(Mn >= 0) lpn = lp.number_of_constraints() Re = [] for i in range(0,lpn): Re.append(i) lp.remove_constraints(Re) m = 0 for i in range(0,maple.nops(n)): m = m+y[i] lp.add_constraint(m == 50) for i in range(0,len(ineq)): lp.add_constraint(ineq[i]) bound = [] for j in range(0,len(bou)): a = maple.Vector(bou[j]) bound.append(a) ord = p.center() order = [] for q in range(0,len(ord)): order.append(ord[q]) clt = maple.CompatibleLTs(f,bound,order,n) print "clt ok" print clt clt = maple.Sort(clt,n) lt = maple.SelectBestHilbert(G,clt,n) print "lt ok" print lt o = maple.update1(G,B,[f,lt,f1[1]]) G = o[1] B = o[2] p1 = maple.power(f,n) p2 = maple.power(lt,n) for i in range(1,maple.nops(p1)+1): q = p2[1]-p1[i] ff = false for i in range(1,maple.nops(n)+1): if q[i] != 0: ff = true break if ff == true: m = 0 for i in range(0,maple.nops(n)): m = m+q[i+1]*y[i] lp.add_constraint(m >= 0) ee = 0 flagorder = true lp.show() while maple.nops(B) != 0: ee = ee+1 print ee if flagorder == true: p = lp.polyhedron() bou = p.vertices_list() ine = p.inequalities_list() ineq = [] Mn = 0 for i in range(0,len(ine)): Mn = 0 for j in range(0,maple.nops(n)): Mn = Mn+ine[i][j+1]*y[j] Mn = Mn+ine[i][0] ineq.append(Mn >= 0) lpn = lp.number_of_constraints() Re = [] for i in range(0,lpn): Re.append(i) lp.remove_constraints(Re) m = 0 for i in range(0,maple.nops(n)): m = m+y[i] lp.add_constraint(m == 50) for i in range(0,len(ineq)): lp.add_constraint(ineq[i]) bound = [] for j in range(0,len(bou)): a = maple.Vector(bou[j]) bound.append(a) ord = p.center() order = [] for q in range(0,len(ord)): order.append(ord[q]) print "order ok" flagorder = false Gfirst = [] for i in range(1,maple.nops(G)+1): Gfirst.append(G[i][1]) b = B[1]; B = maple.removeing(B) s = maple.SPolynomial(b[1][1],b[2][1],maple.wdeg(order,n)) r = maple.Reduce(s,Gfirst,maple.wdeg(order,n)) print "r ok" ltt = maple.LeadingCoefficient(r,maple.plex(maple.op(n))) print "ltt ok" if ltt != 0 : print "!" flagorder = true clt = maple.CompatibleLTs(r,bound,order,n) print "clt ok" print clt clt = maple.Sort(clt,n) lt = maple.SelectBestHilbert(G,clt,n) print "lt ok" print lt degsu = maple.degSuger(b[1],b[2]) o = maple.update1(G,B,[r,lt,degsu]) G = o[1] B = o[2] p1 = maple.power(r,n) p2 = maple.power(lt,n) if maple.nops(clt) > 1: for i in range(1,maple.nops(p1)+1): q = p2[1]-p1[i] ff = false for i in range(1,maple.nops(n)+1): if q[i] != 0: ff = true break if ff == true: m = 0 for i in range(0,maple.nops(n)): m = m+q[i+1]*y[i] lp.add_constraint(m >= 0) print "Finish " print "order is:" p = lp.polyhedron() ord = p.center() order = [] for q in range(0,len(ord)): order.append(ord[q]) print order ggg = [] for i in range(1,maple.nops(G)+1): ggg.append(G[i][1]) m = maple.InterReduce(ggg,maple.wdeg(order,n)) print "Poly" print maple.nops(m) tt = maple.termCount(m,n) print "Number of Terms:" print tt #Call Dynamic(F,n) where F is set of polynomials and each polynomial is pair with its total degree. n is an arbitrary order of variables. # NOTE: name of vairable in ring, CAN NOT be 'y'. ###First input of Dynamic for tests are as follow: #F1 = [[u0 + 2*u1 + 2*u2 + 2*u3 + 2*u4 + 2*u5 -1 , 1] , [2*u0*u1 + 2*u1*u2 + 2*u2*u3 + 2*u3*u4 + 2*u4*u5 - u1 , 2] , [2*u0*u2 + u1^2 + 2*u1*u3 + 2*u2*u4 + 2*u3*u5 - u2 , 2] , [2*u0*u3 + 2*u1*u2 + 2*u1*u4 + 2*u2*u5 - u3 , 2] , [2*u0*u4 + 2*u1*u3 + 2*u1*u5 + u2^2 - u4 , 2 ] , [u0^2 - u0 + 2*u1^2 + 2*u2^2 + 2*u3^2 + 2*u4^2 + 2*u5^2 , 2]] #F2 = [[t^4 * z * b + x^3 * yy * a , 6] , [t * x^8 * yy * z - a * b^4 * c * d * e , 11] , [x * yy^2 * z^2 * d + z * c^2 * e^2 , 6] , [t * x^2 * yy^3 * z^4 + a * b^2 * c^3 * e^2 , 10]] #F3 = [[(z1-6)^2+z2^2+z3^2-104,2],[z4^2+(z5-6)^2+z6^2-104,2],[z7^2+(z8-12)^2+(z9-6)^2-80,2],[z1*(z4-6)+z5*(z2-6)+z3*z6-52,2],[z1*(z7-6)+z8*(z2-12)+z9*(z3-6)+64,2],[z4*z7+z8*(z5-12)+z9*(z6-6)-6*z5+32,2],[2*z2+2*z3-2*z6-z4-z5-z7-z9+18,1],[z1+z2+2*z3+2*z4+2*z6-2*z7+z8-z9-38,1],[z1+z3+z5-z6+2*z7-2*z8-2*z4+8,1]] #F4 = [[x^33 * z^23 - yy^82 * a , 83 ] , [x^45 - yy^13 * z^21 * b, 45 ] , [x^41 * c - yy^33 * z^12, 45 ] , [x^22 - yy^33 * z^12 *d ,46 ] , [x^5 * yy^17 * z^22 * e - 1, 45] , [x * yy * z * t - 1, 4]] #F5 = [[-a*yy+b*x,2], [(x-l)*d-yy*(c-l),2], [-a^2+b^2-r^2,2], [(c-l)^2+d^2-s^2,2], [(a-c)^2+d^2-s^2,2], [(a-c)^2+(b-d)^2-t^2,2]] #F6 = [ [45*p + 35*s - 165*b - 36, 1] , [35*p + 40*z + 25*t - 27*s , 1] , [15*w + 25*p*s + 30*z - 18*t - 165*b^2 , 2] , [-9*w + 15*p*t + 20*z*s , 2] , [w*p + 2*z*t - 11*b^3 , 3 ] , [99*w - 11*s*b + 3*b^2 , 2] ] #F7 = [[-x^2*yy*z^4+t, 7], [-x^5*yy^7+u*z^2, 12], [v*x^3*z-yy^2, 5], [z^5-x*yy^3, 5]] #F8 = [[a*b*c*d*e-1,5], [a*b*c*d+b*c*d*e+a*c*d*e+d*e*a*b+e*a*b*c,4],[ a*b*c+b*c*d+c*d*e+d*e*a+e*a*b,3] , [a*b+e*d+b*c+c*d+e*a,2], [a+b+c+d+e,1]] #F9 = [[a*b*c*d*e*f-1,6],[a*b*c*d*e+b*c*d*e*f+c*d*e*f*a+d*e*f*a*b+e*f*a*b*c+f*a*b*c*d,5],[a*b*c*d+b*c*d*e+c*d*e*f+d*e*f*a+e*f*a*b+f*a*b*c,4],[a*b*c+b*c*d+c*d*e+d*e*f+e*f*a+f*a*b,3],[a*b+b*c+c*d+d*e+e*f+f*a,2],[a+b+c+d+e+f,1]] #F10 = [ [u+v+yy-1,1] , [t+2*u+z-3,1] , [t+2*v+yy-1,1] , [-t-u-v+x-yy-z,1] , [t*u*x^2-1569/31250*yy*z^3,4] , [587/15625*t*yy+v*z,2] ] ###Second input for each system, is the variables