解析


複素数クラスの実装です。複素数同士の演算も定義しています。

		
/// <summary>複素数クラス</summary>
public class Complex
{
  /// <summary>実部</summary>
  public double Real
  {
    get
    {
      return _dReal;
    }
    set
    {
      _dReal = value;
    }
  }
  /// <summary>虚部</summary>
  public double Imaginary
  {
    get
    {
      return _dImaginary;
    }
    set
    {
      _dImaginary = value;
    }
  }
  private double _dReal;
  private double _dImaginary;

  /// <summary>コンストラクタ(原点)</summary>
  public Complex()
  {
    _dReal = 0.0;
    _dImaginary = 0.0;
  }

  /// <summary>コンストラクタ</summary>
  /// <param name="dReal">実部</param>
  /// <param name="dImaginary">虚部</param>
  public Complex( double dReal, double dImaginary )
  {
    _dReal = dReal;
    _dImaginary = dImaginary;
  }

  /// <summary>クローン作成</summary>
  /// <returns>クローン</returns>
  public virtual Complex Clone()
  {
    return ( Complex )this.MemberwiseClone();
  }
  /// <summary>
  /// ハッシュコード取得
  /// </summary>
  /// <returns>ハッシュコード</returns>
  public override int GetHashCode()
  {
    return ( _dReal.GetHashCode() ^ _dImaginary.GetHashCode() );
  }
  /// <summary>ToString</summary>
  public override string ToString()
  {
    if( _dImaginary >= 0 )
    {
      return "(" + _dReal.ToString() + ", i" + _dImaginary.ToString() + ")";
    }
    else
    {
      return "(" + _dReal.ToString() + ", -i" + ( ( -1 ) * _dImaginary ).ToString() + ")";
    }
  }
  public override bool Equals( object o )
  {
    if( o is Complex )
    {
      Complex c = ( Complex )o;
      return ( this == c );
    }
    return false;
  }


  /// <summary>Argument</summary>
  /// <returns></returns>
  public double GetArgument()
  {
    return ( double )Math.Atan2( _dReal, _dImaginary );
  }
  /// <summary>共役</summary>
  /// <returns></returns>
  public Complex GetConjugate()
  {
    return new Complex( _dReal, - _dImaginary );
  }
  /// <summary>2乗</summary>
  /// <returns></returns>
  public Complex GetSquare()
  {
    return new Complex( _dReal * _dReal - _dImaginary * _dImaginary, 2 * _dReal * _dImaginary );
  }
  /// <summary>モジュラス(絶対値)(大きさ)</summary>
  /// <returns></returns>
  public double GetModulus()
  {
    return Math.Sqrt( GetSquareModulus() );
  }

  /// <summary>絶対値の乗(大きさ)</summary>
  /// <returns></returns>
  public double GetSquareModulus()
  {
    return _dReal * _dReal + _dImaginary * _dImaginary;
  }
  /// <summary>規格化値取得</summary>
  public Complex GetNormalize()
  {
    double dModulus = this.GetModulus();
    if( dModulus == 0 )
    {
      // 0レングスのため規格化不可能
      return null;
    }
    return new Complex( _dReal / dModulus, _dImaginary / dModulus );
  }
  /// <summary>規格化</summary>
  public bool Normalize()
  {
    double dModulus = this.GetModulus();
    if( dModulus == 0 )
    {
      // 0レングスのため規格化不可能
      return false;
    }
    _dReal /= dModulus;
    _dImaginary /= dModulus;
    return true;
  }

  /// <summary>加算</summary>
  /// <param name="dat1"></param>
  /// <param name="dat2"></param>
  /// <returns></returns>
  public static Complex operator +( Complex dat1, Complex dat2 )
  {
    Complex ret = ( Complex )dat1.Clone();
    ret.Real += dat2.Real;
    ret.Imaginary += dat2.Imaginary;
    return ret;
  }
  /// <summary>加算</summary>
  /// <param name="dat1"></param>
  /// <param name="dat2"></param>
  /// <returns></returns>
  public static Complex operator +( Complex dat1, double dat2 )
  {
    Complex ret = ( Complex )dat1.Clone();
    ret.Real += dat2;
    ret.Imaginary += dat2;
    return ret;
  }
  /// <summary>減算</summary>
  /// <param name="dat1"></param>
  /// <param name="dat2"></param>
  /// <returns></returns>
  public static Complex operator -( Complex dat1, Complex dat2 )
  {
    Complex ret = ( Complex )dat1.Clone();
    ret.Real -= dat2.Real;
    ret.Imaginary -= dat2.Imaginary;
    return ret;
  }
  /// <summary>減算</summary>
  /// <param name="dat1"></param>
  /// <param name="dat2"></param>
  /// <returns></returns>
  public static Complex operator -( Complex dat1, double dat2 )
  {
    Complex ret = ( Complex )dat1.Clone();
    ret.Real -= dat2;
    ret.Imaginary -= dat2;
    return ret;
  }
  /// <summary>乗算</summary>
  /// <param name="dat1"></param>
  /// <param name="dat2"></param>
  /// <returns></returns>
  public static Complex operator *( Complex dat1, Complex dat2 )
  {
    double dReal = dat1.Real * dat2.Real - dat1.Imaginary * dat2.Imaginary;
    double dImaginary = dat1.Real * dat2.Imaginary + dat1.Imaginary * dat2.Real;
    return new Complex( dReal, dImaginary );
  }
  /// <summary>乗算</summary>
  /// <param name="dat1"></param>
  /// <param name="dat2"></param>
  /// <returns></returns>
  public static Complex operator *( Complex dat1, double dat2 )
  {
    Complex ret = ( Complex )dat1.Clone();
    ret.Real *= dat2;
    ret.Imaginary *= dat2;
    return ret;
  }
  /// <summary>除算</summary>
  /// <param name="dat1"></param>
  /// <param name="dat2"></param>
  /// <returns></returns>
  public static Complex operator /( Complex dat1, double dat2 )
  {
    Complex ret = ( Complex )dat1.Clone();
    ret.Real /= dat2;
    ret.Imaginary /= dat2;
    return ret;
  }
  /// <summary>比較</summary>
  /// <param name="dat1"></param>
  /// <param name="dat2"></param>
  /// <returns></returns>
  public static bool operator ==( Complex dat1, Complex dat2 )
  {
    return ( dat1.Real == dat2.Real ) && ( dat1.Imaginary == dat2.Imaginary );
  }
  public static bool operator !=( Complex dat1, Complex dat2 )
  {
    return !( dat1 == dat2 );
  }

}

		
	


inserted by FC2 system