Theorem: Real.map_matrix_volume_pi_eq_smul_volume_pi
File: Mathlib/MeasureTheory/Measure/Lebesgue/Basic.lean

tactic: apply diagonal_transvection_induction_of_det_ne_zero _ M hM
state_before: ι : Type u_1
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
M : Matrix ι ι ℝ
hM : det M ≠ 0
⊢ Measure.map (↑(↑toLin' M)) volume = ofReal (abs (det M)⁻¹) • volume

tactic: intro D hD
state_before: case hdiag
ι : Type u_1
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
M : Matrix ι ι ℝ
hM : det M ≠ 0
⊢ ∀ (D : ι → ℝ),
    det (Matrix.diagonal D) ≠ 0 →
      Measure.map (↑(↑toLin' (Matrix.diagonal D))) volume = ofReal (abs (det (Matrix.diagonal D))⁻¹) • volume

tactic: conv_rhs => rw [← smul_map_diagonal_volume_pi hD]
state_before: case hdiag
ι : Type u_1
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
M : Matrix ι ι ℝ
hM : det M ≠ 0
D : ι → ℝ
hD : det (Matrix.diagonal D) ≠ 0
⊢ Measure.map (↑(↑toLin' (Matrix.diagonal D))) volume = ofReal (abs (det (Matrix.diagonal D))⁻¹) • volume

tactic: rw [smul_smul, ← ENNReal.ofReal_mul (abs_nonneg _), ← abs_mul, inv_mul_cancel hD, abs_one,
  ENNReal.ofReal_one, one_smul]
state_before: case hdiag
ι : Type u_1
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
M : Matrix ι ι ℝ
hM : det M ≠ 0
D : ι → ℝ
hD : det (Matrix.diagonal D) ≠ 0
⊢ Measure.map (↑(↑toLin' (Matrix.diagonal D))) volume =
    ofReal (abs (det (Matrix.diagonal D))⁻¹) •
      ofReal (abs (det (Matrix.diagonal D))) • Measure.map (↑(↑toLin' (Matrix.diagonal D))) volume

tactic: intro t
state_before: case htransvec
ι : Type u_1
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
M : Matrix ι ι ℝ
hM : det M ≠ 0
⊢ ∀ (t : TransvectionStruct ι ℝ),
    Measure.map (↑(↑toLin' (TransvectionStruct.toMatrix t))) volume =
      ofReal (abs (det (TransvectionStruct.toMatrix t))⁻¹) • volume

tactic: simp only [Matrix.TransvectionStruct.det, ENNReal.ofReal_one,
  (volume_preserving_transvectionStruct _).map_eq, one_smul, _root_.inv_one, abs_one]
state_before: case htransvec
ι : Type u_1
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
M : Matrix ι ι ℝ
hM : det M ≠ 0
t : TransvectionStruct ι ℝ
⊢ Measure.map (↑(↑toLin' (TransvectionStruct.toMatrix t))) volume =
    ofReal (abs (det (TransvectionStruct.toMatrix t))⁻¹) • volume

tactic: intro A B _ _ IHA IHB
state_before: case hmul
ι : Type u_1
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
M : Matrix ι ι ℝ
hM : det M ≠ 0
⊢ ∀ (A B : Matrix ι ι ℝ),
    det A ≠ 0 →
      det B ≠ 0 →
        Measure.map (↑(↑toLin' A)) volume = ofReal (abs (det A)⁻¹) • volume →
          Measure.map (↑(↑toLin' B)) volume = ofReal (abs (det B)⁻¹) • volume →
            Measure.map (↑(↑toLin' (A ⬝ B))) volume = ofReal (abs (det (A ⬝ B))⁻¹) • volume

tactic: rw [toLin'_mul, det_mul, LinearMap.coe_comp, ← Measure.map_map, IHB, Measure.map_smul, IHA,
  smul_smul, ← ENNReal.ofReal_mul (abs_nonneg _), ← abs_mul, mul_comm, mul_inv]
state_before: case hmul
ι : Type u_1
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
M : Matrix ι ι ℝ
hM : det M ≠ 0
A B : Matrix ι ι ℝ
a✝¹ : det A ≠ 0
a✝ : det B ≠ 0
IHA : Measure.map (↑(↑toLin' A)) volume = ofReal (abs (det A)⁻¹) • volume
IHB : Measure.map (↑(↑toLin' B)) volume = ofReal (abs (det B)⁻¹) • volume
⊢ Measure.map (↑(↑toLin' (A ⬝ B))) volume = ofReal (abs (det (A ⬝ B))⁻¹) • volume

tactic: apply Continuous.measurable
state_before: case hmul.hg
ι : Type u_1
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
M : Matrix ι ι ℝ
hM : det M ≠ 0
A B : Matrix ι ι ℝ
a✝¹ : det A ≠ 0
a✝ : det B ≠ 0
IHA : Measure.map (↑(↑toLin' A)) volume = ofReal (abs (det A)⁻¹) • volume
IHB : Measure.map (↑(↑toLin' B)) volume = ofReal (abs (det B)⁻¹) • volume
⊢ Measurable ↑(↑toLin' A)

tactic: apply LinearMap.continuous_on_pi
state_before: case hmul.hg.hf
ι : Type u_1
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
M : Matrix ι ι ℝ
hM : det M ≠ 0
A B : Matrix ι ι ℝ
a✝¹ : det A ≠ 0
a✝ : det B ≠ 0
IHA : Measure.map (↑(↑toLin' A)) volume = ofReal (abs (det A)⁻¹) • volume
IHB : Measure.map (↑(↑toLin' B)) volume = ofReal (abs (det B)⁻¹) • volume
⊢ Continuous ↑(↑toLin' A)

tactic: apply Continuous.measurable
state_before: case hmul.hf
ι : Type u_1
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
M : Matrix ι ι ℝ
hM : det M ≠ 0
A B : Matrix ι ι ℝ
a✝¹ : det A ≠ 0
a✝ : det B ≠ 0
IHA : Measure.map (↑(↑toLin' A)) volume = ofReal (abs (det A)⁻¹) • volume
IHB : Measure.map (↑(↑toLin' B)) volume = ofReal (abs (det B)⁻¹) • volume
⊢ Measurable ↑(↑toLin' B)

tactic: apply LinearMap.continuous_on_pi
state_before: case hmul.hf.hf
ι : Type u_1
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
M : Matrix ι ι ℝ
hM : det M ≠ 0
A B : Matrix ι ι ℝ
a✝¹ : det A ≠ 0
a✝ : det B ≠ 0
IHA : Measure.map (↑(↑toLin' A)) volume = ofReal (abs (det A)⁻¹) • volume
IHB : Measure.map (↑(↑toLin' B)) volume = ofReal (abs (det B)⁻¹) • volume
⊢ Continuous ↑(↑toLin' B)