計算代數之grobner

 

 

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章