grobner.txt
F={x5+x6+x7*x8+x5*x6+x6*x8+x2+x4+x1,
x5+x7+x2*x3+x1*x10+x2*x9+x7+x4+1,
x9+x6+x9*x10+x9*x1+x3*x6+x10+x4+x6*x5,
x1*x2+x4*x5+x6*x9+x1+x2+x3+x7+1,
x5*x8+x1*x3+x6*x7+x9+x2+x5,
x1^2+x1,
x2^2+x2,
x3^2+x3,
x4^2+x4,
x5^2+x5,
x6^2+x6,
x7^2+x7,
x8^2+x8,
x9^2+x9,
x10^2+x10
}
#coding=utf-8
'''
Created on 2017年7月4日 下午2:15:33
@author:
'''
from grobner_redpoly import main as sub_redpol
from grobner import lcm_t, HTnoxiangjiao
import time
part_f=''
part_p=''
len_f=0
len_p=0
bianyuan=10
t=[]
def init():
'''初始化全局變量'''
global part_f,part_p,len_f,len_p
part_f=''
part_p=''
len_f=0
len_p=0
def have_negative(list):
'''一重列表有係數爲0返回1'''
for i in list:
if i<0:
return 1
break
return 0
def divp(a,b):
'''單項式相除'''
return map(lambda a,b : a-b, a,b) #map(lambda c , d : c+d, c,d)
def mulp(a,b):
'''單項式想乘'''
return map(lambda a,b : a+b, a,b)
def recover(list):
'''recover(g),g爲二重列表,即爲一個多項式'''
if list==0:return 0
b=[]
for i in list:
a=''
for j in range(len(i)):
if i[j]==1:
a+='x'+str(j+1)
elif i[j]!=0:
a+='x'+str(j+1)+'^'+str(i[j])
b.append(a)
if [0]*bianyuan in list:
b.append('1')
if '' in b:
b.remove('')
return '+'.join(b)
def product_G(string):
'''整合輸入F={x3x4+x5x6+x1+x2+x4+x5+x6,}形式,輸出['x2x3x4','x1']'''
a=[]
string=string[3:].replace('}','').replace('\n ','').replace('*','')
print string
G=string.split(',')
print G
for i in G:
a.append(i.split('+'))
G=a
print 'G=',G
return G
def poly_list(string):
'''輸入['x2x3x4', 'x1^2x2x3x4x5', 'x2x3', 'x1'],輸出二重列表'''
poly=[]
erji=[0]*bianyuan
#print '輸入',string
if '1' in string:
poly.append(erji)
string.remove(string[string.index('1')])
for i in string:
erji=[0]*bianyuan
for j in i[1:].split('x'):
if '^' in j:
erji[int(j.split('^')[0])-1]=int(j.split('^')[1])
else:
erji[int(j)-1]=1
poly.append(erji)
return paixu(poly)
def paixu(poly):
'''二重列表進行---dlex排序'''
if poly==0:return 0
list1=[]
for i in poly:
list1.append([sum(i),i])
list1=sorted(list1,reverse=True)
poly=[i[1] for i in list1]
#print 'paixu',recover(poly)
return poly
def quchong(g):
'''去除多項式g中的重複單項式'''
g1=[]
for i in g:
i_index=g.index(i)+1
count,flag=1,0
if i_index<=len(g)-1:
while i==g[i_index]:
count+=1
i_index+=1
flag=1
if i_index>len(g)-1:break
if flag==0:
g1.append(i)
if g1==[]:
if count %2==1:g1.append(i)
elif count%2==1 and g1[-1]!=i:
g1.append(i)
elif i_index==len(g):
g1.append(i)
else:continue
return g1
def zhengchu(p1,p2):
'''p1,p2均爲多項式的項,返回1爲整除,否則爲不整除'''
f=[]
for i in range(len(p1)):
if p1[i]!=0:
f.append(i)
count =0
for i in f:
if p1[i]<=p2[i]:
count+=1
if count==len(f):
return 1
else:return 0
def no_redpol(g,G):
count=0
while True:
count=0
for i in G:
for j in range(len(g)):
if zhengchu(i[0],g[j]):
return 0
#redpol=sub_redpol(p, Q[i]) 開銷太大
#continue
else:
count+=1
if count==len(G)-1:break
return 1
def HTnoxiangjiao(f,g):
def return1(a):
if a>0:return 1
else:return 0
f1,g1=f[0],g[0]
f1=[return1(f1[i]) for i in range(bianyuan)]
g1=[return1(g1[i]) for i in range(bianyuan)]
a=[(f1[i]&g1[i]) for i in range(bianyuan)]
if a==[0]*bianyuan:
return 1
else:return 0
def redpol(g,G):
'''多項式f mod 集合G'''
while True: #no_redpol(g,G)==0
count=0
g1=g[:]
for p in G:
g=sub_redpol(g, p)
if g1==g:count+=1
if count==len(G):
return paixu(g)
def lcm_t(t1,t2):
return [max(t1[i],t2[i]) for i in range(bianyuan)]
def spol(g1,g2):
'''傳入的參數g1,g2都是多項式,排序過,輸出s---多項式'''
t1,t2=g1[0],g2[0]
t=lcm_t(t1,t2)
s1,s2=divp(t,t1),divp(t,t2)
s1g1=[mulp(s1, i) for i in g1]
s2g2=[mulp(s2, i) for i in g2]
spol=quchong(s1g1+s2g2)
return paixu(spol)
def LCM(f,g):
'''求兩個函數的首項的最小公倍數'''
tem = []
for i in range(len(f[0])):
tem.append(max(f[0][i],g[0][i]))
return tem
def min_LCM(B):
'''尋找滿足正則策略的函數對'''
all_tem = []
for s in B:
all_tem.append(LCM(s[0],s[1]))
all_tem=paixu(all_tem)
for s in B:
if LCM(s[0],s[1]) == all_tem[len(all_tem) - 1]:
return s
break
def Buchberger2(s,G,B):
'''判斷Buchberger第二準則是否成立'''
decide = 1
for p in G:
if zhengchu(p[0],LCM(s[0],s[1])) and ((s[0],p) not in B) and ((s[1],p) not in B) and ((p,s[0]) not in B) and ((p,s[1]) not in B):
decide = 0
break
return decide
def grobnernew1(all_g):
'''grobnernew1主函數'''
G = all_g[:]
G = reduction(G)
B = []
for i in G:
for j in G:
if i != j:
if HTnoxiangjiao(i, j)==0:
#if (j,i) not in B:
B.append((i,j))
while (B != []):
s = min_LCM(B)
B.remove(s)
if Buchberger2(s,G,B):
h = spol(s[0],s[1])
h0 = redpol(h,G)
if h0 != []:
for p in G:
if HTnoxiangjiao(p, h0)==0:
B.append((p,h0))
B.append((h0,p))
G.append(h0)
G = reduction(G)
return G
def show_G(G):
count=0
for i in G:
count+=1
print 'G[%d]'%count,recover(i)
def no_zhengchuHT(f,f0):
'''單項式是否整除,f|f0,整除---->0,否則----->1'''
t1=divp(f0,f)
if have_negative(t1):return 1
else:return 0
def redgrobner_condition(f0,F,H):
for f in F:
for h in H:
if no_zhengchuHT(f, f0) and no_zhengchuHT(h, f0):
return 1
def reduction(P):
'''對P進行既約操作'''
Q=P[:]
count=0
while True:
p=Q[count]
Q1=Q[:]
Q1.remove(p)
if p_mod_Q(p, Q1):
Q.remove(p)
h=redpol(p, Q) #不能約化返回自身
if h!=[]:
Q.append(h)
else:
count+=1
if count>=len(Q):break
return Q
# for p2 in Q:
# Q=Q.remove(p)
# h=redpol(p, Q)
# if h!=0:
# Q.append(h)
def p_mod_Q(p,Q):
if p==redpol(p, Q):
return 0
else:return 1
def redgrobner(G):
'''grobner基G的既約'''
H=[]
F=G[:]
while F!=None:
for f0 in F:
F.remove(f0)
if redgrobner_condition(f0, F, H):
H.append(f0)
H=reduction(H)
return H
if __name__=='__main__':
f=open("grobner.txt",'r')
a=f.read()
f.close()
time1 = time.time()
result=open("result_final.txt",'w')
G=product_G(a)
G=[poly_list(i) for i in G]
#print 'G',G
print '*******************grobner*********************'
#print 'h mod G[2]',recover(sub_redpol(h,G[1]))
#print '測試多項式 mod 集合\n',recover(redpol(h, G))
print 'grobner=',show_G(grobnernew1(G))
result.close()
time2 = time.time()
print '所用時間:',(time2 - time1)