Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Complex
- {
- private double a;
- private double b;
- public static Complex i = new Complex(0, 1);
- public Complex(double a, double b)
- {
- this.a = a;
- this.b = b;
- }
- public static Complex operator +(Complex z1, Complex z2)
- {
- return new Complex(z1.a + z2.a, z1.b + z2.b);
- }
- public static Complex operator -(Complex z1, Complex z2)
- {
- return new Complex(z1.a - z2.a, z1.b - z2.b);
- }
- public static Complex operator *(Complex z1, Complex z2)
- {
- double arg1 = z1.Arg(), arg2 = z2.Arg();
- double r1 = z1.Abs(), r2 = z2.Abs();
- double a = r1 * r2 * Math.Cos(radian(arg1 + arg2));
- double b = r1 * r2 * Math.Sin(radian(arg1 + arg2));
- return new Complex(a, b);
- }
- public static Complex operator /(Complex z1, Complex z2)
- {
- double r1 = z1.Abs(), r2 = z2.Abs();
- double arg1 = z1.Arg(), arg2 = z2.Arg();
- double a = r1 / r2 * Math.Cos(radian(arg1 - arg2));
- double b = r1 / r2 * Math.Sin(radian(arg1 - arg2));
- return new Complex(a, b);
- }
- public static Complex Pow(Complex z, uint n)
- {
- double arg = z.Arg(), r = z.Abs();
- double a = Math.Pow(r, n) * Math.Cos(radian(n * arg));
- double b = Math.Pow(r, n) * Math.Sin(radian(n * arg));
- return new Complex(a, b);
- }
- public static Complex[] Root(Complex z, uint n)
- {
- Complex[] roots = new Complex[n];
- double a, b, r = z.Abs(), arg = z.Arg();
- for (int k = 0; k <= n - 1; k++)
- {
- a = Math.Pow(r, 1.0 / n) * Math.Cos(radian((arg + 360 * k) / n));
- b = Math.Pow(r, 1.0 / n) * Math.Sin(radian((arg + 360 * k) / n));
- roots[k] = new Complex(a, b);
- }
- return roots;
- }
- public static implicit operator Complex(double d)
- {
- return new Complex(d, 0);
- }
- public static Complex Cis(double degrees)
- {
- double angle_r = radian(degrees);
- return new Complex(Math.Cos(angle_r), Math.Sin(angle_r));
- }
- public override string ToString()
- {
- string realPart = ((a != 0) ? a + "" : null);
- string imaginaryPart_i = ((a != 0 && b > 0) ? "+" : null) + b + "i";
- if (b == 1) imaginaryPart_i = ((a != 0) ? "+" : null) + "i";
- else if (b == -1) imaginaryPart_i = "-i";
- else if (b == 0) imaginaryPart_i = "";
- if (a == 0 && b == 0)
- return "0";
- return realPart + imaginaryPart_i;
- }
- public string Polar()
- {
- double arg = Arg();
- return Abs() + "(cos(" + arg + ")+i*sin(" + arg + "))";
- }
- public Complex Conjugate()
- {
- return new Complex(a, -b);
- }
- public double Abs()
- {
- return Math.Sqrt(a * a + b * b);
- }
- public double Arg()
- {
- double arg = Math.Atan(b / a) * 180 / Math.PI;
- if (a < 0 && b >= 0)
- arg += 180;
- else if (a < 0 && b < 0)
- arg -= 180;
- else if (a == 0 && b > 0)
- arg = 90;
- else if (a == 0 && b < 0)
- arg = -90;
- return arg;
- }
- public static double Re(Complex z)
- {
- return z.a;
- }
- public static double Im(Complex z)
- {
- return z.b;
- }
- private static double radian(double degrees)
- {
- return degrees * Math.PI / 180;
- }
- }
Add Comment
Please, Sign In to add comment