高斯整数C#版本

Posted 华仔Ivan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高斯整数C#版本相关的知识,希望对你有一定的参考价值。

First complex number:  471 + 643i不是高斯素数
Second complex number: 9 + 11i不是高斯素数
The sum of the two numbers: 480 + 654i
The Minus of the two numbers: 462 + 632i
The Product of the two numbers: -2834 + 10968i
The Divide of the two numbers: 56 + 3i,b=True,q=56 + 3i,r=0 + 0i
gcd(112 + 1i,-57 + 79i)=4 + 7i
gcd(112 + 1i,-57 + 79i)=4 + 7i,z5=-1 + -6i,z6=5 + -5i
第0个高斯整数是0 + 0i
第1个高斯整数是1 + 0i
第2个高斯整数是0 + 1i
第3个高斯整数是-1 + 0i
第4个高斯整数是0 + -1i
第5个高斯整数是1 + 1i
第6个高斯整数是-1 + 1i
第7个高斯整数是-1 + -1i
第8个高斯整数是1 + -1i
第9个高斯整数是2 + 0i
第10个高斯整数是0 + 2i
第11个高斯整数是-2 + 0i
第12个高斯整数是0 + -2i
第13个高斯整数是2 + 1i
第14个高斯整数是1 + 2i
第15个高斯整数是-1 + 2i
第16个高斯整数是-2 + 1i
第17个高斯整数是-2 + -1i
第18个高斯整数是-1 + -2i
第19个高斯整数是1 + -2i
第20个高斯整数是2 + -1i
第21个高斯整数是2 + 2i
第22个高斯整数是-2 + 2i
第23个高斯整数是-2 + -2i
第24个高斯整数是2 + -2i
第25个高斯整数是3 + 0i
第26个高斯整数是0 + 3i
第27个高斯整数是-3 + 0i
第28个高斯整数是0 + -3i
第29个高斯整数是3 + 1i
第30个高斯整数是1 + 3i
第31个高斯整数是-1 + 3i
第32个高斯整数是-3 + 1i
第33个高斯整数是-3 + -1i
第34个高斯整数是-1 + -3i
第35个高斯整数是1 + -3i
第36个高斯整数是3 + -1i
第37个高斯整数是3 + 2i
第38个高斯整数是2 + 3i
第39个高斯整数是-2 + 3i
第40个高斯整数是-3 + 2i
第41个高斯整数是-3 + -2i
第42个高斯整数是-2 + -3i
第43个高斯整数是2 + -3i
第44个高斯整数是3 + -2i
第45个高斯整数是3 + 3i
第46个高斯整数是-3 + 3i
第47个高斯整数是-3 + -3i
第48个高斯整数是3 + -3i

using System;
using System.Collections.Generic;

public struct Complex
     
    public int real;      
    public int imaginary;       
    public Complex(int real, int imaginary)      
              
        this.real = real;          
        this.imaginary = imaginary;      
           
    //overload operator(+),added(two Complex objects) and return a Complex type      
    public static Complex operator +(Complex c1, Complex c2)      
              
        return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary);      
           
    //overload operator(-)      
    public static Complex operator -(Complex c1, Complex c2)      
              
        return new Complex(c1.real - c2.real, c1.imaginary - c2.imaginary);      
                
    //overload operator(*)      
    public static Complex operator *(Complex c1, Complex c2)      
              
        return new Complex(c1.real * c2.real - c1.imaginary * c2.imaginary,c1.real * c2.imaginary + c1.imaginary * c2.real);      
           
    //overload operator(/)      
    public static Complex operator /(Complex c1, Complex c2)      
              
        Complex c2c=new Complex(c2.real,-c2.imaginary);
        Complex c1c2c=c1*c2c;        
        int N=Norm(c2);    
        Complex c1c2=c1*c2c;    
        double crf=(double)c1c2.real/N;
        double cif=(double)c1c2.imaginary/N;     
        //int cr=crf>0?(int)(crf+0.5):(int)(crf-0.5);
        //int ci=cif>0?(int)(cif+0.5):(int)(cif-0.5);
        int cr=(int)Math.Floor(crf+0.5);
        int ci=(int)Math.Floor(cif+0.5);         
        return new Complex(cr,ci);
     
    // 按范数和辐角主值从小到大排列顺序
    public static bool operator < (Complex c1, Complex c2) 
    
       int norm1=Norm(c1);
       int norm2=Norm(c2);
       double arg1=Math.Atan2(c1.imaginary,c1.real);
       double arg2=Math.Atan2(c2.imaginary,c2.real);
       double pi=Math.Atan2(0,-1);
       if(arg1<0)
           arg1+=2*pi;
       if(arg2<0)
           arg2+=2*pi;
       if(norm1!=norm2)
           return norm1<norm2;
       else
           return arg1<arg2;
    
    // 运算符“Complex.operator <(Complex, Complex)”要求也要定义匹配的运算符“>”
    public static bool operator > (Complex c1, Complex c2) 
    
       int norm1=Norm(c1);
       int norm2=Norm(c2);
       double arg1=Math.Atan2(c1.imaginary,c1.real);
       double arg2=Math.Atan2(c2.imaginary,c2.real);
       double pi=Math.Atan2(0,-1);
       if(arg1<0)
           arg1+=2*pi;
       if(arg2<0)
           arg2+=2*pi;
       if(norm1!=norm2)
           return norm1>norm2;
       else
           return arg1>arg2;
        
    public static int Norm(Complex a)
    
     return (a.real*a.real+a.imaginary*a.imaginary);
    
    public static bool divide(Complex a,Complex b,out Complex q,out Complex r)
    
      q=a/b;
      r=a-q*b;
      bool bret=(r.real==0 && r.imaginary==0);
      return bret;
    
    static void swap(ref Complex a,ref Complex b)
    
        Complex t=a;
        a=b;
        b=t;
        
    public static Complex gcd(Complex a,Complex b)
    
     Complex x = a, y = b;
     if(Norm(x)<Norm(y) )
    
      swap(ref x,ref y);
    
     while(y.real!=0 || y.imaginary!=0)
      Complex q,r;
      bool ret=divide(x,y,out q,out r);
      x = y;
      y = r;
    
     return x;
    
    public static Complex extended_gcd(Complex a,Complex b,out Complex x,out Complex y)
    
     Complex aa = a, bb = b;
     bool swapped = false;
     if(Norm(aa)<Norm(bb) )
    
      swap(ref aa,ref bb);
      swapped = true;
    
     Complex xx = new Complex(0,0);
     Complex lx = new Complex(1,0);
     Complex yy = new Complex(1,0);
     Complex ly = new Complex(0,0); 
     do
    
      Complex qq, rr;
      bool bret=divide(aa, bb,out qq,out rr);
      aa = bb;
      bb = rr;
      Complex tx = lx-qq*xx;
      lx = xx;
      xx = tx;
      Complex ty = ly-qq*yy;
      ly = yy;
      yy = ty;
     while(bb.real!=0 || bb.imaginary!=0);
     x = lx;
     y = ly;
     if (swapped)
    
      swap(ref x,ref y);
    
     return aa;
        
    // Override the ToString method to display an complex number in the suitable format:      
    public override string ToString()      
              
        return (String.Format("0 + 1i", real, imaginary));      
    

public class numtheory

    public static bool IsPrime(uint N)
    
        if(N==0||N==1)
            return false;
        int up=Convert.ToInt32(Math.Sqrt((double)N));
        for(int i=2;i<=up;i++)
        
            if(N%i==0)
                return false;
        
        return true;
    
    
    /*
        高斯整数a+bi是素数当且仅当:
        1)a、b中有一个是零,另一个数的绝对值是形如4n+3的素数;
        2)a、b均不为零,而a^2+b^2为素数;
    */
    public static bool IsPrime(Complex N)
    
        int a=Math.Abs(N.real);
        int b=Math.Abs(N.imaginary);        
        if(a==0 && (b+1)%4==0)
            return true;
        if(b==0 && (a+1)%4==0)
            return true;
        if(a*b>0 && IsPrime(Convert.ToUInt32(a*a+b*b)))
            return true;
        return false;
        
    
    public static string is_gausian_prime(bool bret)
    
        string strDes=(bret?"是高斯素数":"不是高斯素数");
        return strDes;
        
    
    public static void QSort(List<Complex> arr,int startPos,int endPos)  
      
        Complex z=arr[startPos];  
        int i=startPos;  
        int j=endPos;  
        while(i<j)  
          
            while(arr[j]>z && i<j)
                --j;
            arr[i]=arr[j];  
            while(arr[i]<z && i<j)
                ++i;
            arr[j]=arr[i];  
          
        arr[i]=z;  
        if(i-1>startPos)
            QSort(arr,startPos,i-1);  
        if(endPos>i+1)
            QSort(arr,i+1,endPos);  
        
    
    public static void BubbleSort(List<Complex> a) 
     
         int n=a.Count;
         for(int i=n-1,change=1;i>=1 && change==1;i--) 
          
            change=0; 
            for(int j=0;j<i;j++) 
                if(a[j]>a[j+1]) 
                 
                    Complex temp=a[j]; 
                    a[j]=a[j+1]; 
                    a[j+1]=temp; 
                    change=1; 
                 
          
        
    
    // 范数不超过N的高斯整数
    public static List<Complex> lessN(int N) 
     
        List<Complex> L=new List<Complex>();
        int n=Convert.ToInt32(Math.Sqrt((double)N));
        for(int i=-n;i<=n;i++)
            for(int j=-n;j<=n;j++)
            
                 Complex a;
                 a.real=i;
                 a.imaginary=j;         
                 L.Add(a);
            
        //L.Sort();
        //QSort(L,0,L.Count-1);
        BubbleSort(L);
        return L; 
        

public class ComplexTest

    static void Main(string[] args)  
          
        Complex num1 = new Complex(471,643);      
        Complex num2 = new Complex(9,11);       
        //Add two Complex objects (num1 and num2) through the overloaded plus operator:      
        Complex sum_Add = num1 + num2;      
        Complex sum_Minus = num1 - num2;      
        Complex sum_Product = num1 * num2;      
        Complex sum_Divide = num1 / num2;  
        //Complex q=new Complex();
        //Complex r=new Complex();
        Complex q,r;        
        bool b=Complex.divide(num1,num2,out q,out r);
        //Print the numbers and the Result using the overriden ToString method:      
        Console.WriteLine("First complex number:  01", num1,numtheory.is_gausian_prime(numtheory.IsPrime(num1)));      
        Console.WriteLine("Second complex number: 01", num2,numtheory.is_gausian_prime(numtheory.IsPrime(num2)));      
        Console.WriteLine("The sum of the two numbers: 0", sum_Add);      
        Console.WriteLine("The Minus of the two numbers: 0", sum_Minus);      
        Console.WriteLine("The Product of the two numbers: 0", sum_Product);      
        Console.WriteLine("The Divide of the two numbers: 0,b=1,q=2,r=3", sum_Divide,b,q,r);  
        Complex z1;
        z1.real=112;
        z1.imaginary=1;      
        Complex z2=new Complex(-57,79); 
        Complex z3=Complex.gcd(z1,z2);
        Console.WriteLine("gcd(0,1)=2", z1,z2,z3); 
        Complex z5,z6;
        Complex z4=Complex.extended_gcd(z1,z2,out z5,out z6);
        Console.WriteLine("gcd(0,1)=2,z5=3,z6=4", z1,z2,z4,z5,z6); 
        List<Complex> L=numtheory.lessN(10);
        for(int i=0;i<L.Count;i++)
        
            Console.WriteLine("第0个高斯整数是1",i,L[i]);  
        
        Console.ReadLine(); 
    

以上是关于高斯整数C#版本的主要内容,如果未能解决你的问题,请参考以下文章

高斯整数环学习心得随笔及其实现

高斯整数环学习心得随笔及其实现

信号图像Matlab如何得到高斯滤波器的整数模板

matlab如何产生服从高斯分布的随机整数

高斯消元模板,整数(数学)

信号图像Matlab如何得到高斯滤波器的整数模板