Zulip Chat Archive
Stream: mathlib4
Topic: Need help with rewriting to unfold the definition of algebra
aprilgrimoire (Dec 05 2024 at 13:58):
Hi!
Here I have a ↥G' algebra↥F , derived from G' being a subfield of ↥F. Now I have ⟨⟨a, a_in_F⟩, a_in_G⟩ • ⟨Complex.sin ↑φ * Complex.I, ⋯⟩ = 1, and I wish to unfold the definition of HSMul here to get an equation in ↥F. However, I've tried simp and rw [HSMul.hSMul instHSMul.1] at h1, but neither succeeded. How could I unfold this definition?
Here's the full code:
import Mathlib
def cyclotomic_degree_real_2 (n : ℕ) (n_gt_2 : n > 2) :
  let φ : ℝ := 2 * Real.pi / n
  let α : ℂ := Complex.exp (φ * Complex.I)
  let β : ℂ := Real.cos φ
  let ℚ_in_ℂ := Subfield.closure {(1 : Complex)}
  let F := Subfield.closure (ℚ_in_ℂ ∪ {α})
  let G := Subfield.closure (ℚ_in_ℂ ∪ {β})
  G ≤ F := by
    intros φ α β ℚ_in_ℂ F G
    have hα_inv : α⁻¹ = Complex.exp (-φ * Complex.I) := by
      unfold α
      symm
      conv =>
        lhs
        arg 1
        apply neg_mul
      have h1 := Complex.exp_neg (↑φ * Complex.I)
      exact h1
    have hα_in_F : α ∈ F := by
      have h1 : α ∈ (↑ℚ_in_ℂ ∪ {α} : Set ℂ)
      . apply Set.mem_union_right
        exact Set.mem_singleton α
      apply Subfield.subset_closure
      exact h1
    have hα_inv_in_F : α⁻¹ ∈ F := by
      apply Subfield.inv_mem'
      exact hα_in_F
    have hα_add_α_inv_in_F : α + α⁻¹ ∈ F := by
      apply Subfield.add_mem
      exact hα_in_F
      exact hα_inv_in_F
    have hα_sub_α_inv_in_F : α - α⁻¹ ∈ F := by
      apply Subfield.sub_mem
      exact hα_in_F
      exact hα_inv_in_F
    have h1 : (G ≤ F) := by
      have h2 : (ℚ_in_ℂ ∪ {β} : Set ℂ) ⊆ (↑F : Set ℂ)
      . apply Set.union_subset_iff.mpr
        apply And.intro
        case left =>
          unfold F
          have h3 : (ℚ_in_ℂ : Set ℂ) ⊆ (ℚ_in_ℂ ∪ {α} : Set ℂ)
          apply Set.subset_union_left
          apply subset_trans h3
          apply Subfield.subset_closure
        case right =>
          unfold F
          apply Set.singleton_subset_iff.mpr
          have h3 : β = (α + α⁻¹) / 2
          . unfold β
            rw [hα_inv]
            unfold α
            repeat rw [← Complex.cos_add_sin_I]
            rw [Complex.ofReal_cos]
            simp
            ring
          rw [h3]
          apply Subfield.div_mem
          exact hα_add_α_inv_in_F
          apply Subfield.subset_closure
          apply (Set.mem_union 2 ↑ℚ_in_ℂ {α}).mpr
          apply Or.inl
          have h7 : 1 ∈ ℚ_in_ℂ
          . apply Subfield.subset_closure
            apply Set.mem_singleton
          have h8 : (2 : ℂ) = 1 + 1
          . ring
          rw [h8]
          apply Subfield.add_mem ℚ_in_ℂ h7 h7
      unfold G
      apply Subfield.closure_le.mpr
      exact h2
    let G' := Subfield.comap (Subfield.subtype F) G
    have h2 : (Module.Free G' F) :=
      Module.Free.of_basis (Basis.ofVectorSpace G' F)
    let F_spanner : Fin 2 -> F :=
      have one_in_F : ((1 : ℂ) ∈ F) := by
        have h1 : 1 ∈ (↑ℚ_in_ℂ : Set ℂ) ∪ {α}
        . apply Set.mem_union_left
          unfold ℚ_in_ℂ
          apply Set.mem_of_subset_of_mem Subfield.subset_closure
          simp
        unfold F
        apply Set.mem_of_subset_of_mem Subfield.subset_closure
        exact h1
      have sinφI_in_F : ((Real.sin φ) * Complex.I ∈ F) := by
        have h1 : (Real.sin φ) * Complex.I = (α - α⁻¹) / 2
        . rw [hα_inv]
          unfold α
          repeat rw [← Complex.cos_add_sin_I]
          simp
        have h2 : (α - α⁻¹) / 2 ∈ F
        . apply Subfield.mul_mem
          exact hα_sub_α_inv_in_F
          have h3 := SubfieldClass.ratCast_mem F (2⁻¹ : ℚ)
          conv at h3 =>
            rhs
            simp
          exact h3
        rw [h1]
        exact h2
          -- rw [← WithZero.coe_inv (2 : ℚ)] at h3
      ![⟨1, one_in_F⟩, ⟨(Real.sin φ) * Complex.I, sinφI_in_F⟩]
    have F_spanner_linear_indep : LinearIndependent G' F_spanner := by
      apply linearIndependent_fin2.mpr
      unfold F_spanner
      simp
      apply And.intro
      . apply Subtype.coe_ne_coe.mp
        simp
        have h1 : φ ∈ Set.Ioo 0 Real.pi
        . apply Set.mem_Ioo.mpr
          apply And.intro
          . unfold φ
            apply div_pos
            apply mul_pos
            simp
            exact Real.pi_pos
            have h2 : (0 : ℝ) < 2 := by
              simp
            apply lt_trans h2
            apply GT.gt.lt
            simp
            exact n_gt_2
          . have h2 : Real.pi = 2 * Real.pi / 2
            . simp
            have h3 :=
              have ha : 0 < 2 * Real.pi := by
                apply Left.mul_pos
                simp
                exact Real.pi_pos
              have hb : (0 : ℝ) < 2 := by
                simp
              have hc : (0 : ℝ) < n := by
                simp
                have hc1 : 0 < 2 := by
                  simp
                apply LT.lt.trans hc1
                apply GT.gt.lt
                exact n_gt_2
            (div_lt_div_iff_of_pos_left ha hc hb).mpr
            unfold φ
            nth_rw 2 [h2]
            apply h3
            simp
            apply GT.gt.lt
            exact n_gt_2
        suffices h2 : 0 < Real.sin φ by
          rw [← Complex.ofReal_sin]
          have h3 : (0 : ℂ) = ↑(0 : ℝ) := by
            simp
          rw [h3]
          rw [Complex.ofReal_inj]
          apply ne_of_gt
          exact h2
        apply Real.sin_pos_of_mem_Ioo
        exact h1
      . intro a a_in_F a_in_G
        intro h1
        apply_fun Subtype.val at h1
        simp at h1
        rw [HSMul.hSMul] at h1
        rw [instHSMul.1] at h1
        /-
        rw [← Subfield.coe_one] at h1
        apply_fun Subtype.val at h1
        simp at h1
        -/
    let F' := Submodule.span G' (Set.range F_spanner)
    exact h1
Kim Morrison (Dec 05 2024 at 22:19):
This thread is perhaps duplicated by #mathlib4 > Rewriting and simplifying yielded inferInstance.1.1 . Perhaps discussion should continue there, where Ruben has asked for a #mwe.
Last updated: May 02 2025 at 03:31 UTC