根據抽象羣的生成元關係計算凱萊表

定理:任意羣都是一個自由羣的同態像。
luatest FreeGroup.lua
GAP[12,1]=T=Q_12=<a,b|a^6=1,b^2=a^3,ba=a^(-1)b>的凱萊表:
1 2 3 4 5 6 7 8 9 10 11 12
2 3 4 5 6 1 8 9 10 11 12 7
3 4 5 6 1 2 9 10 11 12 7 8
4 5 6 1 2 3 10 11 12 7 8 9
5 6 1 2 3 4 11 12 7 8 9 10
6 1 2 3 4 5 12 7 8 9 10 11
7 12 11 10 9 8 4 3 2 1 6 5
8 7 12 11 10 9 5 4 3 2 1 6
9 8 7 12 11 10 6 5 4 3 2 1
10 9 8 7 12 11 1 6 5 4 3 2
11 10 9 8 7 12 2 1 6 5 4 3
12 11 10 9 8 7 3 2 1 6 5 4

function get_len(tb)
    local len=0
    for k,v in pairs(tb) do
        len=len+1
    end
    return len
end

function simplify0(s)
   local ret=s 
   local n=string.len(ret)
   if n==0 then
      ret="a0b0"
   elseif n==2 then
      if(string.sub(ret,1,1)=="a")then
         ret=ret.."b0"
      elseif(string.sub(ret,1,1)=="b")then
         ret="a0"..ret
      end
   end   
   return ret 
end

function simplify1(s)
   local ret=s
   local n1=string.find(ret,"a0")
   local n2=string.find(ret,"b0") 
   local n=string.len(ret)   
   while(n>4 and (n1~=nil or n2~=nil))do
      if n1~=nil then
          ret,cnt=string.gsub(ret,"a0","")
      elseif n2~=nil then
          ret,cnt=string.gsub(ret,"b0","")
      end
      n1=string.find(ret,"a0")
      n2=string.find(ret,"b0")     
      n=string.len(ret)      
   end
   return ret
end

function simplify2(s,r)
   local ret=s 
   local n1=string.find(ret,"a%da%d")
   local n2=string.find(ret,"b%db%d")       
   while((n1~=nil or n2~=nil))do
      if n1~=nil then
            local sn=tonumber(string.sub(ret,n1+1,n1+1))+tonumber(string.sub(ret,n1+3,n1+3))
            sn=sn%6
            local s3="a"..sn
            if sn==0 then
                s3=""
            end          
            ret,cnt=string.gsub(ret,"a%da%d",s3)
      elseif n2~=nil then
            local sn=tonumber(string.sub(ret,n2+1,n2+1))+tonumber(string.sub(ret,n2+3,n2+3))
            local s3=""
            if sn==0 then
                s3=""
            elseif sn==1 then
                s3="b1"
            elseif sn==2 then
                s3=r--"a3"
            end          
          ret,cnt=string.gsub(ret,"b%db%d",s3)
      end
      n1=string.find(ret,"a%da%d")
      n2=string.find(ret,"b%db%d")     
      n=string.len(ret)           
   end 
   return ret
end

function simplify3(s,r)
    local ret=s
    local n1=string.find(ret,"b%da1b%d")
    local n2=string.find(ret,"b0a1")    
    local n3=string.find(ret,"a1b0")    
    while((n1~=nil) and (n2==nil and n3==nil))do    
        local s1=tonumber(string.sub(ret,n1+1,n1+1))
        local s2=tonumber(string.sub(ret,n1+5,n1+5))        
        local s3=""
        if s1==1 then
             s3=s3..r
        else
             s3=s3.."b"..(s1-1)..r
        end
        if s2>1 then
             s3=s3.."b"..(s2-1)
        end
        ret,cnt=string.gsub(ret,"b%da1b%d",s3)
        n1=string.find(ret,"b%da1b%d")    
        n2=string.find(ret,"b0a1")    
        n3=string.find(ret,"a1b0")        
    end
    return ret
end

function simplify4(s,r)
    local ret=s
    local n1=string.find(ret,"b1a%d")
    local n2=string.find(ret,"b1a0")    
    while((n1==1) and (n2==nil))do    
        local s1=tonumber(string.sub(ret,n1+3,n1+3))
        local s3=""
        if s1==1 then
             s3=r
        else
             s3=r.."a"..(s1-1)
        end
        ret,cnt=string.gsub(ret,"b1a%d",s3)
        n1=string.find(ret,"b1a%d")    
        n2=string.find(ret,"b1a0")        
    end
    return ret
end

function simplify5(s,r)
    local ret=s
    local n1=string.find(ret,"a%db1a%d")
    local n2=string.find(ret,"a0b1")    
    local n3=string.find(ret,"b1a0")    
    while((n1~=nil) and (n2==nil and n3==nil))do    
        local s1=tonumber(string.sub(ret,n1+1,n1+1))
        local s2=tonumber(string.sub(ret,n1+5,n1+5))
        local s3=""
        if s1==1 then
             s3=s3..r
        else
             s3=s3.."a"..(s1-1)..r
        end
        if s2==1 then
             
        else
             s3=s3.."a"..(s2-1)
        end        
        ret,cnt=string.gsub(ret,"a%db1a%d",s3)
        n1=string.find(ret,"a%db1a%d")
        n2=string.find(ret,"a0b1")    
        n3=string.find(ret,"b1a0")            
    end
    return ret
end
 
function Q12mul(s1,s2)
    local ret="a"..s1[1].."b"..s1[2].."a"..s2[1].."b"..s2[2]
    ret=simplify1(ret)      
    ret=simplify2(ret,"a3") --根據b2=a3化簡        
    ret=simplify3(ret,"a2") --根據bab=a2化簡 
    ret=simplify4(ret,"a5b1") --根據ba=a5b化簡      
    ret=simplify5(ret,"b1") --根據aba=b化簡  
    ret=simplify4(ret,"a5b1") --根據ba=a5b化簡      
    ret=simplify2(ret,"a3") --根據b2=a3化簡
    ret=simplify5(ret,"b1") --根據aba=b化簡 
    ret=simplify2(ret,"a3") --根據b2=a3化簡    
    ret=simplify0(ret)     
    local i=tonumber(string.sub(ret,2,2))
    local j=tonumber(string.sub(ret,4,4))
    return i+6*j+1
end

function PrintTable(tb,Mul)
    local n=get_len(tb)
    for i=1,n,1 do
        for j=1,n,1 do
            local ij=Mul(tb[i],tb[j])
            io.write(ij," ")
        end
        io.write("\n")
    end
end

--T={"a0b0","a1b0","a2b0","a3b0","a4b0","a5b0","a0b1","a1b1","a2b1","a3b1","a4b1","a5b1"}
local T={{0,0},{1,0},{2,0},{3,0},{4,0},{5,0},{0,1},{1,1},{2,1},{3,1},{4,1},{5,1}}
print("GAP[12,1]=T=Q_12=<a,b|a^6=1,b^2=a^3,ba=a^(-1)b>的凱萊表:")
PrintTable(T,Q12mul)

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