Theorem: NumberField.InfinitePlace.prod_eq_abs_norm
File: Mathlib/NumberTheory/NumberField/Embeddings.lean

tactic: convert (congr_arg Complex.abs (@Algebra.norm_eq_prod_embeddings ℚ _ _ _ _ ℂ _ _ _ _ _ x)).symm
state_before: k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
⊢ ∏ w : InfinitePlace K, w x ^ w.mult = ↑|(Algebra.norm ℚ) x|
state_after: case h.e'_2
k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
⊢ ∏ w : InfinitePlace K, w x ^ w.mult = Complex.abs (∏ σ : K →ₐ[ℚ] ℂ, σ x)

case h.e'_3
k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
⊢ ↑|(Algebra.norm ℚ) x| = Complex.abs ((algebraMap ℚ ℂ) ((Algebra.norm ℚ) x))

tactic: rw [map_prod, ← Fintype.prod_equiv RingHom.equivRatAlgHom (fun f => Complex.abs (f x))
  (fun φ => Complex.abs (φ x)) fun _ => by simp [RingHom.equivRatAlgHom_apply]; rfl]
state_before: case h.e'_2
k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
⊢ ∏ w : InfinitePlace K, w x ^ w.mult = Complex.abs (∏ σ : K →ₐ[ℚ] ℂ, σ x)
state_after: case h.e'_2
k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
⊢ ∏ w : InfinitePlace K, w x ^ w.mult = ∏ x_1 : K →+* ℂ, Complex.abs (x_1 x)

tactic: rw [← Finset.prod_fiberwise Finset.univ (fun φ => mk φ) (fun φ => Complex.abs (φ x))]
state_before: case h.e'_2
k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
⊢ ∏ w : InfinitePlace K, w x ^ w.mult = ∏ x_1 : K →+* ℂ, Complex.abs (x_1 x)
state_after: case h.e'_2
k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
⊢ ∏ w : InfinitePlace K, w x ^ w.mult =
    ∏ j : InfinitePlace K, ∏ i ∈ Finset.filter (fun i => mk i = j) Finset.univ, Complex.abs (i x)

tactic: have : ∀ w : InfinitePlace K, ∀ φ ∈ Finset.filter (fun a ↦ mk a = w) Finset.univ,
    Complex.abs (φ x) = w x := by
  intro _ _ hφ
  rw [← (Finset.mem_filter.mp hφ).2]
  rfl
state_before: case h.e'_2
k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
⊢ ∏ w : InfinitePlace K, w x ^ w.mult =
    ∏ j : InfinitePlace K, ∏ i ∈ Finset.filter (fun i => mk i = j) Finset.univ, Complex.abs (i x)
state_after: case h.e'_2
k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
this : ∀ (w : InfinitePlace K), ∀ φ ∈ Finset.filter (fun a => mk a = w) Finset.univ, Complex.abs (φ x) = w x
⊢ ∏ w : InfinitePlace K, w x ^ w.mult =
    ∏ j : InfinitePlace K, ∏ i ∈ Finset.filter (fun i => mk i = j) Finset.univ, Complex.abs (i x)

tactic: simp_rw [Finset.prod_congr rfl (this _), Finset.prod_const, card_filter_mk_eq]
state_before: case h.e'_2
k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
this : ∀ (w : InfinitePlace K), ∀ φ ∈ Finset.filter (fun a => mk a = w) Finset.univ, Complex.abs (φ x) = w x
⊢ ∏ w : InfinitePlace K, w x ^ w.mult =
    ∏ j : InfinitePlace K, ∏ i ∈ Finset.filter (fun i => mk i = j) Finset.univ, Complex.abs (i x)
state_after: no goals

tactic: simp [RingHom.equivRatAlgHom_apply]
state_before: k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
x✝ : K →+* ℂ
⊢ (fun f => Complex.abs (f x)) x✝ = (fun φ => Complex.abs (φ x)) (RingHom.equivRatAlgHom x✝)
state_after: k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
x✝ : K →+* ℂ
⊢ Complex.abs (x✝ x) = Complex.abs (x✝.toRatAlgHom x)

tactic: rfl
state_before: k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
x✝ : K →+* ℂ
⊢ Complex.abs (x✝ x) = Complex.abs (x✝.toRatAlgHom x)
state_after: no goals

tactic: intro _ _ hφ
state_before: k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
⊢ ∀ (w : InfinitePlace K), ∀ φ ∈ Finset.filter (fun a => mk a = w) Finset.univ, Complex.abs (φ x) = w x
state_after: k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
w✝ : InfinitePlace K
φ✝ : K →+* ℂ
hφ : φ✝ ∈ Finset.filter (fun a => mk a = w✝) Finset.univ
⊢ Complex.abs (φ✝ x) = w✝ x

tactic: rw [← (Finset.mem_filter.mp hφ).2]
state_before: k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
w✝ : InfinitePlace K
φ✝ : K →+* ℂ
hφ : φ✝ ∈ Finset.filter (fun a => mk a = w✝) Finset.univ
⊢ Complex.abs (φ✝ x) = w✝ x
state_after: k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
w✝ : InfinitePlace K
φ✝ : K →+* ℂ
hφ : φ✝ ∈ Finset.filter (fun a => mk a = w✝) Finset.univ
⊢ Complex.abs (φ✝ x) = (mk φ✝) x

tactic: rfl
state_before: k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
w✝ : InfinitePlace K
φ✝ : K →+* ℂ
hφ : φ✝ ∈ Finset.filter (fun a => mk a = w✝) Finset.univ
⊢ Complex.abs (φ✝ x) = (mk φ✝) x
state_after: no goals

tactic: rw [eq_ratCast, Rat.cast_abs, ← Complex.abs_ofReal, Complex.ofReal_ratCast]
state_before: case h.e'_3
k : Type u_1
inst✝³ : Field k
K : Type u_2
inst✝² : Field K
F : Type u_3
inst✝¹ : Field F
inst✝ : NumberField K
x : K
⊢ ↑|(Algebra.norm ℚ) x| = Complex.abs ((algebraMap ℚ ℂ) ((Algebra.norm ℚ) x))
state_after: no goals