2. Roots of unity
This section defines roots of unity and proves various basic facts about them.
Throughout this section we assume that d ≥ 1.
Lean code
-- This instance is referred to later, needs naming
variable (d : ℕ) [hnezero : NeZero d]
d is invertible in ℂ.
The inverse of d exists since d ∈ ℕ and d ≠ 0.
Lean code for Lemma2.1
Associated Lean declarations
-
d_invertible[complete]
-
d_invertible[complete]
lemma d_invertible : IsUnit (d : ℂ) := d:ℕhnezero:NeZero d⊢ IsUnit ↑d
d:ℕhnezero:NeZero d⊢ ¬d = 0
All goals completed! 🐙
Define the primitive d-th root of unity.
Let ω = \exp(2πi/d) be the primitive d-th root of unity.
Lean code for Definition2.2
Associated Lean declarations
-
ω[complete]
-
ω[complete]
noncomputable def ω : ℂˣ := .mk
(Complex.exp (2 * Real.pi * Complex.I / d))
(Complex.exp (- 2 * Real.pi * Complex.I / d))
(d:ℕhnezero:NeZero d⊢ Complex.exp (2 * ↑Real.pi * Complex.I / ↑d) * Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d) = 1 d:ℕhnezero:NeZero d⊢ Complex.exp (2 * ↑Real.pi * Complex.I / ↑d + -2 * ↑Real.pi * Complex.I / ↑d) = 1; simp d:ℕhnezero:NeZero d⊢ Complex.exp (2 * ↑Real.pi * Complex.I / ↑d + -(2 * ↑Real.pi * Complex.I) / ↑d) = 1; ring d:ℕhnezero:NeZero d⊢ Complex.exp 0 = 1; rw[Complex.exp_zero d:ℕhnezero:NeZero d⊢ 1 = 1] All goals completed! 🐙)
(by d:ℕhnezero:NeZero d⊢ Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d) * Complex.exp (2 * ↑Real.pi * Complex.I / ↑d) = 1 rw[<- Complex.exp_add d:ℕhnezero:NeZero d⊢ Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d + 2 * ↑Real.pi * Complex.I / ↑d) = 1] d:ℕhnezero:NeZero d⊢ Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d + 2 * ↑Real.pi * Complex.I / ↑d) = 1; simp d:ℕhnezero:NeZero d⊢ Complex.exp (-(2 * ↑Real.pi * Complex.I) / ↑d + 2 * ↑Real.pi * Complex.I / ↑d) = 1; ring d:ℕhnezero:NeZero d⊢ Complex.exp 0 = 1; rw[Complex.exp_zero d:ℕhnezero:NeZero d⊢ 1 = 1] All goals completed! 🐙)
Some basic lemmas about \omega
When d = 1, \omega = 1
Lean code for Lemma2.3
Associated Lean declarations
-
omega_one[complete]
-
omega_one'[complete]
-
omega_one[complete] -
omega_one'[complete]
@[simp]
lemma omega_one : (ω 1) = 1 := by ⊢ ω 1 = 1
ext ⊢ ↑(ω 1) = ↑1; unfold ω ⊢ ↑{ val := Complex.exp (2 * ↑Real.pi * Complex.I / ↑1), inv := Complex.exp (-2 * ↑Real.pi * Complex.I / ↑1),
val_inv := ⋯, inv_val := ⋯ } =
↑1; simp All goals completed! 🐙;
omit [NeZero d] in
@[simp]
lemma omega_one' (hd : d = 1) : ω d = 1 := by d:ℕhd:d = 1⊢ ω d = 1
rw[hd d:ℕhd:d = 1⊢ ω 1 = 1] d:ℕhd:d = 1⊢ ω 1 = 1; simp All goals completed! 🐙
Lean code
Associated Lean declarations
-
omega_val_pow_commutes[complete]
-
omega_val_pow_commutes[complete]
omit [NeZero d] in
lemma omega_val_pow_commutes (i : ℕ) : ((ω d) ^ i).val = (ω d).val ^ i
:= by d:ℕi:ℕ⊢ ↑(ω d ^ i) = ↑(ω d) ^ i simp All goals completed! 🐙
-
omega_pow_d_eq_one[complete] -
omega_val_pow_d_eq_one[complete]
ω^d = 1.
ω^d = (\exp(2πi/d))^d = \exp(d(2πi/d)) = \exp(2πi) = 1 where we could cancel d since d ≠ 0.
Lean code for Lemma2.4
Associated Lean declarations
-
omega_pow_d_eq_one[complete]
-
omega_val_pow_d_eq_one[complete]
-
omega_pow_d_eq_one[complete] -
omega_val_pow_d_eq_one[complete]
omit [NeZero d] in
@[simp]
lemma omega_pow_d_eq_one : (ω d)^d = 1 := by d:ℕ⊢ ω d ^ d = 1
unfold ω d:ℕ⊢ { val := Complex.exp (2 * ↑Real.pi * Complex.I / ↑d), inv := Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d), val_inv := ⋯,
inv_val := ⋯ } ^
d =
1; ext d:ℕ⊢ ↑({ val := Complex.exp (2 * ↑Real.pi * Complex.I / ↑d), inv := Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d),
val_inv := ⋯, inv_val := ⋯ } ^
d) =
↑1; simp d:ℕ⊢ Complex.exp (2 * ↑Real.pi * Complex.I / ↑d) ^ d = 1
rw [← Complex.exp_nat_mul d:ℕ⊢ Complex.exp (↑d * (2 * ↑Real.pi * Complex.I / ↑d)) = 1] d:ℕ⊢ Complex.exp (↑d * (2 * ↑Real.pi * Complex.I / ↑d)) = 1; by_cases hd : d = 0 pos d:ℕhd:d = 0⊢ Complex.exp (↑d * (2 * ↑Real.pi * Complex.I / ↑d)) = 1neg d:ℕhd:¬d = 0⊢ Complex.exp (↑d * (2 * ↑Real.pi * Complex.I / ↑d)) = 1
· pos d:ℕhd:d = 0⊢ Complex.exp (↑d * (2 * ↑Real.pi * Complex.I / ↑d)) = 1 rw[hd pos d:ℕhd:d = 0⊢ Complex.exp (↑0 * (2 * ↑Real.pi * Complex.I / ↑0)) = 1] pos d:ℕhd:d = 0⊢ Complex.exp (↑0 * (2 * ↑Real.pi * Complex.I / ↑0)) = 1; simp All goals completed! 🐙
· neg d:ℕhd:¬d = 0⊢ Complex.exp (↑d * (2 * ↑Real.pi * Complex.I / ↑d)) = 1 ring_nf neg d:ℕhd:¬d = 0⊢ Complex.exp (↑d * ↑Real.pi * Complex.I * (↑d)⁻¹ * 2) = 1; calc
Complex.exp (↑d * ↑Real.pi * Complex.I * (↑d)⁻¹ * 2) = Complex.exp (↑d * (↑d)⁻¹ * ↑Real.pi * Complex.I * 2)
:= by d:ℕhd:¬d = 0⊢ Complex.exp (↑d * ↑Real.pi * Complex.I * (↑d)⁻¹ * 2) = Complex.exp (↑d * (↑d)⁻¹ * ↑Real.pi * Complex.I * 2) ring_nf All goals completed! 🐙
_ = Complex.exp (↑Real.pi * Complex.I * 2)
:= by d:ℕhd:¬d = 0⊢ Complex.exp (↑d * (↑d)⁻¹ * ↑Real.pi * Complex.I * 2) = Complex.exp (↑Real.pi * Complex.I * 2) rw[Complex.mul_inv_cancel, d:ℕhd:¬d = 0⊢ Complex.exp (1 * ↑Real.pi * Complex.I * 2) = Complex.exp (↑Real.pi * Complex.I * 2)d:ℕhd:¬d = 0⊢ ↑d ≠ 0 one_mul d:ℕhd:¬d = 0⊢ Complex.exp (↑Real.pi * Complex.I * 2) = Complex.exp (↑Real.pi * Complex.I * 2)d:ℕhd:¬d = 0⊢ ↑d ≠ 0] d:ℕhd:¬d = 0⊢ ↑d ≠ 0; simp d:ℕhd:¬d = 0⊢ ¬d = 0; apply hd All goals completed! 🐙
_ = 1 := by d:ℕhd:¬d = 0⊢ Complex.exp (↑Real.pi * Complex.I * 2) = 1 rw[mul_comm, d:ℕhd:¬d = 0⊢ Complex.exp (2 * (↑Real.pi * Complex.I)) = 1 <- mul_assoc, d:ℕhd:¬d = 0⊢ Complex.exp (2 * ↑Real.pi * Complex.I) = 1 Complex.exp_two_pi_mul_I d:ℕhd:¬d = 0⊢ 1 = 1] All goals completed! 🐙;
omit [NeZero d] in
@[simp]
lemma omega_val_pow_d_eq_one : ((ω d).val) ^ d = 1 := by d:ℕ⊢ ↑(ω d) ^ d = 1
rw[<- Units.val_pow_eq_pow_val, d:ℕ⊢ ↑(ω d ^ d) = 1 omega_pow_d_eq_one d:ℕ⊢ ↑1 = 1] d:ℕ⊢ ↑1 = 1; simp All goals completed! 🐙
Let i ∈ ℤ, then \left(\omega^{-1}\right)^i = \omega^{d - i}
Lean code for Lemma2.5
Associated Lean declarations
-
omega_pow_of_inv[complete]
-
omega_pow_of_inv[complete]
omit [NeZero d] in
lemma omega_pow_of_inv (i : ℤ) : (ω d)⁻¹ ^ i = (ω d) ^ (-i)
:= by d:ℕi:ℤ⊢ (ω d)⁻¹ ^ i = ω d ^ (-i) rw[zpow_neg d:ℕi:ℤ⊢ (ω d)⁻¹ ^ i = (ω d ^ i)⁻¹] d:ℕi:ℤ⊢ (ω d)⁻¹ ^ i = (ω d ^ i)⁻¹; simp All goals completed! 🐙
-
omega_inv_pow[complete] -
omega_inv_pow_val[complete]
Let i ∈ ℤ_d, then \left(\omega^{i}\right)^{-1} = \omega^{-i}
Lean code for Lemma2.6
Associated Lean declarations
-
omega_inv_pow[complete]
-
omega_inv_pow_val[complete]
-
omega_inv_pow[complete] -
omega_inv_pow_val[complete]
lemma omega_inv_pow (i : ZMod d) : ((ω d) ^ i.val)⁻¹ = (ω d) ^ (-i).val
:= by d:ℕhnezero:NeZero di:ZMod d⊢ (ω d ^ i.val)⁻¹ = ω d ^ (-i).val rw[<- inv_pow (ω d) i.val d:ℕhnezero:NeZero di:ZMod d⊢ (ω d)⁻¹ ^ i.val = ω d ^ (-i).val] d:ℕhnezero:NeZero di:ZMod d⊢ (ω d)⁻¹ ^ i.val = ω d ^ (-i).val; unfold ω d:ℕhnezero:NeZero di:ZMod d⊢ { val := Complex.exp (2 * ↑Real.pi * Complex.I / ↑d), inv := Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d), val_inv := ⋯,
inv_val := ⋯ }⁻¹ ^
i.val =
{ val := Complex.exp (2 * ↑Real.pi * Complex.I / ↑d), inv := Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d),
val_inv := ⋯, inv_val := ⋯ } ^
(-i).val; ext d:ℕhnezero:NeZero di:ZMod d⊢ ↑({ val := Complex.exp (2 * ↑Real.pi * Complex.I / ↑d), inv := Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d),
val_inv := ⋯, inv_val := ⋯ }⁻¹ ^
i.val) =
↑({ val := Complex.exp (2 * ↑Real.pi * Complex.I / ↑d), inv := Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d),
val_inv := ⋯, inv_val := ⋯ } ^
(-i).val); simp d:ℕhnezero:NeZero di:ZMod d⊢ Complex.exp (-(2 * ↑Real.pi * Complex.I) / ↑d) ^ i.val = Complex.exp (2 * ↑Real.pi * Complex.I / ↑d) ^ (-i).val;
rw[<- Complex.exp_nat_mul, d:ℕhnezero:NeZero di:ZMod d⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) = Complex.exp (2 * ↑Real.pi * Complex.I / ↑d) ^ (-i).val <- Complex.exp_nat_mul d:ℕhnezero:NeZero di:ZMod d⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) = Complex.exp (↑(-i).val * (2 * ↑Real.pi * Complex.I / ↑d))] d:ℕhnezero:NeZero di:ZMod d⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) = Complex.exp (↑(-i).val * (2 * ↑Real.pi * Complex.I / ↑d));
rw[ZMod.neg_val d:ℕhnezero:NeZero di:ZMod d⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) =
Complex.exp (↑(if i = 0 then 0 else d - i.val) * (2 * ↑Real.pi * Complex.I / ↑d))] d:ℕhnezero:NeZero di:ZMod d⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) =
Complex.exp (↑(if i = 0 then 0 else d - i.val) * (2 * ↑Real.pi * Complex.I / ↑d)); by_cases hi : i = 0 pos d:ℕhnezero:NeZero di:ZMod dhi:i = 0⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) =
Complex.exp (↑(if i = 0 then 0 else d - i.val) * (2 * ↑Real.pi * Complex.I / ↑d))neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) =
Complex.exp (↑(if i = 0 then 0 else d - i.val) * (2 * ↑Real.pi * Complex.I / ↑d))
· pos d:ℕhnezero:NeZero di:ZMod dhi:i = 0⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) =
Complex.exp (↑(if i = 0 then 0 else d - i.val) * (2 * ↑Real.pi * Complex.I / ↑d)) rw[hi pos d:ℕhnezero:NeZero di:ZMod dhi:i = 0⊢ Complex.exp (↑(ZMod.val 0) * (-(2 * ↑Real.pi * Complex.I) / ↑d)) =
Complex.exp (↑(if 0 = 0 then 0 else d - ZMod.val 0) * (2 * ↑Real.pi * Complex.I / ↑d))] pos d:ℕhnezero:NeZero di:ZMod dhi:i = 0⊢ Complex.exp (↑(ZMod.val 0) * (-(2 * ↑Real.pi * Complex.I) / ↑d)) =
Complex.exp (↑(if 0 = 0 then 0 else d - ZMod.val 0) * (2 * ↑Real.pi * Complex.I / ↑d)); simp All goals completed! 🐙
· neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) =
Complex.exp (↑(if i = 0 then 0 else d - i.val) * (2 * ↑Real.pi * Complex.I / ↑d)) rw[ite_cond_eq_false, neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) = Complex.exp (↑(d - i.val) * (2 * ↑Real.pi * Complex.I / ↑d))neg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False Nat.cast_sub, neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) =
Complex.exp ((↑d - ↑i.val) * (2 * ↑Real.pi * Complex.I / ↑d))neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False sub_mul neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) =
Complex.exp (↑d * (2 * ↑Real.pi * Complex.I / ↑d) - ↑i.val * (2 * ↑Real.pi * Complex.I / ↑d))neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False] neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (↑i.val * (-(2 * ↑Real.pi * Complex.I) / ↑d)) =
Complex.exp (↑d * (2 * ↑Real.pi * Complex.I / ↑d) - ↑i.val * (2 * ↑Real.pi * Complex.I / ↑d))neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False; ring_nf neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (-(↑i.val * ↑Real.pi * Complex.I * (↑d)⁻¹ * 2)) =
Complex.exp (-(↑i.val * ↑Real.pi * Complex.I * (↑d)⁻¹ * 2) + ↑Real.pi * Complex.I * ↑d * (↑d)⁻¹ * 2)neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False;
rw[Complex.exp_add neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (-(↑i.val * ↑Real.pi * Complex.I * (↑d)⁻¹ * 2)) =
Complex.exp (-(↑i.val * ↑Real.pi * Complex.I * (↑d)⁻¹ * 2)) * Complex.exp (↑Real.pi * Complex.I * ↑d * (↑d)⁻¹ * 2)neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False] neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (-(↑i.val * ↑Real.pi * Complex.I * (↑d)⁻¹ * 2)) =
Complex.exp (-(↑i.val * ↑Real.pi * Complex.I * (↑d)⁻¹ * 2)) * Complex.exp (↑Real.pi * Complex.I * ↑d * (↑d)⁻¹ * 2)neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False; simp neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (↑Real.pi * Complex.I * ↑d * (↑d)⁻¹ * 2) = 1neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False; rw[mul_comm, neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (2 * (↑Real.pi * Complex.I * ↑d * (↑d)⁻¹)) = 1neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False mul_assoc neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (2 * (↑Real.pi * Complex.I * (↑d * (↑d)⁻¹))) = 1neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False] neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (2 * (↑Real.pi * Complex.I * (↑d * (↑d)⁻¹))) = 1neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False; simp neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (2 * (↑Real.pi * Complex.I)) = 1neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False
rw[<- mul_assoc, neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ Complex.exp (2 * ↑Real.pi * Complex.I) = 1neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False Complex.exp_two_pi_mul_I neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ 1 = 1neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False] neg d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ i.val ≤ dneg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False; apply ZMod.val_le neg.h d:ℕhnezero:NeZero di:ZMod dhi:¬i = 0⊢ (i = 0) = False; apply eq_false hi All goals completed! 🐙
lemma omega_inv_pow_val (i : ZMod d) : ((ω d).val ^ i.val)⁻¹ = (ω d).val ^ (-i).val
:= by d:ℕhnezero:NeZero di:ZMod d⊢ (↑(ω d) ^ i.val)⁻¹ = ↑(ω d) ^ (-i).val calc
((ω d).val ^ i.val)⁻¹ = (((ω d) ^ i.val)⁻¹).val := by d:ℕhnezero:NeZero di:ZMod d⊢ (↑(ω d) ^ i.val)⁻¹ = ↑(ω d ^ i.val)⁻¹ simp All goals completed! 🐙
_ = ((ω d) ^ (-i).val).val := by d:ℕhnezero:NeZero di:ZMod d⊢ ↑(ω d ^ i.val)⁻¹ = ↑(ω d ^ (-i).val) rw[omega_inv_pow d:ℕhnezero:NeZero di:ZMod d⊢ ↑(ω d ^ (-i).val) = ↑(ω d ^ (-i).val)] All goals completed! 🐙
_ = (ω d).val ^ (-i).val := by d:ℕhnezero:NeZero di:ZMod d⊢ ↑(ω d ^ (-i).val) = ↑(ω d) ^ (-i).val simp All goals completed! 🐙
For z ∈ \mathbb{C}, let z^* denote the usual complex conjugate of z. Then \omega^* = \omega^{-1}
Lean code for Lemma2.7
Associated Lean declarations
-
omega_star[complete]
-
omega_pow_star[complete]
-
omega_star[complete] -
omega_pow_star[complete]
omit [NeZero d] in
@[simp]
lemma omega_star : star ((ω d).val) = (ω d).val⁻¹
:= by d:ℕ⊢ star ↑(ω d) = (↑(ω d))⁻¹ rw[Complex.inv_def d:ℕ⊢ star ↑(ω d) = (starRingEnd ℂ) ↑(ω d) * ↑(Complex.normSq ↑(ω d))⁻¹] d:ℕ⊢ star ↑(ω d) = (starRingEnd ℂ) ↑(ω d) * ↑(Complex.normSq ↑(ω d))⁻¹; simp d:ℕ⊢ Complex.normSq ↑(ω d) = 1; unfold ω d:ℕ⊢ Complex.normSq
↑{ val := Complex.exp (2 * ↑Real.pi * Complex.I / ↑d), inv := Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d),
val_inv := ⋯, inv_val := ⋯ } =
1; simp d:ℕ⊢ Complex.normSq (Complex.exp (2 * ↑Real.pi * Complex.I / ↑d)) = 1;
rw[<- Complex.sq_norm, d:ℕ⊢ ‖Complex.exp (2 * ↑Real.pi * Complex.I / ↑d)‖ ^ 2 = 1 Complex.norm_exp d:ℕ⊢ Real.exp (2 * ↑Real.pi * Complex.I / ↑d).re ^ 2 = 1] d:ℕ⊢ Real.exp (2 * ↑Real.pi * Complex.I / ↑d).re ^ 2 = 1; simp All goals completed! 🐙
omit [NeZero d] in
@[simp]
lemma omega_pow_star (i : ℕ) : star (((ω d).val) ^ i) = ((ω d).val ^ i)⁻¹
:= by d:ℕi:ℕ⊢ star (↑(ω d) ^ i) = (↑(ω d) ^ i)⁻¹ simp All goals completed! 🐙;
Lean code
Associated Lean declarations
-
order_omega[sorry in proof]
-
order_omega[sorry in proof]
lemma order_omega : orderOf (ω d) = d := by d:ℕhnezero:NeZero d⊢ orderOf (ω d) = d
rw[orderOf_eq_iff d:ℕhnezero:NeZero d⊢ ω d ^ d = 1 ∧ ∀ m < d, 0 < m → ω d ^ m ≠ 1d:ℕhnezero:NeZero d⊢ 0 < d] d:ℕhnezero:NeZero d⊢ ω d ^ d = 1 ∧ ∀ m < d, 0 < m → ω d ^ m ≠ 1d:ℕhnezero:NeZero d⊢ 0 < d; apply And.intro left d:ℕhnezero:NeZero d⊢ ω d ^ d = 1right d:ℕhnezero:NeZero d⊢ ∀ m < d, 0 < m → ω d ^ m ≠ 1d:ℕhnezero:NeZero d⊢ 0 < d; apply omega_pow_d_eq_one right d:ℕhnezero:NeZero d⊢ ∀ m < d, 0 < m → ω d ^ m ≠ 1d:ℕhnezero:NeZero d⊢ 0 < d;
intro m hm hm' right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < m⊢ ω d ^ m ≠ 1d:ℕhnezero:NeZero d⊢ 0 < d; intro hAbs right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mhAbs:ω d ^ m = 1⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d; rw[Units.ext_iff right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mhAbs:↑(ω d ^ m) = ↑1⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d] at hAbs right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mhAbs:↑(ω d ^ m) = ↑1⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d; simp at hAbs right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mhAbs:↑(ω d) ^ m = 1⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d;
unfold ω at hAbs right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mhAbs:↑{ val := Complex.exp (2 * ↑Real.pi * Complex.I / ↑d), inv := Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d),
val_inv := ⋯, inv_val := ⋯ } ^
m =
1⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d; simp at hAbs right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mhAbs:Complex.exp (2 * ↑Real.pi * Complex.I / ↑d) ^ m = 1⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d; rw[<- Complex.exp_nsmul right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mhAbs:Complex.exp (m • (2 * ↑Real.pi * Complex.I / ↑d)) = 1⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d] at hAbs right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mhAbs:Complex.exp (m • (2 * ↑Real.pi * Complex.I / ↑d)) = 1⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d; simp at hAbs right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mhAbs:Complex.exp (↑m * (2 * ↑Real.pi * Complex.I / ↑d)) = 1⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d;
rw[Complex.exp_eq_one_iff right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mhAbs:∃ n, ↑m * (2 * ↑Real.pi * Complex.I / ↑d) = ↑n * (2 * ↑Real.pi * Complex.I)⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d] at hAbs right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mhAbs:∃ n, ↑m * (2 * ↑Real.pi * Complex.I / ↑d) = ↑n * (2 * ↑Real.pi * Complex.I)⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d; obtain ⟨n, hn⟩ := hAbs right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mn:ℤhn:↑m * (2 * ↑Real.pi * Complex.I / ↑d) = ↑n * (2 * ↑Real.pi * Complex.I)⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d;
have calc_md : (m : ℝ) / (d : ℝ) = (n : ℂ) := by d:ℕhnezero:NeZero d⊢ orderOf (ω d) = d rw[mul_div_left_comm, d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mn:ℤhn:2 * ↑Real.pi * Complex.I * (↑m / ↑d) = ↑n * (2 * ↑Real.pi * Complex.I)⊢ ↑↑m / ↑↑d = ↑n mul_comm d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mn:ℤhn:↑m / ↑d * (2 * ↑Real.pi * Complex.I) = ↑n * (2 * ↑Real.pi * Complex.I)⊢ ↑↑m / ↑↑d = ↑n] at hn d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mn:ℤhn:↑m / ↑d * (2 * ↑Real.pi * Complex.I) = ↑n * (2 * ↑Real.pi * Complex.I)⊢ ↑↑m / ↑↑d = ↑n; simp at hn d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mn:ℤhn:↑m / ↑d = ↑n⊢ ↑↑m / ↑↑d = ↑n; apply hn right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mn:ℤhn:↑m * (2 * ↑Real.pi * Complex.I / ↑d) = ↑n * (2 * ↑Real.pi * Complex.I)calc_md:↑↑m / ↑↑d = ↑n⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d
have d_ge_zero : 0 < d := by d:ℕhnezero:NeZero d⊢ orderOf (ω d) = d apply Nat.zero_lt_of_ne_zero d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mn:ℤhn:↑m * (2 * ↑Real.pi * Complex.I / ↑d) = ↑n * (2 * ↑Real.pi * Complex.I)calc_md:↑↑m / ↑↑d = ↑n⊢ d ≠ 0; apply hnezero.out All goals completed! 🐙; right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mn:ℤhn:↑m * (2 * ↑Real.pi * Complex.I / ↑d) = ↑n * (2 * ↑Real.pi * Complex.I)calc_md:↑↑m / ↑↑d = ↑nd_ge_zero:0 < d⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d
have ratio_between : (m : ℝ) / (d : ℝ) > 0 ∧ (m : ℝ) / d < 1 := by d:ℕhnezero:NeZero d⊢ orderOf (ω d) = d sorry All goals completed! 🐙; right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mn:ℤhn:↑m * (2 * ↑Real.pi * Complex.I / ↑d) = ↑n * (2 * ↑Real.pi * Complex.I)calc_md:↑↑m / ↑↑d = ↑nd_ge_zero:0 < dratio_between:↑m / ↑d > 0 ∧ ↑m / ↑d < 1⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d -- apply And.intro;
simp at calc_md right d:ℕhnezero:NeZero dm:ℕhm:m < dhm':0 < mn:ℤhn:↑m * (2 * ↑Real.pi * Complex.I / ↑d) = ↑n * (2 * ↑Real.pi * Complex.I)calc_md:↑m / ↑d = ↑nd_ge_zero:0 < dratio_between:↑m / ↑d > 0 ∧ ↑m / ↑d < 1⊢ Falsed:ℕhnezero:NeZero d⊢ 0 < d;
--rw[calc_md] at ratio_between;
sorry d:ℕhnezero:NeZero d⊢ 0 < d;
apply Nat.zero_lt_of_ne_zero d:ℕhnezero:NeZero d⊢ d ≠ 0; apply hnezero.out All goals completed! 🐙
-- apply d_ge_zero; rw[div_lt_one m d]
This is an additional corrolary that is nice to have.
-
omega_pow_n_mod_d[complete] -
omega_val_pow_n_mod_d[complete]
ω^n = ω^{n \mod d}.
Lean code for Lemma2.8
Associated Lean declarations
-
omega_pow_n_mod_d[complete]
-
omega_val_pow_n_mod_d[complete]
-
omega_pow_n_mod_d[complete] -
omega_val_pow_n_mod_d[complete]
lemma omega_pow_n_mod_d :
∀ n : ℕ, (ω d) ^ n = (ω d) ^ (n % d) := by d:ℕhnezero:NeZero d⊢ ∀ (n : ℕ), ω d ^ n = ω d ^ (n % d)
intro n d:ℕhnezero:NeZero dn:ℕ⊢ ω d ^ n = ω d ^ (n % d)
nth_rw 1 [←(Nat.mod_add_div n d) d:ℕhnezero:NeZero dn:ℕ⊢ ω d ^ (n % d + d * (n / d)) = ω d ^ (n % d)] d:ℕhnezero:NeZero dn:ℕ⊢ ω d ^ (n % d + d * (n / d)) = ω d ^ (n % d)
rw [pow_add, d:ℕhnezero:NeZero dn:ℕ⊢ ω d ^ (n % d) * ω d ^ (d * (n / d)) = ω d ^ (n % d) pow_mul, d:ℕhnezero:NeZero dn:ℕ⊢ ω d ^ (n % d) * (ω d ^ d) ^ (n / d) = ω d ^ (n % d) omega_pow_d_eq_one, d:ℕhnezero:NeZero dn:ℕ⊢ ω d ^ (n % d) * 1 ^ (n / d) = ω d ^ (n % d)
one_pow, d:ℕhnezero:NeZero dn:ℕ⊢ ω d ^ (n % d) * 1 = ω d ^ (n % d) mul_one d:ℕhnezero:NeZero dn:ℕ⊢ ω d ^ (n % d) = ω d ^ (n % d)] All goals completed! 🐙
lemma omega_val_pow_n_mod_d :
∀ n : ℕ, (ω d).val ^ n = (ω d).val ^ (n % d) := by d:ℕhnezero:NeZero d⊢ ∀ (n : ℕ), ↑(ω d) ^ n = ↑(ω d) ^ (n % d)
intro n d:ℕhnezero:NeZero dn:ℕ⊢ ↑(ω d) ^ n = ↑(ω d) ^ (n % d)
nth_rw 1 [←(Nat.mod_add_div n d) d:ℕhnezero:NeZero dn:ℕ⊢ ↑(ω d) ^ (n % d + d * (n / d)) = ↑(ω d) ^ (n % d)] d:ℕhnezero:NeZero dn:ℕ⊢ ↑(ω d) ^ (n % d + d * (n / d)) = ↑(ω d) ^ (n % d)
rw [pow_add, d:ℕhnezero:NeZero dn:ℕ⊢ ↑(ω d) ^ (n % d) * ↑(ω d) ^ (d * (n / d)) = ↑(ω d) ^ (n % d) pow_mul, d:ℕhnezero:NeZero dn:ℕ⊢ ↑(ω d) ^ (n % d) * (↑(ω d) ^ d) ^ (n / d) = ↑(ω d) ^ (n % d) omega_val_pow_d_eq_one, d:ℕhnezero:NeZero dn:ℕ⊢ ↑(ω d) ^ (n % d) * 1 ^ (n / d) = ↑(ω d) ^ (n % d)
one_pow, d:ℕhnezero:NeZero dn:ℕ⊢ ↑(ω d) ^ (n % d) * 1 = ↑(ω d) ^ (n % d) mul_one d:ℕhnezero:NeZero dn:ℕ⊢ ↑(ω d) ^ (n % d) = ↑(ω d) ^ (n % d)] All goals completed! 🐙
Lean code
Associated Lean declarations
-
omega_pow_k_mod_d_eq_pow_k_int[complete]
-
omega_pow_k_mod_d_eq_pow_k_int[complete]
lemma omega_pow_k_mod_d_eq_pow_k_int :
∀ k : ℤ, (ω d) ^ k = (ω d) ^ (k % d) := by d:ℕhnezero:NeZero d⊢ ∀ (k : ℤ), ω d ^ k = ω d ^ (k % ↑d)
intro k d:ℕhnezero:NeZero dk:ℤ⊢ ω d ^ k = ω d ^ (k % ↑d); --unfold ω; ext; simp
nth_rw 1 [← (Int.emod_add_ediv_mul k d) d:ℕhnezero:NeZero dk:ℤ⊢ ω d ^ (k % ↑d + k / ↑d * ↑d) = ω d ^ (k % ↑d)] d:ℕhnezero:NeZero dk:ℤ⊢ ω d ^ (k % ↑d + k / ↑d * ↑d) = ω d ^ (k % ↑d)
rw[zpow_add d:ℕhnezero:NeZero dk:ℤ⊢ ω d ^ (k % ↑d) * ω d ^ (k / ↑d * ↑d) = ω d ^ (k % ↑d)] d:ℕhnezero:NeZero dk:ℤ⊢ ω d ^ (k % ↑d) * ω d ^ (k / ↑d * ↑d) = ω d ^ (k % ↑d); simp d:ℕhnezero:NeZero dk:ℤ⊢ ω d ^ (k / ↑d * ↑d) = 1
rw[mul_comm, d:ℕhnezero:NeZero dk:ℤ⊢ ω d ^ (↑d * (k / ↑d)) = 1 zpow_mul d:ℕhnezero:NeZero dk:ℤ⊢ (ω d ^ ↑d) ^ (k / ↑d) = 1] d:ℕhnezero:NeZero dk:ℤ⊢ (ω d ^ ↑d) ^ (k / ↑d) = 1
simp All goals completed! 🐙
Lean code
Associated Lean declarations
-
omega_pow_k_mod_d_eq_pow_k_zmod[complete]
-
omega_pow_k_mod_d_eq_pow_k_zmod[complete]
lemma omega_pow_k_mod_d_eq_pow_k_zmod :
∀ k : ℤ, (ω d) ^ k = (ω d) ^ (k : ZMod d).val := by d:ℕhnezero:NeZero d⊢ ∀ (k : ℤ), ω d ^ k = ω d ^ (↑k).val
intro k d:ℕhnezero:NeZero dk:ℤ⊢ ω d ^ k = ω d ^ (↑k).val
rw [omega_pow_k_mod_d_eq_pow_k_int d:ℕhnezero:NeZero dk:ℤ⊢ ω d ^ (k % ↑d) = ω d ^ (↑k).val] d:ℕhnezero:NeZero dk:ℤ⊢ ω d ^ (k % ↑d) = ω d ^ (↑k).val
rw [(Eq.symm (ZMod.val_intCast k)) d:ℕhnezero:NeZero dk:ℤ⊢ ω d ^ ↑(↑k).val = ω d ^ (↑k).val] d:ℕhnezero:NeZero dk:ℤ⊢ ω d ^ ↑(↑k).val = ω d ^ (↑k).val
exact zpow_natCast (ω d) (k : ZMod d).val All goals completed! 🐙
We will also need another root of unity which we call τ.
Let τ = -\exp(πi/d).
Lean code for Definition2.9
Associated Lean declarations
-
τ[complete]
-
τ[complete]
noncomputable def τ : ℂˣ := .mk
(- Complex.exp (Real.pi * Complex.I / d))
(- Complex.exp (- Real.pi * Complex.I / d))
(by d:ℕhnezero:NeZero d⊢ -Complex.exp (↑Real.pi * Complex.I / ↑d) * -Complex.exp (-↑Real.pi * Complex.I / ↑d) = 1 simp d:ℕhnezero:NeZero d⊢ Complex.exp (↑Real.pi * Complex.I / ↑d) * Complex.exp (-(↑Real.pi * Complex.I) / ↑d) = 1; rw[<- Complex.exp_add d:ℕhnezero:NeZero d⊢ Complex.exp (↑Real.pi * Complex.I / ↑d + -(↑Real.pi * Complex.I) / ↑d) = 1] d:ℕhnezero:NeZero d⊢ Complex.exp (↑Real.pi * Complex.I / ↑d + -(↑Real.pi * Complex.I) / ↑d) = 1; ring d:ℕhnezero:NeZero d⊢ Complex.exp 0 = 1; rw[Complex.exp_zero d:ℕhnezero:NeZero d⊢ 1 = 1] All goals completed! 🐙)
(by d:ℕhnezero:NeZero d⊢ -Complex.exp (-↑Real.pi * Complex.I / ↑d) * -Complex.exp (↑Real.pi * Complex.I / ↑d) = 1 simp d:ℕhnezero:NeZero d⊢ Complex.exp (-(↑Real.pi * Complex.I) / ↑d) * Complex.exp (↑Real.pi * Complex.I / ↑d) = 1; rw[<- Complex.exp_add d:ℕhnezero:NeZero d⊢ Complex.exp (-(↑Real.pi * Complex.I) / ↑d + ↑Real.pi * Complex.I / ↑d) = 1] d:ℕhnezero:NeZero d⊢ Complex.exp (-(↑Real.pi * Complex.I) / ↑d + ↑Real.pi * Complex.I / ↑d) = 1; ring d:ℕhnezero:NeZero d⊢ Complex.exp 0 = 1; rw[Complex.exp_zero d:ℕhnezero:NeZero d⊢ 1 = 1] All goals completed! 🐙)
Some basic lemmas about \tau
Much like \omega, since τ lies on the Unit circle, one has \tau^* = \tau^{-1}
Lean code
Associated Lean declarations
-
tau_star_val[complete]
-
tau_star[complete]
-
tau_star_pow[sorry in proof]
-
tau_star_val[complete] -
tau_star[complete] -
tau_star_pow[sorry in proof]
omit [NeZero d] in
@[simp]
lemma tau_star_val : star (τ d).val = (τ d).val⁻¹ :=
by d:ℕ⊢ star ↑(τ d) = (↑(τ d))⁻¹ rw[Complex.inv_def d:ℕ⊢ star ↑(τ d) = (starRingEnd ℂ) ↑(τ d) * ↑(Complex.normSq ↑(τ d))⁻¹] d:ℕ⊢ star ↑(τ d) = (starRingEnd ℂ) ↑(τ d) * ↑(Complex.normSq ↑(τ d))⁻¹; simp d:ℕ⊢ Complex.normSq ↑(τ d) = 1; unfold τ d:ℕ⊢ Complex.normSq
↑{ val := -Complex.exp (↑Real.pi * Complex.I / ↑d), inv := -Complex.exp (-↑Real.pi * Complex.I / ↑d), val_inv := ⋯,
inv_val := ⋯ } =
1; simp d:ℕ⊢ Complex.normSq (Complex.exp (↑Real.pi * Complex.I / ↑d)) = 1;
rw[<- Complex.sq_norm, d:ℕ⊢ ‖Complex.exp (↑Real.pi * Complex.I / ↑d)‖ ^ 2 = 1 Complex.norm_exp d:ℕ⊢ Real.exp (↑Real.pi * Complex.I / ↑d).re ^ 2 = 1] d:ℕ⊢ Real.exp (↑Real.pi * Complex.I / ↑d).re ^ 2 = 1; simp All goals completed! 🐙
omit [NeZero d] in
@[simp]
lemma tau_star : star (τ d) = (τ d)⁻¹ :=
by d:ℕ⊢ star (τ d) = (τ d)⁻¹ ext d:ℕ⊢ ↑(star (τ d)) = ↑(τ d)⁻¹; simp All goals completed! 🐙
lemma tau_star_pow (d : ℕ) (n : ℤ) [NeZero d] :
star (τ d ^ n) = (τ d)^(-n) := by d:ℕn:ℤinst✝:NeZero d⊢ star (τ d ^ n) = τ d ^ (-n)
unfold τ d:ℕn:ℤinst✝:NeZero d⊢ star
({ val := -Complex.exp (↑Real.pi * Complex.I / ↑d), inv := -Complex.exp (-↑Real.pi * Complex.I / ↑d), val_inv := ⋯,
inv_val := ⋯ } ^
n) =
{ val := -Complex.exp (↑Real.pi * Complex.I / ↑d), inv := -Complex.exp (-↑Real.pi * Complex.I / ↑d), val_inv := ⋯,
inv_val := ⋯ } ^
(-n); ext d:ℕn:ℤinst✝:NeZero d⊢ ↑(star
({ val := -Complex.exp (↑Real.pi * Complex.I / ↑d), inv := -Complex.exp (-↑Real.pi * Complex.I / ↑d),
val_inv := ⋯, inv_val := ⋯ } ^
n)) =
↑({ val := -Complex.exp (↑Real.pi * Complex.I / ↑d), inv := -Complex.exp (-↑Real.pi * Complex.I / ↑d), val_inv := ⋯,
inv_val := ⋯ } ^
(-n)); simp d:ℕn:ℤinst✝:NeZero d⊢ (-(starRingEnd ℂ) (Complex.exp (↑Real.pi * Complex.I / ↑d))) ^ n = ((-Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ n)⁻¹; rw[← Complex.exp_conj d:ℕn:ℤinst✝:NeZero d⊢ (-Complex.exp ((starRingEnd ℂ) (↑Real.pi * Complex.I / ↑d))) ^ n = ((-Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ n)⁻¹] d:ℕn:ℤinst✝:NeZero d⊢ (-Complex.exp ((starRingEnd ℂ) (↑Real.pi * Complex.I / ↑d))) ^ n = ((-Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ n)⁻¹; simp d:ℕn:ℤinst✝:NeZero d⊢ (-Complex.exp (-(↑Real.pi * Complex.I) / ↑d)) ^ n = ((-Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ n)⁻¹;
rw [← neg_one_mul, d:ℕn:ℤinst✝:NeZero d⊢ (-1 * Complex.exp (-(↑Real.pi * Complex.I) / ↑d)) ^ n = ((-Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ n)⁻¹ mul_zpow d:ℕn:ℤinst✝:NeZero d⊢ (-1) ^ n * Complex.exp (-(↑Real.pi * Complex.I) / ↑d) ^ n = ((-Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ n)⁻¹] d:ℕn:ℤinst✝:NeZero d⊢ (-1) ^ n * Complex.exp (-(↑Real.pi * Complex.I) / ↑d) ^ n = ((-Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ n)⁻¹; nth_rw 3 [← neg_one_mul d:ℕn:ℤinst✝:NeZero d⊢ (-1) ^ n * Complex.exp (-(↑Real.pi * Complex.I) / ↑d) ^ n = ((-1 * Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ n)⁻¹] d:ℕn:ℤinst✝:NeZero d⊢ (-1) ^ n * Complex.exp (-(↑Real.pi * Complex.I) / ↑d) ^ n = ((-1 * Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ n)⁻¹; rw[mul_zpow d:ℕn:ℤinst✝:NeZero d⊢ (-1) ^ n * Complex.exp (-(↑Real.pi * Complex.I) / ↑d) ^ n = ((-1) ^ n * Complex.exp (↑Real.pi * Complex.I / ↑d) ^ n)⁻¹] d:ℕn:ℤinst✝:NeZero d⊢ (-1) ^ n * Complex.exp (-(↑Real.pi * Complex.I) / ↑d) ^ n = ((-1) ^ n * Complex.exp (↑Real.pi * Complex.I / ↑d) ^ n)⁻¹; simp d:ℕn:ℤinst✝:NeZero d⊢ (-1) ^ n * Complex.exp (-(↑Real.pi * Complex.I) / ↑d) ^ n =
(Complex.exp (↑Real.pi * Complex.I / ↑d) ^ n)⁻¹ * ((-1) ^ n)⁻¹;
rw [<- Complex.exp_int_mul, d:ℕn:ℤinst✝:NeZero d⊢ (-1) ^ n * Complex.exp (↑n * (-(↑Real.pi * Complex.I) / ↑d)) =
(Complex.exp (↑Real.pi * Complex.I / ↑d) ^ n)⁻¹ * ((-1) ^ n)⁻¹ <- Complex.exp_int_mul, d:ℕn:ℤinst✝:NeZero d⊢ (-1) ^ n * Complex.exp (↑n * (-(↑Real.pi * Complex.I) / ↑d)) =
(Complex.exp (↑n * (↑Real.pi * Complex.I / ↑d)))⁻¹ * ((-1) ^ n)⁻¹ <- Complex.exp_neg d:ℕn:ℤinst✝:NeZero d⊢ (-1) ^ n * Complex.exp (↑n * (-(↑Real.pi * Complex.I) / ↑d)) =
Complex.exp (-(↑n * (↑Real.pi * Complex.I / ↑d))) * ((-1) ^ n)⁻¹] d:ℕn:ℤinst✝:NeZero d⊢ (-1) ^ n * Complex.exp (↑n * (-(↑Real.pi * Complex.I) / ↑d)) =
Complex.exp (-(↑n * (↑Real.pi * Complex.I / ↑d))) * ((-1) ^ n)⁻¹;
rw [mul_comm, d:ℕn:ℤinst✝:NeZero d⊢ Complex.exp (↑n * (-(↑Real.pi * Complex.I) / ↑d)) * (-1) ^ n =
Complex.exp (-(↑n * (↑Real.pi * Complex.I / ↑d))) * ((-1) ^ n)⁻¹ ← neg_one_mul d:ℕn:ℤinst✝:NeZero d⊢ Complex.exp (↑n * (-1 * (↑Real.pi * Complex.I) / ↑d)) * (-1) ^ n =
Complex.exp (-(↑n * (↑Real.pi * Complex.I / ↑d))) * ((-1) ^ n)⁻¹] d:ℕn:ℤinst✝:NeZero d⊢ Complex.exp (↑n * (-1 * (↑Real.pi * Complex.I) / ↑d)) * (-1) ^ n =
Complex.exp (-(↑n * (↑Real.pi * Complex.I / ↑d))) * ((-1) ^ n)⁻¹; nth_rw 3 [← neg_one_mul d:ℕn:ℤinst✝:NeZero d⊢ Complex.exp (↑n * (-1 * (↑Real.pi * Complex.I) / ↑d)) * (-1) ^ n =
Complex.exp (-1 * (↑n * (↑Real.pi * Complex.I / ↑d))) * ((-1) ^ n)⁻¹] d:ℕn:ℤinst✝:NeZero d⊢ Complex.exp (↑n * (-1 * (↑Real.pi * Complex.I) / ↑d)) * (-1) ^ n =
Complex.exp (-1 * (↑n * (↑Real.pi * Complex.I / ↑d))) * ((-1) ^ n)⁻¹; sorry All goals completed! 🐙 -- rw[Units.inv_pow_eq_pow_inv (-1) n]
τ^2 = ω.
τ^2 = (-\exp(πi/d))^2 = (-1)^2 · (\exp(πi/d))^2 = 1 · \exp(2πi/d) = ω.
Lean code for Lemma2.11
Associated Lean declarations
-
tau_sq_eq_omega[complete]
-
tau_sq_eq_omega[complete]
@[simp]
lemma tau_sq_eq_omega (d : ℕ) [NeZero d] : (τ d)^2 = ω d := by d:ℕinst✝:NeZero d⊢ τ d ^ 2 = ω d
unfold τ ω d:ℕinst✝:NeZero d⊢ { val := -Complex.exp (↑Real.pi * Complex.I / ↑d), inv := -Complex.exp (-↑Real.pi * Complex.I / ↑d), val_inv := ⋯,
inv_val := ⋯ } ^
2 =
{ val := Complex.exp (2 * ↑Real.pi * Complex.I / ↑d), inv := Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d),
val_inv := ⋯, inv_val := ⋯ }; ext d:ℕinst✝:NeZero d⊢ ↑({ val := -Complex.exp (↑Real.pi * Complex.I / ↑d), inv := -Complex.exp (-↑Real.pi * Complex.I / ↑d), val_inv := ⋯,
inv_val := ⋯ } ^
2) =
↑{ val := Complex.exp (2 * ↑Real.pi * Complex.I / ↑d), inv := Complex.exp (-2 * ↑Real.pi * Complex.I / ↑d),
val_inv := ⋯, inv_val := ⋯ }; simp d:ℕinst✝:NeZero d⊢ Complex.exp (↑Real.pi * Complex.I / ↑d) ^ 2 = Complex.exp (2 * ↑Real.pi * Complex.I / ↑d); rw[<- Complex.exp_nsmul d:ℕinst✝:NeZero d⊢ Complex.exp (2 • (↑Real.pi * Complex.I / ↑d)) = Complex.exp (2 * ↑Real.pi * Complex.I / ↑d)] d:ℕinst✝:NeZero d⊢ Complex.exp (2 • (↑Real.pi * Complex.I / ↑d)) = Complex.exp (2 * ↑Real.pi * Complex.I / ↑d); simp d:ℕinst✝:NeZero d⊢ Complex.exp (2 * (↑Real.pi * Complex.I / ↑d)) = Complex.exp (2 * ↑Real.pi * Complex.I / ↑d); rw[mul_assoc, d:ℕinst✝:NeZero d⊢ Complex.exp (2 * (↑Real.pi * Complex.I / ↑d)) = Complex.exp (2 * (↑Real.pi * Complex.I) / ↑d) <- mul_div_assoc d:ℕinst✝:NeZero d⊢ Complex.exp (2 * (↑Real.pi * Complex.I) / ↑d) = Complex.exp (2 * (↑Real.pi * Complex.I) / ↑d)] All goals completed! 🐙;
-
tau_pow_d_eq_one_of_odd[complete] -
tau_pow_d_eq_one_of_odd.neg_one_pow_odd[complete]
If d is odd then τ^d = 1.
τ^d = (-\exp(πi/d))^d = (-1)^d · (\exp(πi/d))^d = (-1)^d · \exp(πi) = (-1)^d · (-1) = (-1)^{d+1} = 1 when d is odd.
Lean code for Lemma2.12
Associated Lean declarations
-
tau_pow_d_eq_one_of_odd[complete]
-
tau_pow_d_eq_one_of_odd.neg_one_pow_odd[complete]
-
tau_pow_d_eq_one_of_odd[complete] -
tau_pow_d_eq_one_of_odd.neg_one_pow_odd[complete]
@[simp]
lemma tau_pow_d_eq_one_of_odd (hodd : Odd d) :
(τ d)^d = 1 := by d:ℕhnezero:NeZero dhodd:Odd d⊢ τ d ^ d = 1
unfold τ d:ℕhnezero:NeZero dhodd:Odd d⊢ { val := -Complex.exp (↑Real.pi * Complex.I / ↑d), inv := -Complex.exp (-↑Real.pi * Complex.I / ↑d), val_inv := ⋯,
inv_val := ⋯ } ^
d =
1; ext d:ℕhnezero:NeZero dhodd:Odd d⊢ ↑({ val := -Complex.exp (↑Real.pi * Complex.I / ↑d), inv := -Complex.exp (-↑Real.pi * Complex.I / ↑d), val_inv := ⋯,
inv_val := ⋯ } ^
d) =
↑1; simp d:ℕhnezero:NeZero dhodd:Odd d⊢ (-Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ d = 1; rw [← neg_one_mul, d:ℕhnezero:NeZero dhodd:Odd d⊢ (-1 * Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ d = 1 mul_pow, d:ℕhnezero:NeZero dhodd:Odd d⊢ (-1) ^ d * Complex.exp (↑Real.pi * Complex.I / ↑d) ^ d = 1 neg_one_pow_odd d hodd d:ℕhnezero:NeZero dhodd:Odd d⊢ -1 * Complex.exp (↑Real.pi * Complex.I / ↑d) ^ d = 1] d:ℕhnezero:NeZero dhodd:Odd d⊢ -1 * Complex.exp (↑Real.pi * Complex.I / ↑d) ^ d = 1
rw[<- Complex.exp_nsmul d:ℕhnezero:NeZero dhodd:Odd d⊢ -1 * Complex.exp (d • (↑Real.pi * Complex.I / ↑d)) = 1] d:ℕhnezero:NeZero dhodd:Odd d⊢ -1 * Complex.exp (d • (↑Real.pi * Complex.I / ↑d)) = 1; simp d:ℕhnezero:NeZero dhodd:Odd d⊢ -Complex.exp (↑d * (↑Real.pi * Complex.I / ↑d)) = 1;
rw[mul_comm d:ℕhnezero:NeZero dhodd:Odd d⊢ -Complex.exp (↑Real.pi * Complex.I / ↑d * ↑d) = 1] d:ℕhnezero:NeZero dhodd:Odd d⊢ -Complex.exp (↑Real.pi * Complex.I / ↑d * ↑d) = 1; simp All goals completed! 🐙
where
neg_one_pow_odd : ∀ x : ℕ, Odd x → (((-1) : ℂ)) ^ x = (-1) :=
by d:ℕhnezero:NeZero dhodd:Odd d⊢ ∀ (x : ℕ), Odd x → (-1) ^ x = -1 intro x hoddx d:ℕhnezero:NeZero dhodd:Odd dx:ℕhoddx:Odd x⊢ (-1) ^ x = -1; rw[neg_one_pow_eq_neg_one_iff_odd d:ℕhnezero:NeZero dhodd:Odd dx:ℕhoddx:Odd x⊢ Odd xd:ℕhnezero:NeZero dhodd:Odd dx:ℕhoddx:Odd x⊢ -1 ≠ 1] d:ℕhnezero:NeZero dhodd:Odd dx:ℕhoddx:Odd x⊢ Odd xd:ℕhnezero:NeZero dhodd:Odd dx:ℕhoddx:Odd x⊢ -1 ≠ 1; apply hoddx d:ℕhnezero:NeZero dhodd:Odd dx:ℕhoddx:Odd x⊢ -1 ≠ 1; norm_num All goals completed! 🐙
τ^{d^2} = 1.
τ^{d^2} = (-\exp(πi/d))^{d^2} = (-1)^{d^2} · (-1)^d = (-1)^{d(d+1)} = 1
since either d or d+1 is even.
Lean code for Lemma2.13
Associated Lean declarations
-
tau_pow_d2_one[complete]
-
tau_pow_d2_one[complete]
lemma tau_pow_d2_one : (τ d) ^ (d ^ 2) = 1 := by d:ℕhnezero:NeZero d⊢ τ d ^ d ^ 2 = 1
unfold τ d:ℕhnezero:NeZero d⊢ { val := -Complex.exp (↑Real.pi * Complex.I / ↑d), inv := -Complex.exp (-↑Real.pi * Complex.I / ↑d), val_inv := ⋯,
inv_val := ⋯ } ^
d ^ 2 =
1; ext d:ℕhnezero:NeZero d⊢ ↑({ val := -Complex.exp (↑Real.pi * Complex.I / ↑d), inv := -Complex.exp (-↑Real.pi * Complex.I / ↑d), val_inv := ⋯,
inv_val := ⋯ } ^
d ^ 2) =
↑1; simp d:ℕhnezero:NeZero d⊢ (-Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ d ^ 2 = 1
rw [← neg_one_mul d:ℕhnezero:NeZero d⊢ (-1 * Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ d ^ 2 = 1] d:ℕhnezero:NeZero d⊢ (-1 * Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ d ^ 2 = 1
rw [pow_two d:ℕhnezero:NeZero d⊢ (-1 * Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ (d * d) = 1] d:ℕhnezero:NeZero d⊢ (-1 * Complex.exp (↑Real.pi * Complex.I / ↑d)) ^ (d * d) = 1
rw [mul_pow d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * Complex.exp (↑Real.pi * Complex.I / ↑d) ^ (d * d) = 1] d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * Complex.exp (↑Real.pi * Complex.I / ↑d) ^ (d * d) = 1;
rw [← Complex.exp_nat_mul d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * Complex.exp (↑(d * d) * (↑Real.pi * Complex.I / ↑d)) = 1] d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * Complex.exp (↑(d * d) * (↑Real.pi * Complex.I / ↑d)) = 1
rw [Nat.cast_mul d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * Complex.exp (↑d * ↑d * (↑Real.pi * Complex.I / ↑d)) = 1] d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * Complex.exp (↑d * ↑d * (↑Real.pi * Complex.I / ↑d)) = 1
rw [mul_assoc d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * Complex.exp (↑d * (↑d * (↑Real.pi * Complex.I / ↑d))) = 1] d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * Complex.exp (↑d * (↑d * (↑Real.pi * Complex.I / ↑d))) = 1
rw [IsUnit.mul_div_cancel d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * Complex.exp (↑d * (↑Real.pi * Complex.I)) = 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d] d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * Complex.exp (↑d * (↑Real.pi * Complex.I)) = 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d
rw [Complex.exp_nat_mul d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * Complex.exp (↑Real.pi * Complex.I) ^ d = 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d] d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * Complex.exp (↑Real.pi * Complex.I) ^ d = 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d
rw [Complex.exp_pi_mul_I d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * (-1) ^ d = 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d] d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d) * (-1) ^ d = 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d
rw [← pow_add d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d + d) = 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d] d:ℕhnezero:NeZero d⊢ (-1) ^ (d * d + d) = 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d
rw [← mul_add_one d:ℕhnezero:NeZero d⊢ (-1) ^ (d * (d + 1)) = 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d] d:ℕhnezero:NeZero d⊢ (-1) ^ (d * (d + 1)) = 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d
rw [neg_one_pow_eq_one_iff_even d:ℕhnezero:NeZero d⊢ Even (d * (d + 1))d:ℕhnezero:NeZero d⊢ -1 ≠ 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d] d:ℕhnezero:NeZero d⊢ Even (d * (d + 1))d:ℕhnezero:NeZero d⊢ -1 ≠ 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d
exact Nat.even_mul_succ_self d d:ℕhnezero:NeZero d⊢ -1 ≠ 1h d:ℕhnezero:NeZero d⊢ IsUnit ↑d
· d:ℕhnezero:NeZero d⊢ -1 ≠ 1 norm_num All goals completed! 🐙
· h d:ℕhnezero:NeZero d⊢ IsUnit ↑d exact d_invertible d All goals completed! 🐙
Lean code
Associated Lean declarations
-
mod_d_nonneg[complete]
-
tau_pow_n_mod_d_of_d_odd[complete]
-
mod_d_nonneg[complete] -
tau_pow_n_mod_d_of_d_odd[complete]
lemma mod_d_nonneg (a : ℤ) : 0 ≤ a % ↑d := by d:ℕhnezero:NeZero da:ℤ⊢ 0 ≤ a % ↑d
apply Int.emod_nonneg d:ℕhnezero:NeZero da:ℤ⊢ ↑d ≠ 0
exact Nat.cast_ne_zero.mpr (NeZero.ne d) All goals completed! 🐙
theorem tau_pow_n_mod_d_of_d_odd
(n d : ℕ) (hodd : Odd d) [NeZero d] :
τ d ^ n = τ d ^ (n % ↑d) :=
pow_eq_pow_mod n (tau_pow_d_eq_one_of_odd d hodd)

