有限交換環的理想判定算法

D:\SixCocos2d-xVC2012\Cocos2d-x\XWH\cstest>csc Ideal.cs IRing.cs

D:\SixCocos2d-xVC2012\Cocos2d-x\XWH\cstest>Ideal
6階環:
[0,3]構成理想,不是冪零理想,是素理想,是準素理想
[0,2,4]構成理想,不是冪零理想,是素理想,是準素理想
和:[0,1,2,3,4,5],不是冪零理想,不是素理想,不是準素理想
積:[0],是冪零理想(m=1),是素理想,是準素理想
交:[0],是冪零理想(m=1),是素理想,是準素理想
和:[0,3],不是冪零理想,是素理想,是準素理想
積:[0,3],不是冪零理想,是素理想,是準素理想
交:[0,3],不是冪零理想,是素理想,是準素理想
和:[0,2,4],不是冪零理想,是素理想,是準素理想
積:[0,2,4],不是冪零理想,是素理想,是準素理想
交:[0,2,4],不是冪零理想,是素理想,是準素理想

12階環:
[0,3,6,9]構成理想,不是冪零理想,是素理想,是準素理想
[0,4,8]構成理想,不是冪零理想,不是素理想,是準素理想
和:[0,1,2,3,4,5,6,7,8,9,10,11],不是冪零理想,不是素理想,不是準素理想
積:[0],是冪零理想(m=1),是素理想,是準素理想
交:[0],是冪零理想(m=1),是素理想,是準素理想
和:[0,3,6,9],不是冪零理想,是素理想,是準素理想
積:[0,3,6,9],不是冪零理想,是素理想,是準素理想
交:[0,3,6,9],不是冪零理想,是素理想,是準素理想
和:[0,4,8],不是冪零理想,不是素理想,是準素理想
積:[0,4,8],不是冪零理想,不是素理想,是準素理想
交:[0,4,8],不是冪零理想,不是素理想,是準素理想

12階環:
[0,3,6,9]構成理想,不是冪零理想,是素理想,是準素理想
[0,2,4,6,8,10]構成理想,不是冪零理想,是素理想,是準素理想
和:[0,1,2,3,4,5,6,7,8,9,10,11],不是冪零理想,不是素理想,不是準素理想
積:[0,6],是冪零理想(m=2),不是素理想,不是準素理想
交:[0,6],是冪零理想(m=2),不是素理想,不是準素理想
和:[0,3,6,9],不是冪零理想,是素理想,是準素理想
積:[0,3,6,9],不是冪零理想,是素理想,是準素理想
交:[0,3,6,9],不是冪零理想,是素理想,是準素理想
和:[0,2,4,6,8,10],不是冪零理想,是素理想,是準素理想
積:[0,4,8],不是冪零理想,不是素理想,是準素理想
交:[0,2,4,6,8,10],不是冪零理想,是素理想,是準素理想

using System;
using System.Collections.Generic;

namespace gap
{
    class rutil
    {
        // ascending=true表示升序,false表示降序
        public static void pibub(List<int> p,bool ascending)
        {
            int temp,i,j;
            int n=p.Count;
            for(i=0;i<n;i++)
            {
                for(j=0;j<i;j++)
                {
                    if(p[j]>p[i]==ascending)
                    {
                        temp=p[i];
                        //插入
                        for(int k=i;k>=j;k--)
                            p[k]=p[k-1];
                        p[j]=temp;
                    }
                }
            }
        }
        
        public static string V2S(List<int> v){
           string str="[";
           int n=v.Count;
           for(int i=0;i<n;i++)
           {
               str+=v[i].ToString();
               if(i<n-1)
                   str+=",";   
           }       
           str+="]";
           return str;
        }        
        
        public static bool IsEqual(List<int> a,List<int> b){
            int na=a.Count;
            int nb=b.Count;
            if(na!=nb)
                return false;
            for(int i=0;i<na;i++)
                if(a[i]!=b[i])
                    return false;
            return true;
        }        
        
        // 判斷集合I是否是環r的理想
        public static int IsIdeal(IRing r,List<int> I){
         //I是r的子環
         Subring s=new Subring(r,I);
         bool bE=IsEqual(I,s.m_Set);
          if(!bE){
           return 0;// 子環也不是
          }
         //進一步判斷是否是理想
         for(int i=0;i<r.size();i++){//任意純量環元素c
          for(int j=0;j<I.Count;j++){//任意向量模元素a
           int ca=r.mul(i,I[j]);
           int ac=r.mul(I[j],i);
            int p=Subring.getidx(I,ca);
            if(p==-1){
                return 2;// 是子環但不是理想
            }   
            int p1=Subring.getidx(I,ac);
            if(p1==-1){
                return 2;// 是子環但不是理想
            }
          }
         }
         return 1;//是理想
        }
                
        public static string IsIdealRetInfo(int iret){
            string[] str={"不構成環","構成理想","構成非理想子環"};
            return str[iret];
        }    

        /*
            我們把理想A,B,…的最大公因子或和理解爲由它們的並所生成的理想(A,B,…),同樣地,把它們的最小公倍理解爲交[A,B,…]=A∩B∩…。
            定理:設R爲環,I,J都是R的理想。則I與J的和與交都是R的理想。
            定理:(1)環R的任意有限多個理想的和還是理想;(2)環R的任意(有限或無限)多個理想的交還是R的理想。
            由兩個理想I,J的和生成的理想(I,J)稱爲這兩個理想的最大公因子(g.c.d.),它是它們的公因子,並且每個公因子都能整除它。(I,J)也稱爲這兩個理想的和,因爲它顯然是由所有的元素a+b組成,其中a∈I,b∈J。
            理想I,J的交I∩J稱爲它們的最小公倍(l.c.m.),它是它們的公倍並且能整除它們的每個公倍。
            定義:理想數[a_1b_1,…,a_1b_r,a_2b_1,…,a_2b_r,…,a_qb_1,…,a_qb_r]稱爲理想數A=[a_1,,a_q]及B=[b_1,,b_r]的乘積,以AB記之。
            定義:設R爲環,I,J都是R的理想,集合I+J:={a+b|a∈I,b∈J},I·J:={∑a_ib_i|a_i∈I,b_i∈J}與I∩J分別稱爲理想I與J的和、積、交。
            易知I+J,I·J,I∩J都是理想,並有(a)+(b)=(a,b),(a)·(b)=(ab),I·J包含於I∩J。        
        */
        
        // 理想的和gcd
        public static List<int> SumIdeals(IRing r,List<int> I,List<int> J){
            List<int> L=new List<int>();
            for(int i=0;i<I.Count;i++){
                for(int j=0;j<J.Count;j++){
                int ij=r.add(I[i],J[j]);
                if(Subring.getidx(L,ij)==-1)
                    L.Add(ij);
                }
            }
            pibub(L,true);
            return L;            
        }
        
        // 理想的積
        public static List<int> MultipleIdeals(IRing r,List<int> I,List<int> J){
            List<int> L=new List<int>();
            for(int i=0;i<I.Count;i++){
                for(int j=0;j<J.Count;j++){
                int ij=r.mul(I[i],J[j]);
                if(Subring.getidx(L,ij)==-1)
                    L.Add(ij);
                }
            }
            pibub(L,true);        
            return L;                
        }        
        
        // 理想的交lcm
        public static List<int> IntersectIdeals(IRing r,List<int> I,List<int> J){                
            return IntersectSet(I,J);
        }        
        
        // 集合的交
        public static List<int> IntersectSet(List<int> I,List<int> J){
            List<int> L=new List<int>();
            for(int i=0;i<I.Count;i++){
                if(Subring.getidx(J,I[i])>-1)
                    L.Add(I[i]);    
            }                
            return L;
        }    
        
        // 一個(左或右)理想I稱爲冪零的,如果它的某個冪I^m是零理想。
        public static int IsNilpotentIdeal(IRing r,List<int> I){    
            List<int> O=new List<int>{0};
            List<int> I1=new List<int>(I);
            List<int> Ii=MultipleIdeals(r,I1,I);            
            int cnt1=I1.Count;
            int cnti=Ii.Count;            
            int m=1;
            while(cnti!=cnt1)
            {
                cnt1=Ii.Count;
                Ii=MultipleIdeals(r,Ii,I);
                m++;
                cnti=Ii.Count;
            }
            if(IsEqual(Ii,O))
                return m;// 是冪零理想
            return 0;//不是冪零理想
        }    

        public static string IsNilpotentIdealRetInfo(int iret){
            string[] str={"不是冪零理想",string.Format("是冪零理想(m={0:G})",iret)};
            if(iret!=0)
                iret=1;
            return str[iret];
        }
        
        /*     
            環r的真理想I(也即I≠r,{0}也算真理想)被稱爲素理想,若對任意r上的理想A,B,有AB包含於I推導出A包含於I或B包含於I。 
            r的理想I是素理想,當且僅當它是一個真理想,且對於r的任何兩個理想A和B使得AB包含於I,都有A包含於I或B包含於I。 
            素理想對交換環有一個較簡單的描述:如果r是一個交換環,那麼r的理想I是素理想,如果它具有以下兩個性質:
            1、只要a,b是r的兩個元素,使得它們的乘積ab位於I內,那麼要麼a位於I內,要麼b位於I內。 
            2、I不等於整個環r。
        */ 
        public static bool IsPrimeIdeal(IRing r,List<int> I){    
            if(I.Count==r.size())
                return false;
            if(I.Count==1 && I[0]==0)
                return true;
            for(int i=0;i<r.size();i++){
                for(int j=0;j<r.size();j++){
                    int ij=r.mul(i,j);
                    if(Subring.getidx(I,ij)>-1){
                        if(Subring.getidx(I,i)==-1 && Subring.getidx(I,j)==-1){
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        
        public static string IsPrimeIdealRetInfo(bool bret){
            return bret?"是素理想":"不是素理想";
        }

        /*
            準素理想:環r的真理想I。若對任意r上的理想A,有A^2包含於I推導出A包含於I,稱I是r的準素理想。 
            一個理想叫做準素的,如果在它的同餘類環裏每一個零因子都是冪零的。
            這個定義是素理想定義的一個微小改變。在以一個素理想爲模的同餘類環裏,每一個零因子不僅是冪零的,而且本身就是零。
            素理想是準素理想,反之不成立。 
            定理:每一個不可約理想都是準素的。
            因爲每一理想都可以表示成有限個不可約理想的交,而每一不可約理想都是準素的,所以
            定理:每一理想都可以被表示成有限個準素理想的交。    
            準素理想對交換環有一個較簡單的描述:如果r是一個交換環,那麼r的理想I是準素理想,如果它具有以下兩個性質:
            1、只要a,b是r的兩個元素,使得它們的乘積ab位於I內,且a不位於I內,那麼存在正整數n,使得b^n位於I內。 
            2、I不等於整個環r。            
        */
        public static bool IsPrimaryIdeal(IRing r,List<int> I){    
            if(I.Count==r.size())
                return false;
            if(I.Count==1 && I[0]==0)
                return true;
            for(int i=0;i<r.size();i++){
                for(int j=0;j<r.size();j++){
                    int ij=r.mul(i,j);
                    if(Subring.getidx(I,ij)>-1 && Subring.getidx(I,i)==-1){
                        List<int> J=Na(r,j);
                        List<int> IJ=IntersectSet(I,J);
                        if(IJ.Count==0){
                            return false;
                        }
                    }
                }
            }
            return true;
        }

        public static string IsPrimaryIdealRetInfo(bool bret){
            return bret?"是準素理想":"不是準素理想";
        }    

        // {a^n|a屬於r,n是正整數}
        public static List<int> Na(IRing r,int a) 
        { 
            List<int> L=new List<int>();
            int mi=a;
            while(Subring.getidx(L,mi)==-1)
            {
                L.Add(mi);
                mi=r.mul(mi,a);
            }            
            return L; 
        }    
    }
    
    // 一個環r的子環s
    class Subring:IRing
    {
        // 靜態函數
        public static int getidx(List<int> L,int a)
        {
            for(int i=0;i<L.Count;i++)
                if(L[i]==a)
                    return i;
            return -1;
        }
        // 實現抽象基類的方法
        public override void printTable()
        {
            util.printRing(this);
        }
        public override int add(int a,int b)
        {
            int ij=m_r.add(m_Set[a],m_Set[b]);
            int IJ=getidx(m_Set,ij);
            return IJ;        
        }
        public override int mul(int a,int b)
        {
            int ij=m_r.mul(m_Set[a],m_Set[b]);
            int IJ=getidx(m_Set,ij);
            return IJ;            
        }        
        public override int size()
        {
            return m_Set.Count;
        }        
        // 構造函數
        public Subring(IRing r,List<int> gens)
        {
            m_r=r;
            m_Set=new List<int>();
            int E=0;
            m_Set.Add(E);
            for(int i=0;i<gens.Count;i++)
            {
                if(gens[i]!=E)
                    m_Set.Add(gens[i]);
            }
            int R=m_Set.Count;
            int cnt=R;
            int cnt1=R;
            do{
                cnt=m_Set.Count;
                for(int i=0;i<cnt;i++)
                {
                    for(int j=0;j<cnt;j++)
                    {
                        int IJ=m_r.mul(m_Set[i],m_Set[j]);
                        int p=getidx(m_Set,IJ);
                        if(p==-1){
                            m_Set.Add(IJ);
                        }
                        int IJ1=m_r.add(m_Set[i],m_Set[j]);
                        int p1=getidx(m_Set,IJ1);
                        if(p1==-1){
                            m_Set.Add(IJ1);
                        }
                    }
                }
                cnt1=m_Set.Count;
            }while(cnt1>cnt);
        }
        
        // 成員函數            
        // 成員變量
        public List<int> m_Set;
        IRing m_r;
    };    
    
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class testIdeal
    {
        static void test(IRing r,List<int> L1,List<int> L2)
        {    
            Console.WriteLine(string.Format("{0:G}階環:",r.size()));
            List<int> sum=rutil.SumIdeals(r,L1,L2);
            List<int> mul=rutil.MultipleIdeals(r,L1,L2);    
            List<int> inter=rutil.IntersectIdeals(r,L1,L2);                
            int i1=rutil.IsIdeal(r,L1);
            int i2=rutil.IsIdeal(r,L2);
            int n1=rutil.IsNilpotentIdeal(r,L1);
            int n2=rutil.IsNilpotentIdeal(r,L2);
            int nsum=rutil.IsNilpotentIdeal(r,sum);
            int nmul=rutil.IsNilpotentIdeal(r,mul);    
            int ninter=rutil.IsNilpotentIdeal(r,inter);
            bool b1=rutil.IsPrimeIdeal(r,L1);
            bool b2=rutil.IsPrimeIdeal(r,L2);
            bool bsum=rutil.IsPrimeIdeal(r,sum);
            bool bmul=rutil.IsPrimeIdeal(r,mul);
            bool binter=rutil.IsPrimeIdeal(r,inter);    
            bool bb1=rutil.IsPrimaryIdeal(r,L1);
            bool bb2=rutil.IsPrimaryIdeal(r,L2);
            bool bbsum=rutil.IsPrimaryIdeal(r,sum);
            bool bbmul=rutil.IsPrimaryIdeal(r,mul);
            bool bbinter=rutil.IsPrimaryIdeal(r,inter);                
            Console.WriteLine("{0}{1},{2},{3},{4}",rutil.V2S(L1),rutil.IsIdealRetInfo(i1),rutil.IsNilpotentIdealRetInfo(n1),rutil.IsPrimeIdealRetInfo(b1),rutil.IsPrimaryIdealRetInfo(bb1));
            Console.WriteLine("{0}{1},{2},{3},{4}",rutil.V2S(L2),rutil.IsIdealRetInfo(i2),rutil.IsNilpotentIdealRetInfo(n1),rutil.IsPrimeIdealRetInfo(b2),rutil.IsPrimaryIdealRetInfo(bb2));
            Console.WriteLine("和:{0},{3},{6},{9}\n積:{1},{4},{7},{10}\n交:{2},{5},{8},{11}",
                rutil.V2S(sum),rutil.V2S(mul),rutil.V2S(inter),
                rutil.IsNilpotentIdealRetInfo(nsum),rutil.IsNilpotentIdealRetInfo(nmul),rutil.IsNilpotentIdealRetInfo(ninter),
                rutil.IsPrimeIdealRetInfo(bsum),rutil.IsPrimeIdealRetInfo(bmul),rutil.IsPrimeIdealRetInfo(binter),
                rutil.IsPrimaryIdealRetInfo(bbsum),rutil.IsPrimaryIdealRetInfo(bbmul),rutil.IsPrimaryIdealRetInfo(bbinter));        
            sum=rutil.SumIdeals(r,L1,L1);
            mul=rutil.MultipleIdeals(r,L1,L1);    
            inter=rutil.IntersectIdeals(r,L1,L1);
            nsum=rutil.IsNilpotentIdeal(r,sum);
            nmul=rutil.IsNilpotentIdeal(r,mul);    
            ninter=rutil.IsNilpotentIdeal(r,inter);    
            bsum=rutil.IsPrimeIdeal(r,sum);
            bmul=rutil.IsPrimeIdeal(r,mul);
            binter=rutil.IsPrimeIdeal(r,inter);    
            bbsum=rutil.IsPrimaryIdeal(r,sum);
            bbmul=rutil.IsPrimaryIdeal(r,mul);
            bbinter=rutil.IsPrimaryIdeal(r,inter);            
            Console.WriteLine("和:{0},{3},{6},{9}\n積:{1},{4},{7},{10}\n交:{2},{5},{8},{11}",
                rutil.V2S(sum),rutil.V2S(mul),rutil.V2S(inter),
                rutil.IsNilpotentIdealRetInfo(nsum),rutil.IsNilpotentIdealRetInfo(nmul),rutil.IsNilpotentIdealRetInfo(ninter),
                rutil.IsPrimeIdealRetInfo(bsum),rutil.IsPrimeIdealRetInfo(bmul),rutil.IsPrimeIdealRetInfo(binter),
                rutil.IsPrimaryIdealRetInfo(bbsum),rutil.IsPrimaryIdealRetInfo(bbmul),rutil.IsPrimaryIdealRetInfo(bbinter));        
            sum=rutil.SumIdeals(r,L2,L2);
            mul=rutil.MultipleIdeals(r,L2,L2);    
            inter=rutil.IntersectIdeals(r,L2,L2);    
            nsum=rutil.IsNilpotentIdeal(r,sum);
            nmul=rutil.IsNilpotentIdeal(r,mul);    
            ninter=rutil.IsNilpotentIdeal(r,inter);
            bsum=rutil.IsPrimeIdeal(r,sum);
            bmul=rutil.IsPrimeIdeal(r,mul);
            binter=rutil.IsPrimeIdeal(r,inter);    
            bbsum=rutil.IsPrimaryIdeal(r,sum);
            bbmul=rutil.IsPrimaryIdeal(r,mul);
            bbinter=rutil.IsPrimaryIdeal(r,inter);            
            Console.WriteLine("和:{0},{3},{6},{9}\n積:{1},{4},{7},{10}\n交:{2},{5},{8},{11}",
                rutil.V2S(sum),rutil.V2S(mul),rutil.V2S(inter),
                rutil.IsNilpotentIdealRetInfo(nsum),rutil.IsNilpotentIdealRetInfo(nmul),rutil.IsNilpotentIdealRetInfo(ninter),
                rutil.IsPrimeIdealRetInfo(bsum),rutil.IsPrimeIdealRetInfo(bmul),rutil.IsPrimeIdealRetInfo(binter),
                rutil.IsPrimaryIdealRetInfo(bbsum),rutil.IsPrimaryIdealRetInfo(bbmul),rutil.IsPrimaryIdealRetInfo(bbinter));
            Console.WriteLine("");
        }          
        static void Main(string[] args)
        {    
            ZmodnZ r6_4=new ZmodnZ(1,6);
            List<int> L1=new List<int>();
            L1.Add(0);
            L1.Add(3);
            List<int> L2=new List<int>();
            L2.Add(0);
            L2.Add(2);
            L2.Add(4);
            test(r6_4,L1,L2);
            
            ZmodnZ r12_5=new ZmodnZ(1,12);
            L1.Clear();
            L1.Add(0);
            L1.Add(3);
            L1.Add(6);
            L1.Add(9);            
            L2.Clear();
            L2.Add(0);
            L2.Add(4);
            L2.Add(8);
            test(r12_5,L1,L2);
            L2.Clear();
            L2.Add(0);
            L2.Add(2);
            L2.Add(4);
            L2.Add(6);
            L2.Add(8);
            L2.Add(10);            
            test(r12_5,L1,L2);            
        }   
    }
}

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