Hello again, Math nerds, and welcome to my article. Today, I would like to show you how you can do Complex Math and work with Complex Numbers in VB.NET and in C# with the use of Operator overriding and built-in Numerics namespaces.

## Complex Numbers

Complex Numbers are numbers that can be expressed in the following form:

a + bi

In this equation, a and b are real numbers, whereas i is a solution of the equation x2 = −1. This is called an *imaginary number* because there is no real number that satisfies the given equation. *Imaginary* numbers are regarded as just as *real* as the real numbers in mathematical science. Complex numbers give rise to the fundamental theorem of algebra, meaning: Every non-constant polynomial equation with complex coefficients has a complex solution.

Complex numbers can be applied in a variety of scientific and related areas, such as:

- Control theory
- Improper integrals
- Fluid dynamics
- Dynamic equations
- Electromagnetism and electrical engineering
- Signal analysis
- Relativity
- Geometry
- Fractals
- Triangles
- Algebraic number theory
- Analytic number theory

## Our Project

Create a new **Console Application** in either VB.NET or C#. Once the project has loaded, add a class named **clsComplexMath**. Edit its constructor to look like the following code segment.

**C#**

float ftReal; float ftImaginary; public clsComplex(float fReal, float fImaginary) { ftReal = fReal; ftImaginary = fImaginary; }

**VB.NET**

Private ftReal As Single Private ftImaginary As Single Public Sub New(ByVal fReal As Single, ByVal fImaginary _ As Single) ftReal = fReal ftImaginary = fImaginary End Sub

ftReal and ftImaginary are fields in this class that represent the Real and Imaginary numbers output through the following Properties. Add the **Properties** now.

**C#**

public float Real { get { return (ftReal); } set { ftReal = value; } } public float Imaginary { get { return (ftImaginary); } set { ftImaginary = value; } }

**VB.NET**

Public Property Real As Single Get Return (ftReal) End Get Set(ByVal value As Single) ftReal = value End Set End Property Public Property Imaginary As Single Get Return (ftImaginary) End Get Set(ByVal value As Single) ftImaginary = value End Set End Property

Now, we need to override basic operators to compensate for Complex numbers.

**C#**

public static clsComplex operator +(clsComplex cOp1, clsComplex cOp2) { return (new clsComplex(cOp1.ftReal + cOp2.ftReal, cOp1.ftImaginary + cOp2.ftImaginary)); } public static clsComplex operator -(clsComplex cOp1, clsComplex cOp2) { return (new clsComplex(cOp1.ftReal - cOp2.ftReal, cOp1.ftImaginary - cOp2.ftImaginary)); } public static clsComplex operator *(clsComplex cOp1, clsComplex cOp2) { return (new clsComplex(cOp1.ftReal * cOp2.ftReal - cOp1.ftImaginary * cOp2.ftImaginary, cOp1.ftReal * cOp2.ftImaginary + cOp2.ftReal * cOp1.ftImaginary)); } public static clsComplex operator /(clsComplex cOp1, clsComplex cOp2) { if ((cOp2.ftReal == 0.0f) && (cOp2.ftImaginary == 0.0f)) throw new DivideByZeroException("Divide By Zero"); float fReal = (cOp1.ftReal * cOp2.ftReal + cOp1.ftImaginary * cOp2.ftImaginary) / (cOp2.ftReal * cOp2.ftReal + cOp2.ftImaginary * cOp2.ftImaginary); float fImaginary = (cOp2.ftReal * cOp1.ftImaginary - cOp1.ftReal * cOp2.ftImaginary) / (cOp2.ftReal * cOp2.ftReal + cOp2.ftImaginary * cOp2.ftImaginary); return (new clsComplex(fReal, fImaginary)); } public static bool operator ==(clsComplex cOp1, clsComplex cOp2) { if ((cOp1.ftReal == cOp2.ftReal) && (cOp1.ftImaginary == cOp2.ftImaginary)) return (true); else return (false); } public static bool operator !=(clsComplex cOp1, clsComplex cOp2) { return (!(cOp1 == cOp2)); }

**VB.NET**

Public Shared Operator +(cOp1 As clsComplex, cOp2 _ As clsComplex) As clsComplex Return (New clsComplex(cOp1.ftReal + cOp2.ftReal, _ cOp1.ftImaginary + cOp2.ftImaginary)) End Operator Public Shared Operator -(cOp1 As clsComplex, cOp2 _ As clsComplex) As clsComplex Return (New clsComplex(cOp1.ftReal - cOp2.ftReal, _ cOp1.ftImaginary - cOp2.ftImaginary)) End Operator Public Shared Operator *(cOp1 As clsComplex, cOp2 As _ clsComplex) As clsComplex Return (New clsComplex(cOp1.ftReal * cOp2.ftReal - _ cOp1.ftImaginary * cOp2.ftImaginary, cOp1.ftReal * _ cOp2.ftImaginary + cOp2.ftReal * cOp1.ftImaginary)) End Operator Public Shared Operator /(cOp1 As clsComplex, cOp2 As _ clsComplex) As clsComplex If ((cOp2.ftReal = 0.0F) And (cOp2.ftImaginary = 0.0F)) Then Throw New DivideByZeroException("Divide By Zero") End If Dim fReal As Single = (cOp1.ftReal * cOp2.ftReal + _ cOp1.ftImaginary * cOp2.ftImaginary) / (cOp2.ftReal * _ cOp2.ftReal + cOp2.ftImaginary * cOp2.ftImaginary) Dim fImaginary As Single = (cOp2.ftReal * _ cOp1.ftImaginary - cOp1.ftReal * cOp2.ftImaginary) / _ (cOp2.ftReal * cOp2.ftReal + cOp2.ftImaginary * _ cOp2.ftImaginary) Return (New clsComplex(fReal, fImaginary)) End Operator Public Shared Operator =(cOp1 As clsComplex, cOp2 As _ clsComplex) As Boolean If ((cOp1.ftReal = cOp2.ftReal) And (cOp1.ftImaginary = _ cOp2.ftImaginary)) Then Return (True) Else Return (False) End If End Operator Public Shared Operator <>(cOp1 As clsComplex, cOp2 As _ clsComplex) As Boolean Return (Not (cOp1 = cOp2)) End Operator

The operators have English counterparts, so that you can use the operators easier in your apps.

**C#**

public static clsComplex Add(clsComplex cOp1, clsComplex cOp2) { return (cOp1 + cOp2); } public static clsComplex Subtract(clsComplex cOp1, clsComplex cOp2) { return (cOp1 - cOp2); } public static clsComplex Multiply(clsComplex cOp1, clsComplex cOp2) { return (cOp1 * cOp2); } public static clsComplex Divide(clsComplex cOp1, clsComplex cOp2) { return (cOp1 / cOp2); } public override bool Equals(object objEq) { clsComplex cOp2 = (clsComplex)objEq; return (this == cOp2); }

**VB.NET**

Public Shared Function Add(cOp1 As clsComplex, cOp2 As _ clsComplex) As clsComplex Return (cOp1 + cOp2) End Function Public Shared Function Subtract(cOp1 As clsComplex, cOp2 As _ clsComplex) As clsComplex Return (cOp1 - cOp2) End Function Public Shared Function Multiply(cOp1 As clsComplex, cOp2 As _ clsComplex) As clsComplex Return (cOp1 * cOp2) End Function Public Shared Function Divide(cOp1 As clsComplex, cOp2 As _ clsComplex) As clsComplex Return (cOp1 / cOp2) End Function Public Overrides Function Equals(objEq As Object) As Boolean Dim cOp2 As clsComplex = DirectCast(objEq, clsComplex) Return (Me = cOp2) End Function

Override the ToString method.

**C#**

public override int GetHashCode() { return (ftReal.GetHashCode() ^ ftImaginary.GetHashCode()); } public override string ToString() { return (String.Format("({0}, {1}i)", ftReal, ftImaginary)); }

**VB.NET**

Public Overrides Function GetHashCode() As Integer Return (ftReal.GetHashCode() ^ ftImaginary.GetHashCode()) End Function Public Overrides Function ToString() As String Return (String.Format("({0}, {1}i)", ftReal, ftImaginary)) End Function

Apply this in your application.

**C#**

public static void Main() { clsComplex cOperand1 = new clsComplex(5, 9); clsComplex cOperand2 = new clsComplex(3, 4); Console.WriteLine("Op1 + Op2 = {0}", cOperand1 + cOperand2); Console.WriteLine("Op1 - Op2 = {0}", cOperand1 - cOperand2); Console.WriteLine("Op1 * Op2 = {0}", cOperand1 * cOperand2); Console.WriteLine("Op1 / Op2 = {0}", cOperand1 / cOperand2); Console.WriteLine("Op1 == Op2: {0}", cOperand1 == cOperand2); Console.WriteLine("Op1 != Op2: {0}", cOperand1 != cOperand2); Console.ReadLine(); }

**VB.NET**

Sub Main() Dim cOperand1 As clsComplex = New clsComplex(5, 9) Dim cOperand2 As clsComplex = New clsComplex(3, 4) Console.WriteLine("Op1 + Op2 = {0}", cOperand1 + cOperand2) Console.WriteLine("Op1 - Op2 = {0}", cOperand1 - cOperand2) Console.WriteLine("Op1 * Op2 = {0}", cOperand1 * cOperand2) Console.WriteLine("Op1 / Op2 = {0}", cOperand1 / cOperand2) Console.WriteLine("Op1 == Op2: {0}", cOperand1 = cOperand2) Console.WriteLine("Op1 != Op2: {0}", cOperand1 <> cOperand2) Console.ReadLine() End Sub

Once run, your resulting screen will look like Figure 1.

**Figure 1:** Running

Conclusion

It is a lot of work getting complex things done, as you can see. Stick around for more Math-based articles! Until then, happy coding.