MAT3253 Complex Variables

3.2. Absolute value / Modulus🔗

Definition 1.3.5. The modulus of z = a + bi is defined as |z| = \sqrt{a^2 + b^2}. It is also called the absolute value or the magnitude.

In Mathlib, we first define the squared norm by α^2+b^2, and then define the norm as the square root of the squared norm. The API normSq and ‖·‖ are used to refer to the squared norm and the norm respectively. Both of the examples below are true by definition.

example {z:} : normSq z = z.re * z.re + z.im * z.im := z:normSq z = z.re * z.re + z.im * z.im -- By definition, normSq z = z.re^2 + z.im^2 All goals completed! 🐙 example {z:} : z = Real.sqrt (normSq z) := z:z = (normSq z) -- By definition, ‖z‖ = square root of (normSq z) All goals completed! 🐙

Theorem 1.3.6.

(a)

|z|^2 = z z^* for all z \in \mathbb{C}.

(b)

For all z_1, z_2 \in \mathbb{C}, |z_1 z_2| = |z_1|\,|z_2|.

We use a theorem normSq_eq_norm_sq in Mathlib to finish the proof of part (a). In part (b), we use the API abs_of_nonneg.

Complex.normSq_eq_norm_sq (z : ) : normSq z = z ^ 2#check normSq_eq_norm_sq abs_of_nonneg.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] {a : α} [AddLeftMono α] (h : 0 a) : |a| = a#check abs_of_nonneg /-- Theorem 1.3.6, part (a) z z^* = |z|^2 -/ example (z : ) : z * conj z = z ^ 2 := z:z * (starRingEnd ) z = z ^ 2 z:(normSq z) = z ^ 2 -- z (conj z) = normSq z z:(normSq z) = (z ^ 2) z:normSq z = z ^ 2 -- reduce to show: normSq z = ‖z‖^2 All goals completed! 🐙 /-- Theorem 1.3.6, part (b) |z₁ z₂| = |z₁| |z₂| -/ -- detailed proof example (z₁ z₂ : ) : z₁ * z₂ = z₁ * z₂ := z₁:z₂:z₁ * z₂ = z₁ * z₂ -- Since norms are non-negative, x = |x|. -- Rewrite the goal A = B to |A| = |B| z₁:z₂:|z₁ * z₂| = z₁ * z₂ z₁:z₂:|z₁ * z₂| = |z₁ * z₂| -- Apply the API: |A| = |B| ↔ A^2 = B^2 z₁:z₂:z₁ * z₂ ^ 2 = (z₁ * z₂) ^ 2 -- To prove real x = y, it suffices to prove ↑x = ↑y z₁:z₂:(z₁ * z₂ ^ 2) = ((z₁ * z₂) ^ 2) -- Switch to Complex numbers to use conjugate properties z₁:z₂:z₁ * z₂ ^ 2 = (z₁ * z₂) ^ 2 -- Finish the proof by calculations calc (z₁ * z₂ : ) ^ 2 _ = (z₁ * z₂) * conj (z₁ * z₂) := z₁:z₂:z₁ * z₂ ^ 2 = z₁ * z₂ * (starRingEnd ) (z₁ * z₂) All goals completed! 🐙 _ = (z₁ * z₂) * (conj z₁ * conj z₂) := z₁:z₂:z₁ * z₂ * (starRingEnd ) (z₁ * z₂) = z₁ * z₂ * ((starRingEnd ) z₁ * (starRingEnd ) z₂) All goals completed! 🐙 _ = (z₁ * conj z₁) * (z₂ * conj z₂) := z₁:z₂:z₁ * z₂ * ((starRingEnd ) z₁ * (starRingEnd ) z₂) = z₁ * (starRingEnd ) z₁ * (z₂ * (starRingEnd ) z₂) All goals completed! 🐙 _ = (z₁ : )^2 * (z₂ : )^2 := z₁:z₂:z₁ * (starRingEnd ) z₁ * (z₂ * (starRingEnd ) z₂) = z₁ ^ 2 * z₂ ^ 2 All goals completed! 🐙 _ = (z₁ * z₂ : ) ^ 2 := z₁:z₂:z₁ ^ 2 * z₂ ^ 2 = (z₁ * z₂) ^ 2 All goals completed! 🐙;

The multiplicative property of norm is already proof in Mathlib as norm_mul. We can use this to give a more concise proof.

example (z₁ z₂ : ) : z₁ * z₂ = z₁ * z₂ := -- prove by using existing api in Mathlib z₁:z₂:z₁ * z₂ = z₁ * z₂ All goals completed! 🐙

Although the triangle inequality is geometrically clear, we give an algebraic proof to show its compatibility with complex arithmetic.

Theorem 1.3.7. (Triangle inequality) For any z_1, z_2 \in \mathbb{C},

|z_1 + z_2| \le |z_1| + |z_2|.

/-- Theorem 1.3.7 Triangle inequality |z₁+z₂| ≤ |z₁| + |z₂| -/ example (z₁ z₂ : ) : z₁ + z₂ z₁ + z₂ := z₁:z₂:z₁ + z₂ z₁ + z₂ -- Since norms are non-negative, x = |x|. -- rewrite the goal A = B to |A| = |B|, -- so the lemma matches. z₁:z₂:|z₁ + z₂| z₁ + z₂ z₁:z₂:|z₁ + z₂| |z₁ + z₂| -- Apply the API: |A| = |B| ↔ A^2 = B^2 z₁:z₂:z₁ + z₂ ^ 2 (z₁ + z₂) ^ 2 have h : z₁ + z₂ ^ 2 = z₁^2 + z₂^2 + 2 * (z₁ * conj z₂).re := z₁:z₂:z₁ + z₂ z₁ + z₂ -- Convert Norm^2 to Real Part of (z * conj z) z₁:z₂:normSq (z₁ + z₂) = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).re z₁:z₂:(↑(normSq (z₁ + z₂))).re = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).re z₁:z₂:((z₁ + z₂) * (starRingEnd ) (z₁ + z₂)).re = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).re z₁:z₂:((z₁ + z₂) * ((starRingEnd ) z₁ + (starRingEnd ) z₂)).re = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).re z₁:z₂:(z₁ * (starRingEnd ) z₁ + z₁ * (starRingEnd ) z₂ + z₂ * (starRingEnd ) z₁ + z₂ * (starRingEnd ) z₂).re = z₁ ^ 2 + z₂ ^ 2 + (z₁ * (starRingEnd ) z₂).re * 2 -- Expand: z1z1* + z1z2* + z2z1* + z2z2* -- Distribute `re` across the addition z₁:z₂:(z₁ * (starRingEnd ) z₁ + z₁ * (starRingEnd ) z₂ + z₂ * (starRingEnd ) z₁).re + (z₂ * (starRingEnd ) z₂).re = z₁ ^ 2 + z₂ ^ 2 + (z₁ * (starRingEnd ) z₂).re * 2 -- Convert (z * conj z).re back to ‖z‖^2 -- We do this for z1 and z2. -- The sequence is: (z * conj z).re -> -- (normSq z).re -> normSq z -> ‖z‖^2 z₁:z₂:((z₁ ^ 2) + z₁ * (starRingEnd ) z₂ + z₂ * (starRingEnd ) z₁).re + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + (z₁ * (starRingEnd ) z₂).re * 2 z₁:z₂:(↑(z₁ ^ 2)).re + (z₁ * (starRingEnd ) z₂).re + (z₂ * (starRingEnd ) z₁).re + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + (z₁ * (starRingEnd ) z₂).re * 2 -- Key step: z2 * z1* is the conjugate of z1 * z2* -- they have the same Real part. z₁:z₂:z₁ ^ 2 + (z₁ * (starRingEnd ) z₂).re + (z₂ * (starRingEnd ) z₁).re + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + (z₁ * (starRingEnd ) z₂).re * 2 -- Simplify the conjugate term: -- conj(z2 * conj z1) -> z1 * conj z2 z₁:z₂:z₁ ^ 2 + (z₁ * (starRingEnd ) z₂).re + ((starRingEnd ) (z₂ * (starRingEnd ) z₁)).re + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + (z₁ * (starRingEnd ) z₂).re * 2 -- Simplify Re(↑‖z1‖^2) to ‖z1‖^2 z₁:z₂:z₁ ^ 2 + ((starRingEnd ) z₂ * z₁).re + ((starRingEnd ) z₂ * z₁).re + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + ((starRingEnd ) z₂ * z₁).re * 2 -- the rest is algebra All goals completed! 🐙 calc z₁ + z₂ ^ 2 _ = z₁^2 + z₂^2 + 2 * (z₁ * conj z₂).re := z₁:z₂:h:z₁ + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).rez₁ + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).re All goals completed! 🐙 -- Apply Inequality: Re(w) <= |w| _ z₁^2 + z₂^2 + 2 * z₁ * conj z₂ := z₁:z₂:h:z₁ + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).rez₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).re z₁ ^ 2 + z₂ ^ 2 + 2 * z₁ * (starRingEnd ) z₂ z₁:z₂:h:z₁ + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).re(z₁ * (starRingEnd ) z₂).re z₁ * (starRingEnd ) z₂ -- 1. Strips away the common terms All goals completed! 🐙 -- 2. Applies Re(w) ≤ ‖w‖ -- Break product |z1 z2*| = |z1| |z2| _ = z₁^2 + z₂^2 + 2 * (z₁ * conj z₂) := z₁:z₂:h:z₁ + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).rez₁ ^ 2 + z₂ ^ 2 + 2 * z₁ * (starRingEnd ) z₂ = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂) All goals completed! 🐙 _ = z₁^2 + z₂^2 + 2 * z₁ * (conj z₂) := z₁:z₂:h:z₁ + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).rez₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂) = z₁ ^ 2 + z₂ ^ 2 + 2 * z₁ * (starRingEnd ) z₂ All goals completed! 🐙 _ = z₁^2 + z₂^2 + 2 * z₁ * (z₂) := z₁:z₂:h:z₁ + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).rez₁ ^ 2 + z₂ ^ 2 + 2 * z₁ * (starRingEnd ) z₂ = z₁ ^ 2 + z₂ ^ 2 + 2 * z₁ * z₂ All goals completed! 🐙 -- Factor perfect square _ = (z₁ + z₂) ^ 2 := z₁:z₂:h:z₁ + z₂ ^ 2 = z₁ ^ 2 + z₂ ^ 2 + 2 * (z₁ * (starRingEnd ) z₂).rez₁ ^ 2 + z₂ ^ 2 + 2 * z₁ * z₂ = (z₁ + z₂) ^ 2 All goals completed! 🐙 example (z₁ z₂ : ) : z₁ + z₂ z₁ + z₂ := -- proof of triangle inequality using existing theorem z₁:z₂:z₁ + z₂ z₁ + z₂ All goals completed! 🐙

Example. Using the identity |z_1 z_2| = |z_1| |z_2| and mathematical induction to show that |z^n| = |z|^n, for n=1,2,3,\ldots.

We prove this for all natural numbers n (0, 1, 2, \ldots), which implies the case for n = 1, 2, 3, \ldots.

example (z : ) (n : ) : z^n = z ^ n := z:n:z ^ n = z ^ n -- We proceed by induction on n induction n with z:z ^ 0 = z ^ 0 -- Base Case: n = 0 -- Goal: |z^0| = |z|^0 -- Since z^0 = 1 and x^0 = 1, we show |1| = 1 All goals completed! 🐙 -- solved by simplification z:n:ih:z ^ n = z ^ nz ^ (n + 1) = z ^ (n + 1) -- Inductive Step: Assume true for n, prove for n + 1 -- ih (Inductive Hypothesis): abs (z ^ n) = (abs z) ^ n calc z ^ (n + 1) = z ^ n * z := z:n:ih:z ^ n = z ^ nz ^ (n + 1) = z ^ n * z All goals completed! 🐙 -- Definition of power _ = z^n * z -- Use the specific identity |z1 z2| = |z1| |z2| := z:n:ih:z ^ n = z ^ nz ^ n * z = z ^ n * z All goals completed! 🐙 _ = z ^ n * z -- Apply Induction Hypothesis := z:n:ih:z ^ n = z ^ nz ^ n * z = z ^ n * z All goals completed! 🐙 _ = z ^ (n + 1) -- Definition of power (in reverse) := z:n:ih:z ^ n = z ^ nz ^ n * z = z ^ (n + 1) All goals completed! 🐙

Example. Show that three points z₁, z₂ and z₃ on the complex plane form an equilateral triangle if and only if they satisfy

z₁^2 + z₂^2 + z₃^2 = z₁*z₂ + z₂*z₃ + z₃*z₁.

z₁, z₂ and z₃ are the vertices of a equilateral triangle if and only if

‖z₁ - z₂‖^2 = ‖z₂ - z₃‖^2 = ‖z₃ - z₁‖^2.

example (z₁ z₂ z₃ : ) : z₁ - z₂^2 = z₂ - z₃^2 z₂ - z₃^2 = z₃ - z₁^2 z₁^2 + z₂^2 + z₃^2 = z₁*z₂ + z₂*z₃ + z₃*z₁ := z₁:z₂:z₃:z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁ z₁:z₂:z₃:z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁z₁:z₂:z₃:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁ z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2; z₁:z₂:z₃:z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁ z₁:z₂:z₃:h_contra:¬(z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁)False; -- Let $w = \frac{z_1 - z_2}{z_2 - z_3}$. -- Then $|w| = 1$ and $|w + 1| = 1$. z₁:z₂:z₃:h_contra:¬(z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁)w: := (z₁ - z₂) / (z₂ - z₃)False have hw : w = 1 w + 1 = 1 := z₁:z₂:z₃:z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁ z₁:z₂:z₃:h_contra:¬(z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁)w: := (z₁ - z₂) / (z₂ - z₃)h₂:z₂ - z₃ = 0w = 1 w + 1 = 1z₁:z₂:z₃:h_contra:¬(z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁)w: := (z₁ - z₂) / (z₂ - z₃)h₂:¬z₂ - z₃ = 0w = 1 w + 1 = 1 z₁:z₂:z₃:h_contra:¬(z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁)w: := (z₁ - z₂) / (z₂ - z₃)h₂:z₂ - z₃ = 0w = 1 w + 1 = 1z₁:z₂:z₃:h_contra:¬(z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁)w: := (z₁ - z₂) / (z₂ - z₃)h₂:¬z₂ - z₃ = 0w = 1 w + 1 = 1 z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₃ - z₁ * z₃ - z₁ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ - z₃ = 0w = 1 w + 1 = 1; z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ = 0 z₃ - z₁ = 0 ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:z₂ - z₃ = 0w = 1 w + 1 = 1 All goals completed! 🐙; z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₃ - z₁ * z₃ - z₁ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ - z₃ = 0w = 1 w + 1 = 1 z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₃ - z₁ * z₃ - z₁ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ - z₃ = 0z₁ - z₂ / z₂ - z₃ = 1 (z₁ - z₂ + (z₂ - z₃)) / (z₂ - z₃) = 1z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₃ - z₁ * z₃ - z₁ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ - z₃ = 0z₂ - z₃ 0 z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₃ - z₁ * z₃ - z₁ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ - z₃ = 0z₁ - z₂ / z₂ - z₃ = 1 (z₁ - z₂ + (z₂ - z₃)) / (z₂ - z₃) = 1z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₃ - z₁ * z₃ - z₁ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ - z₃ = 0z₂ - z₃ 0 All goals completed! 🐙; z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₃ - z₁ * z₃ - z₁ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ = z₃z₁ - z₂ / z₂ - z₃ = 1z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₃ - z₁ * z₃ - z₁ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ = z₃z₁ - z₃ / z₂ - z₃ = 1 z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₃ - z₁ * z₃ - z₁ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ = z₃z₁ - z₂ / z₂ - z₃ = 1 z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₃ - z₁ * z₃ - z₁ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ = z₃z₁ - z₂ = 1 * z₂ - z₃ ; All goals completed! 🐙 z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₃ - z₁ * z₃ - z₁ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ = z₃z₁ - z₃ / z₂ - z₃ = 1 z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₃ - z₁ * z₃ - z₁ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ = z₃z₁ - z₃ = 1 * z₂ - z₃ ; z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:z₁ - z₂ * z₁ - z₂ = z₂ - z₃ * z₂ - z₃ z₂ - z₃ * z₂ - z₃ = z₁ - z₃ * z₁ - z₃ ¬z₁ * z₁ + z₂ * z₂ + z₃ * z₃ = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h₂:¬z₂ = z₃z₁ - z₃ = 1 * z₂ - z₃; All goals completed! 🐙 -- Since $|w| = 1$ and $|w + 1| = 1$, -- we have $w^2 + w + 1 = 0$. have hw_eq : w^2 + w + 1 = 0 := z₁:z₂:z₃:z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁ z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)h_contra:((z₁.re - z₂.re) * (z₁.re - z₂.re) + (z₁.im - z₂.im) * (z₁.im - z₂.im)) = ((z₂.re - z₃.re) * (z₂.re - z₃.re) + (z₂.im - z₃.im) * (z₂.im - z₃.im)) ((z₂.re - z₃.re) * (z₂.re - z₃.re) + (z₂.im - z₃.im) * (z₂.im - z₃.im)) = ((z₃.re - z₁.re) * (z₃.re - z₁.re) + (z₃.im - z₁.im) * (z₃.im - z₁.im)) ¬z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁hw:w.re * w.re + w.im * w.im = 1 (w.re + 1) * (w.re + 1) + w.im * w.im = 1w ^ 2 + w + 1 = 0; z₁:z₂:z₃:w: := (z₁ - z₂) / (z₂ - z₃)hw:w.re * w.re + w.im * w.im = 1 (w.re + 1) * (w.re + 1) + w.im * w.im = 1h_contra:((z₁.re - z₂.re) * (z₁.re - z₂.re) + (z₁.im - z₂.im) * (z₁.im - z₂.im)) = ((z₂.re - z₃.re) * (z₂.re - z₃.re) + (z₂.im - z₃.im) * (z₂.im - z₃.im)) ((z₂.re - z₃.re) * (z₂.re - z₃.re) + (z₂.im - z₃.im) * (z₂.im - z₃.im)) = ((z₃.re - z₁.re) * (z₃.re - z₁.re) + (z₃.im - z₁.im) * (z₃.im - z₁.im)) (z₁.re * z₁.re - z₁.im * z₁.im + (z₂.re * z₂.re - z₂.im * z₂.im) + (z₃.re * z₃.re - z₃.im * z₃.im) = z₁.re * z₂.re - z₁.im * z₂.im + (z₂.re * z₃.re - z₂.im * z₃.im) + (z₃.re * z₁.re - z₃.im * z₁.im) ¬z₁.re * z₁.im + z₁.im * z₁.re + (z₂.re * z₂.im + z₂.im * z₂.re) + (z₃.re * z₃.im + z₃.im * z₃.re) = z₁.re * z₂.im + z₁.im * z₂.re + (z₂.re * z₃.im + z₂.im * z₃.re) + (z₃.re * z₁.im + z₃.im * z₁.re))w.re * w.re - w.im * w.im + w.re + 1 = 0 w.re * w.im + w.im * w.re + w.im = 0; All goals completed! 🐙; All goals completed! 🐙; z₁:z₂:z₃:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁ z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁:z₂:z₃:h:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 have h_eq : (z₁-z₂)^2 + (z₂-z₃)^2 + (z₃-z₁)^2 = 0 := z₁:z₂:z₃:z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁ All goals completed! 🐙; -- From h_eq, deduce that $(z₁ - z₂) = (z₂ - z₃)\omega$ -- or $(z₁ - z₂) = (z₂ - z₃)\omega^2$, -- where $\omega$ is a primitive cube root of unity. have h_cases : (z₁ - z₂) = (z₂ - z₃) * (-1 / 2 + Complex.I * (Real.sqrt 3 / 2)) (z₁ - z₂) = (z₂ - z₃) * (-1 / 2 - Complex.I * (Real.sqrt 3 / 2)) := z₁:z₂:z₃:z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁ exact Classical.or_iff_not_imp_left.2 fun h =>mul_left_cancel₀ ( sub_ne_zero_of_ne h ) <| z₁:z₂:z₃:h✝:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h_eq:(z₁ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - z₁) ^ 2 = 0h:¬z₁ - z₂ = (z₂ - z₃) * (-1 / 2 + I * (3 / 2))(z₁ - z₂ - (z₂ - z₃) * (-1 / 2 + I * (3 / 2))) * (z₁ - z₂) = (z₁ - z₂ - (z₂ - z₃) * (-1 / 2 + I * (3 / 2))) * ((z₂ - z₃) * (-1 / 2 - I * (3 / 2))) z₁:z₂:z₃:h✝:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h_eq:(z₁ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - z₁) ^ 2 = 0h:¬z₁ - z₂ = (z₂ - z₃) * (-1 / 2 + I * (3 / 2))z₁ * z₂ * (-3 / 2) + z₁ * z₂ * I * 3 * (-1 / 2) + z₁ * z₃ * (-1 / 2) + z₁ * z₃ * I * 3 * (1 / 2) + z₁ ^ 2 + z₂ * z₃ * (1 / 2) + z₂ * z₃ * I * 3 * (-1 / 2) + z₂ ^ 2 * (1 / 2) + z₂ ^ 2 * I * 3 * (1 / 2) = z₁ * z₂ * (-1 / 2) + z₁ * z₂ * I * 3 * (-1 / 2) + z₁ * z₃ * (1 / 2) + z₁ * z₃ * I * 3 * (1 / 2) + z₂ * z₃ * I * 3 * (-1 / 2) + z₂ * z₃ * I ^ 2 * 3 ^ 2 * (-1 / 2) + z₂ ^ 2 * (1 / 4) + z₂ ^ 2 * I * 3 * (1 / 2) + z₂ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 4) + z₃ ^ 2 * (-1 / 4) + z₃ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 4); z₁:z₂:z₃:h✝:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h_eq:(z₁ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - z₁) ^ 2 = 0h:¬z₁ - z₂ = (z₂ - z₃) * (-1 / 2 + I * (3 / 2))-(z₁ * z₂ * (3 / 2)) + -(z₁ * z₂ * I * 3 * (1 / 2)) + -(z₁ * z₃ * (1 / 2)) + z₁ * z₃ * I * 3 * (1 / 2) + z₁ ^ 2 + z₂ * z₃ * (1 / 2) + -(z₂ * z₃ * I * 3 * (1 / 2)) + z₂ ^ 2 * (1 / 2) + z₂ ^ 2 * I * 3 * (1 / 2) = -(z₁ * z₂ * (1 / 2)) + -(z₁ * z₂ * I * 3 * (1 / 2)) + z₁ * z₃ * (1 / 2) + z₁ * z₃ * I * 3 * (1 / 2) + -(z₂ * z₃ * I * 3 * (1 / 2)) + z₂ * z₃ * 3 * (1 / 2) + z₂ ^ 2 * (1 / 4) + z₂ ^ 2 * I * 3 * (1 / 2) + -(z₂ ^ 2 * 3 * (1 / 4)) + -(z₃ ^ 2 * (1 / 4)) + -(z₃ ^ 2 * 3 * (1 / 4)) ; All goals completed! 🐙; z₁:z₂:z₃:h:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h_eq:(z₁ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - z₁) ^ 2 = 0h_cases:z₁ - z₂ = (z₂ - z₃) * (-1 / 2 + I * (3 / 2))z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2z₁:z₂:z₃:h:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h_eq:(z₁ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - z₁) ^ 2 = 0h_cases:z₁ - z₂ = (z₂ - z₃) * (-1 / 2 - I * (3 / 2))z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁:z₂:z₃:h:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h_eq:(z₁ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - z₁) ^ 2 = 0h_cases:z₁ - z₂ = (z₂ - z₃) * (-1 / 2 + I * (3 / 2))z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2z₁:z₂:z₃:h:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h_eq:(z₁ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - z₁) ^ 2 = 0h_cases:z₁ - z₂ = (z₂ - z₃) * (-1 / 2 - I * (3 / 2))z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁:z₂:z₃:h:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h_eq:(z₁ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - z₁) ^ 2 = 0h_cases:z₁ = (z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₁:z₂:z₃:h:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h_eq:(z₁ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - z₁) ^ 2 = 0h_cases:z₁ = (z₂ - z₃) * (-1 / 2 + I * (3 / 2)) + z₂z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2z₁:z₂:z₃:h:z₁ ^ 2 + z₂ ^ 2 + z₃ ^ 2 = z₁ * z₂ + z₂ * z₃ + z₃ * z₁h_eq:(z₁ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - z₁) ^ 2 = 0h_cases:z₁ = (z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂z₁ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - z₁ ^ 2 z₂:z₃:h:((z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂) ^ 2 + z₂ ^ 2 + z₃ ^ 2 = ((z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂) * z₂ + z₂ * z₃ + z₃ * ((z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂)h_eq:((z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - ((z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂)) ^ 2 = 0(z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - ((z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂) ^ 2 z₂:z₃:h:((z₂ - z₃) * (-1 / 2 + I * (3 / 2)) + z₂) ^ 2 + z₂ ^ 2 + z₃ ^ 2 = ((z₂ - z₃) * (-1 / 2 + I * (3 / 2)) + z₂) * z₂ + z₂ * z₃ + z₃ * ((z₂ - z₃) * (-1 / 2 + I * (3 / 2)) + z₂)h_eq:((z₂ - z₃) * (-1 / 2 + I * (3 / 2)) + z₂ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - ((z₂ - z₃) * (-1 / 2 + I * (3 / 2)) + z₂)) ^ 2 = 0(z₂ - z₃) * (-1 / 2 + I * (3 / 2)) + z₂ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - ((z₂ - z₃) * (-1 / 2 + I * (3 / 2)) + z₂) ^ 2z₂:z₃:h:((z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂) ^ 2 + z₂ ^ 2 + z₃ ^ 2 = ((z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂) * z₂ + z₂ * z₃ + z₃ * ((z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂)h_eq:((z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂ - z₂) ^ 2 + (z₂ - z₃) ^ 2 + (z₃ - ((z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂)) ^ 2 = 0(z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂ - z₂ ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₃ - ((z₂ - z₃) * (-1 / 2 - I * (3 / 2)) + z₂) ^ 2 z₂:z₃:h_eq:-(z₂ * z₃ * 3) - z₂ * z₃ * I ^ 2 * 3 ^ 2 + z₂ ^ 2 * (3 / 2) + z₂ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 2) + z₃ ^ 2 * (3 / 2) + z₃ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 2) = 0h:z₂ * z₃ * (1 / 2) + z₂ * z₃ * I ^ 2 * 3 ^ 2 * (-1 / 2) + z₂ ^ 2 * (5 / 4) + z₂ ^ 2 * I * 3 * (-1 / 2) + z₂ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 4) + z₃ ^ 2 * (5 / 4) + z₃ ^ 2 * I * 3 * (1 / 2) + z₃ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 4) = z₂ * z₃ * 2 + z₂ ^ 2 * (1 / 2) + z₂ ^ 2 * I * 3 * (-1 / 2) + z₃ ^ 2 * (1 / 2) + z₃ ^ 2 * I * 3 * (1 / 2)z₂ * (-1 / 2) + z₂ * I * 3 * (-1 / 2) + z₃ * (1 / 2) + z₃ * I * 3 * (1 / 2) ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₂ * (-1 / 2) + z₂ * I * 3 * (1 / 2) + z₃ * (1 / 2) + z₃ * I * 3 * (-1 / 2) ^ 2 z₂:z₃:h_eq:-(z₂ * z₃ * 3) - z₂ * z₃ * I ^ 2 * 3 ^ 2 + z₂ ^ 2 * (3 / 2) + z₂ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 2) + z₃ ^ 2 * (3 / 2) + z₃ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 2) = 0h:z₂ * z₃ * (1 / 2) + z₂ * z₃ * I ^ 2 * 3 ^ 2 * (-1 / 2) + z₂ ^ 2 * (5 / 4) + z₂ ^ 2 * I * 3 * (1 / 2) + z₂ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 4) + z₃ ^ 2 * (5 / 4) + z₃ ^ 2 * I * 3 * (-1 / 2) + z₃ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 4) = z₂ * z₃ * 2 + z₂ ^ 2 * (1 / 2) + z₂ ^ 2 * I * 3 * (1 / 2) + z₃ ^ 2 * (1 / 2) + z₃ ^ 2 * I * 3 * (-1 / 2)z₂ * (-1 / 2) + z₂ * I * 3 * (1 / 2) + z₃ * (1 / 2) + z₃ * I * 3 * (-1 / 2) ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₂ * (-1 / 2) + z₂ * I * 3 * (-1 / 2) + z₃ * (1 / 2) + z₃ * I * 3 * (1 / 2) ^ 2z₂:z₃:h_eq:-(z₂ * z₃ * 3) - z₂ * z₃ * I ^ 2 * 3 ^ 2 + z₂ ^ 2 * (3 / 2) + z₂ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 2) + z₃ ^ 2 * (3 / 2) + z₃ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 2) = 0h:z₂ * z₃ * (1 / 2) + z₂ * z₃ * I ^ 2 * 3 ^ 2 * (-1 / 2) + z₂ ^ 2 * (5 / 4) + z₂ ^ 2 * I * 3 * (-1 / 2) + z₂ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 4) + z₃ ^ 2 * (5 / 4) + z₃ ^ 2 * I * 3 * (1 / 2) + z₃ ^ 2 * I ^ 2 * 3 ^ 2 * (1 / 4) = z₂ * z₃ * 2 + z₂ ^ 2 * (1 / 2) + z₂ ^ 2 * I * 3 * (-1 / 2) + z₃ ^ 2 * (1 / 2) + z₃ ^ 2 * I * 3 * (1 / 2)z₂ * (-1 / 2) + z₂ * I * 3 * (-1 / 2) + z₃ * (1 / 2) + z₃ * I * 3 * (1 / 2) ^ 2 = z₂ - z₃ ^ 2 z₂ - z₃ ^ 2 = z₂ * (-1 / 2) + z₂ * I * 3 * (1 / 2) + z₃ * (1 / 2) + z₃ * I * 3 * (-1 / 2) ^ 2 z₂:z₃:h_eq:-(z₂ * z₃ * 3) + z₂ * z₃ * 3 ^ 2 + z₂ ^ 2 * (3 / 2) + -(z₂ ^ 2 * 3 ^ 2 * (1 / 2)) + z₃ ^ 2 * (3 / 2) + -(z₃ ^ 2 * 3 ^ 2 * (1 / 2)) = 0h:z₂ * z₃ * (1 / 2) + z₂ * z₃ * 3 ^ 2 * (1 / 2) + z₂ ^ 2 * (5 / 4) + -(z₂ ^ 2 * I * 3 * (1 / 2)) + -(z₂ ^ 2 * 3 ^ 2 * (1 / 4)) + z₃ ^ 2 * (5 / 4) + z₃ ^ 2 * I * 3 * (1 / 2) + -(z₃ ^ 2 * 3 ^ 2 * (1 / 4)) = z₂ * z₃ * 2 + z₂ ^ 2 * (1 / 2) + -(z₂ ^ 2 * I * 3 * (1 / 2)) + z₃ ^ 2 * (1 / 2) + z₃ ^ 2 * I * 3 * (1 / 2)(-(z₂.re * (1 / 2)) + z₂.im * 3 * (1 / 2) + z₃.re * (1 / 2) + -(z₃.im * 3 * (1 / 2))) * (-(z₂.re * (1 / 2)) + z₂.im * 3 * (1 / 2) + z₃.re * (1 / 2) + -(z₃.im * 3 * (1 / 2))) + (-(z₂.im * (1 / 2)) + -(z₂.re * 3 * (1 / 2)) + z₃.im * (1 / 2) + z₃.re * 3 * (1 / 2)) * (-(z₂.im * (1 / 2)) + -(z₂.re * 3 * (1 / 2)) + z₃.im * (1 / 2) + z₃.re * 3 * (1 / 2)) = (z₂.re - z₃.re) * (z₂.re - z₃.re) + (z₂.im - z₃.im) * (z₂.im - z₃.im) (z₂.re - z₃.re) * (z₂.re - z₃.re) + (z₂.im - z₃.im) * (z₂.im - z₃.im) = (-(z₂.re * (1 / 2)) + -(z₂.im * 3 * (1 / 2)) + z₃.re * (1 / 2) + z₃.im * 3 * (1 / 2)) * (-(z₂.re * (1 / 2)) + -(z₂.im * 3 * (1 / 2)) + z₃.re * (1 / 2) + z₃.im * 3 * (1 / 2)) + (-(z₂.im * (1 / 2)) + z₂.re * 3 * (1 / 2) + z₃.im * (1 / 2) + -(z₃.re * 3 * (1 / 2))) * (-(z₂.im * (1 / 2)) + z₂.re * 3 * (1 / 2) + z₃.im * (1 / 2) + -(z₃.re * 3 * (1 / 2))); all_goals All goals completed! 🐙