Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Numerics;
- using Mono.Simd;
- struct SimdComplex {
- public SimdComplex(double r)
- {
- value = new Vector2d(r, 0);
- }
- public SimdComplex(double r, double i)
- {
- value = new Vector2d(r, i);
- }
- public SimdComplex(Vector2d v)
- {
- value = v;
- }
- public static explicit operator Vector2d(SimdComplex rhs)
- {
- return rhs.value;
- }
- public static SimdComplex operator +(SimdComplex left, SimdComplex right)
- {
- Vector2d a_b = left.value, c_d = right.value;
- return new SimdComplex(a_b + c_d);
- }
- public static SimdComplex operator -(SimdComplex left, SimdComplex right)
- {
- Vector2d a_b = left.value, c_d = right.value;
- return new SimdComplex(a_b - c_d);
- }
- public static SimdComplex operator *(SimdComplex left, SimdComplex right)
- {
- Vector2d a_b = left.value, c_d = right.value;
- var c_c = c_d.Duplicate();
- var ac_bc = a_b * c_c;
- var b_a = a_b.Shuffle(a_b, 1);
- var d_d = c_d.InterleaveHigh(c_d);
- var bd_ad = b_a * d_d;
- return new SimdComplex(ac_bc.AddSub(bd_ad));
- }
- public static SimdComplex operator /(SimdComplex left, SimdComplex right)
- {
- Vector2d a_b = left.value, c_d = right.value;
- var b_a = a_b.Shuffle(a_b, 1);
- var c_c = c_d.Duplicate();
- var bc_ac = b_a * c_c;
- var d_d = c_d.InterleaveHigh(c_d);
- var ad_bd = a_b * d_d;
- var t = bc_ac.AddSub(ad_bd); // (bc-ad) + (ac+bd)i
- var numerator = t.Shuffle(t, 1); // (ac+bd) + (bc-ad)i
- var cc_dd = c_d * c_d;
- var denominator = cc_dd.HorizontalAdd(cc_dd); // (cc+dd) + (cc+dd)i
- return new SimdComplex(numerator / denominator);
- }
- double Real {
- get { return this.value.X; }
- set { this.value.X = value; }
- }
- double Imag {
- get { return this.value.Y; }
- set { this.value.Y = value; }
- }
- public override string ToString()
- {
- return string.Format("({0}, {1})", Real, Imag);
- }
- private Vector2d value;
- }
- class MainClass
- {
- public static void Main(string[] args)
- {
- SimdComplex d1 = new SimdComplex(1, 2), d2 = new SimdComplex(3, 4);
- Console.WriteLine(d1 * d2);
- Console.WriteLine(d1 / d2);
- Complex c1 = new Complex(1, 2), c2 = new Complex(3, 4);
- Console.WriteLine(c1 * c2);
- Console.WriteLine(c1 / c2);
- }
- }
- Expected output:
- (-5, 10)
- (0.44, 0.08)
- (-5, 10)
- (0.44, 0.08)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement