Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit cf7a725

Browse files
committed
refactor(algebra/quaternion): remove quaternion.conj (#18803)
Instead we use `star` directly. We keep only the lemmas that refer to quaternion-specific operators, as the rest are already covered by the star API. In practice, this is mostly the lemmas about the real and imaginary parts of quaternions. The `commute_self_conj` lemma has been replaced by a `is_star_normal` instance.
1 parent f2b757f commit cf7a725

File tree

4 files changed

+105
-191
lines changed

4 files changed

+105
-191
lines changed

src/algebra/quaternion.lean

Lines changed: 89 additions & 170 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ algebraic structures on `ℍ[R]`.
2222
[quaternion algebra](https://en.wikipedia.org/wiki/Quaternion_algebra) with coefficients `a`, `b`
2323
* `quaternion R`, `ℍ[R]` : the space of quaternions, a.k.a. `quaternion_algebra R (-1) (-1)`;
2424
* `quaternion.norm_sq` : square of the norm of a quaternion;
25-
* `quaternion.conj` : conjugate of a quaternion;
25+
* `quaternion.star_ring` : provides the conjugate of a quaternion as `has_star.star`;
2626
2727
We also define the following algebraic structures on `ℍ[R]`:
2828
@@ -339,79 +339,48 @@ by rw [← coe_commutes, coe_mul_eq_smul]
339339
lemma smul_coe : x • (y : ℍ[R, c₁, c₂]) = ↑(x * y) := by rw [coe_mul, coe_mul_eq_smul]
340340

341341
/-- Quaternion conjugate. -/
342-
def conj : ℍ[R, c₁, c₂] ≃ₗ[R] ℍ[R, c₁, c₂] :=
343-
linear_equiv.of_involutive
344-
{ to_fun := λ a, ⟨a.1, -a.2, -a.3, -a.4⟩,
345-
map_add' := λ a b, by ext; simp [neg_add],
346-
map_smul' := λ r a, by ext; simp } $
347-
λ a, by simp
348-
349-
@[simp] lemma re_conj : (conj a).re = a.re := rfl
350-
@[simp] lemma im_i_conj : (conj a).im_i = - a.im_i := rfl
351-
@[simp] lemma im_j_conj : (conj a).im_j = - a.im_j := rfl
352-
@[simp] lemma im_k_conj : (conj a).im_k = - a.im_k := rfl
353-
@[simp] lemma im_conj : (conj a).im = - a.im := ext _ _ neg_zero.symm rfl rfl rfl
354-
355-
@[simp] lemma conj_mk (a₁ a₂ a₃ a₄ : R) :
356-
conj (mk a₁ a₂ a₃ a₄ : ℍ[R, c₁, c₂]) = ⟨a₁, -a₂, -a₃, -a₄⟩ :=
357-
rfl
358-
359-
@[simp] lemma conj_conj : a.conj.conj = a := ext _ _ rfl (neg_neg _) (neg_neg _) (neg_neg _)
342+
instance : has_star ℍ[R, c₁, c₂] :=
343+
{ star := λ a, ⟨a.1, -a.2, -a.3, -a.4⟩ }
360344

361-
lemma conj_add : (a + b).conj = a.conj + b.conj := conj.map_add a b
345+
@[simp] lemma re_star : (star a).re = a.re := rfl
346+
@[simp] lemma im_i_star : (star a).im_i = - a.im_i := rfl
347+
@[simp] lemma im_j_star : (star a).im_j = - a.im_j := rfl
348+
@[simp] lemma im_k_star : (star a).im_k = - a.im_k := rfl
349+
@[simp] lemma im_star : (star a).im = - a.im := ext _ _ neg_zero.symm rfl rfl rfl
362350

363-
@[simp] lemma conj_mul : (a * b).conj = b.conj * a.conj := by ext; simp; ring_exp
351+
@[simp] lemma star_mk (a₁ a₂ a₃ a₄ : R) :
352+
star (mk a₁ a₂ a₃ a₄ : ℍ[R, c₁, c₂]) = ⟨a₁, -a₂, -a₃, -a₄⟩ :=
353+
rfl
364354

365355
instance : star_ring ℍ[R, c₁, c₂] :=
366-
{ star := conj,
367-
star_involutive := conj_conj,
368-
star_add := conj_add,
369-
star_mul := conj_mul }
370-
371-
@[simp] lemma star_def (a : ℍ[R, c₁, c₂]) : star a = conj a := rfl
372-
373-
lemma conj_conj_mul : (a.conj * b).conj = b.conj * a := star_star_mul _ _
356+
{ star_involutive := λ x, by simp [has_star.star],
357+
star_add := λ a b, by ext; simp [neg_add],
358+
star_mul := λ a b, by ext; simp; ring_exp }
374359

375-
lemma conj_mul_conj : (a * b.conj).conj = b * a.conj := star_mul_star _ _
360+
lemma self_add_star' : a + star a = ↑(2 * a.re) := by ext; simp [two_mul]
376361

377-
lemma self_add_conj' : a + a.conj = ↑(2 * a.re) := by ext; simp [two_mul]
362+
lemma self_add_star : a + star a = 2 * a.re :=
363+
by simp only [self_add_star', two_mul, coe_add]
378364

379-
lemma self_add_conj : a + a.conj = 2 * a.re :=
380-
by simp only [self_add_conj', two_mul, coe_add]
365+
lemma star_add_self' : star a + a = ↑(2 * a.re) := by rw [add_comm, self_add_star']
381366

382-
lemma conj_add_self' : a.conj + a = ↑(2 * a.re) := by rw [add_comm, self_add_conj']
367+
lemma star_add_self : star a + a = 2 * a.re := by rw [add_comm, self_add_star]
383368

384-
lemma conj_add_self : a.conj + a = 2 * a.re := by rw [add_comm, self_add_conj]
369+
lemma star_eq_two_re_sub : star a = ↑(2 * a.re) - a := eq_sub_iff_add_eq.2 a.star_add_self'
385370

386-
lemma conj_eq_two_re_sub : a.conj = ↑(2 * a.re) - a := eq_sub_iff_add_eq.2 a.conj_add_self'
387-
388-
lemma commute_conj_self : commute a.conj a :=
389-
begin
390-
rw [a.conj_eq_two_re_sub],
371+
instance : is_star_normal a := ⟨begin
372+
rw [a.star_eq_two_re_sub],
391373
exact (coe_commute (2 * a.re) a).sub_left (commute.refl a)
392-
end
393-
394-
lemma commute_self_conj : commute a a.conj :=
395-
a.commute_conj_self.symm
374+
end
396375

397-
lemma commute_conj_conj {a b : ℍ[R, c₁, c₂]} (h : commute a b) : commute a.conj b.conj :=
398-
h.star_star
376+
@[simp, norm_cast] lemma star_coe : star (x : ℍ[R, c₁, c₂]) = x := by ext; simp
399377

400-
@[simp, norm_cast] lemma conj_coe : conj (x : ℍ[R, c₁, c₂]) = x := by ext; simp
378+
@[simp] lemma star_im : star a.im = - a.im := im_star _
401379

402-
@[simp] lemma conj_im : conj a.im = - a.im := im_conj _
403-
404-
@[simp, norm_cast] lemma conj_nat_cast (n : ℕ) : conj (n : ℍ[R, c₁, c₂]) = n :=
405-
@star_nat_cast ℍ[R, c₁, c₂] _ _ n
406-
@[simp, norm_cast] lemma conj_int_cast (z : ℤ) : conj (z : ℍ[R, c₁, c₂]) = z :=
407-
@star_int_cast ℍ[R, c₁, c₂] _ _ z
408-
409-
@[simp] lemma conj_smul [monoid S] [distrib_mul_action S R] (s : S) (a : ℍ[R, c₁, c₂]) :
410-
conj (s • a) = s • conj a :=
380+
@[simp] lemma star_smul [monoid S] [distrib_mul_action S R] (s : S) (a : ℍ[R, c₁, c₂]) :
381+
star (s • a) = s • star a :=
411382
ext _ _ rfl (smul_neg _ _).symm (smul_neg _ _).symm (smul_neg _ _).symm
412383

413-
@[simp] lemma conj_one : conj (1 : ℍ[R, c₁, c₂]) = 1 := conj_coe 1
414-
415384
lemma eq_re_of_eq_coe {a : ℍ[R, c₁, c₂]} {x : R} (h : a = x) : a = a.re :=
416385
by rw [h, coe_re]
417386

@@ -423,42 +392,33 @@ section char_zero
423392
variables [no_zero_divisors R] [char_zero R]
424393

425394
@[simp]
426-
lemma conj_eq_self {c₁ c₂ : R} {a : ℍ[R, c₁, c₂]} :
427-
conj a = a ↔ a = a.re :=
395+
lemma star_eq_self {c₁ c₂ : R} {a : ℍ[R, c₁, c₂]} :
396+
star a = a ↔ a = a.re :=
428397
by simp [ext_iff, neg_eq_iff_add_eq_zero, add_self_eq_zero]
429398

430-
lemma conj_eq_neg {c₁ c₂ : R} {a : ℍ[R, c₁, c₂]} :
431-
conj a = -a ↔ a.re = 0 :=
399+
lemma star_eq_neg {c₁ c₂ : R} {a : ℍ[R, c₁, c₂]} :
400+
star a = -a ↔ a.re = 0 :=
432401
by simp [ext_iff, eq_neg_iff_add_eq_zero]
433402

434403
end char_zero
435-
-- Can't use `rw ← conj_eq_self` in the proof without additional assumptions
436-
437-
lemma conj_mul_eq_coe : conj a * a = (conj a * a).re := by ext; simp; ring_exp
438-
439-
lemma mul_conj_eq_coe : a * conj a = (a * conj a).re :=
440-
by { rw a.commute_self_conj.eq, exact a.conj_mul_eq_coe }
404+
-- Can't use `rw ← star_eq_self` in the proof without additional assumptions
441405

442-
lemma conj_zero : conj (0 : ℍ[R, c₁, c₂]) = 0 := conj.map_zero
406+
lemma star_mul_eq_coe : star a * a = (star a * a).re := by ext; simp; ring_exp
443407

444-
lemma conj_neg : (-a).conj = -a.conj := (conj : ℍ[R, c₁, c₂] ≃ₗ[R] _).map_neg a
445-
446-
lemma conj_sub : (a - b).conj = a.conj - b.conj := (conj : ℍ[R, c₁, c₂] ≃ₗ[R] _).map_sub a b
447-
448-
449-
@[simp] lemma conj_pow (n : ℕ) : (a ^ n).conj = a.conj ^ n := star_pow _ _
408+
lemma mul_star_eq_coe : a * star a = (a * star a).re :=
409+
by { rw ←star_comm_self', exact a.star_mul_eq_coe }
450410

451411
open mul_opposite
452412

453413
/-- Quaternion conjugate as an `alg_equiv` to the opposite ring. -/
454-
def conj_ae : ℍ[R, c₁, c₂] ≃ₐ[R] (ℍ[R, c₁, c₂]ᵐᵒᵖ) :=
455-
{ to_fun := op ∘ conj,
456-
inv_fun := conj ∘ unop,
414+
def star_ae : ℍ[R, c₁, c₂] ≃ₐ[R] (ℍ[R, c₁, c₂]ᵐᵒᵖ) :=
415+
{ to_fun := op ∘ star,
416+
inv_fun := star ∘ unop,
457417
map_mul' := λ x y, by simp,
458418
commutes' := λ r, by simp,
459-
.. conj.to_add_equiv.trans op_add_equiv }
419+
.. star_add_equiv.trans op_add_equiv }
460420

461-
@[simp] lemma coe_conj_ae : ⇑(conj_ae : ℍ[R, c₁, c₂] ≃ₐ[R] _) = op ∘ conj := rfl
421+
@[simp] lemma coe_star_ae : ⇑(star_ae : ℍ[R, c₁, c₂] ≃ₐ[R] _) = op ∘ star := rfl
462422

463423
end quaternion_algebra
464424

@@ -634,56 +594,27 @@ quaternion_algebra.rank_eq_four _ _
634594
lemma finrank_eq_four [strong_rank_condition R] : finite_dimensional.finrank R ℍ[R] = 4 :=
635595
quaternion_algebra.finrank_eq_four _ _
636596

637-
/-- Quaternion conjugate. -/
638-
def conj : ℍ[R] ≃ₗ[R] ℍ[R] := quaternion_algebra.conj
597+
@[simp] lemma star_re : (star a).re = a.re := rfl
598+
@[simp] lemma star_im_i : (star a).im_i = - a.im_i := rfl
599+
@[simp] lemma star_im_j : (star a).im_j = - a.im_j := rfl
600+
@[simp] lemma star_im_k : (star a).im_k = - a.im_k := rfl
601+
@[simp] lemma star_im : (star a).im = - a.im := a.im_star
639602

640-
@[simp] lemma conj_re : a.conj.re = a.re := rfl
641-
@[simp] lemma conj_im_i : a.conj.im_i = - a.im_i := rfl
642-
@[simp] lemma conj_im_j : a.conj.im_j = - a.im_j := rfl
643-
@[simp] lemma conj_im_k : a.conj.im_k = - a.im_k := rfl
644-
@[simp] lemma conj_im : a.conj.im = - a.im := a.im_conj
603+
lemma self_add_star' : a + star a = ↑(2 * a.re) := a.self_add_star'
645604

646-
@[simp] lemma conj_conj : a.conj.conj = a := a.conj_conj
605+
lemma self_add_star : a + star a = 2 * a.re := a.self_add_star
647606

648-
@[simp] lemma conj_add : (a + b).conj = a.conj + b.conj := a.conj_add b
607+
lemma star_add_self' : star a + a = ↑(2 * a.re) := a.star_add_self'
649608

650-
@[simp] lemma conj_mul : (a * b).conj = b.conj * a.conj := a.conj_mul b
609+
lemma star_add_self : star a + a = 2 * a.re := a.star_add_self
651610

652-
lemma conj_conj_mul : (a.conj * b).conj = b.conj * a := a.conj_conj_mul b
611+
lemma star_eq_two_re_sub : star a = ↑(2 * a.re) - a := a.star_eq_two_re_sub
653612

654-
lemma conj_mul_conj : (a * b.conj).conj = b * a.conj := a.conj_mul_conj b
613+
@[simp, norm_cast] lemma star_coe : star (x : ℍ[R]) = x := quaternion_algebra.star_coe x
614+
@[simp] lemma im_star : star a.im = - a.im := quaternion_algebra.im_star _
655615

656-
lemma self_add_conj' : a + a.conj = ↑(2 * a.re) := a.self_add_conj'
657-
658-
lemma self_add_conj : a + a.conj = 2 * a.re := a.self_add_conj
659-
660-
lemma conj_add_self' : a.conj + a = ↑(2 * a.re) := a.conj_add_self'
661-
662-
lemma conj_add_self : a.conj + a = 2 * a.re := a.conj_add_self
663-
664-
lemma conj_eq_two_re_sub : a.conj = ↑(2 * a.re) - a := a.conj_eq_two_re_sub
665-
666-
lemma commute_conj_self : commute a.conj a := a.commute_conj_self
667-
668-
lemma commute_self_conj : commute a a.conj := a.commute_self_conj
669-
670-
lemma commute_conj_conj {a b : ℍ[R]} (h : commute a b) : commute a.conj b.conj :=
671-
quaternion_algebra.commute_conj_conj h
672-
673-
alias commute_conj_conj ← commute.quaternion_conj
674-
675-
@[simp, norm_cast] lemma conj_coe : conj (x : ℍ[R]) = x := quaternion_algebra.conj_coe x
676-
@[simp] lemma im_conj : a.im.conj = - a.im := quaternion_algebra.im_conj _
677-
678-
@[simp, norm_cast] lemma conj_nat_cast (n : ℕ) : conj (n : ℍ[R]) = n :=
679-
quaternion_algebra.conj_nat_cast _
680-
@[simp, norm_cast] lemma conj_int_cast (z : ℤ) : conj (z : ℍ[R]) = z :=
681-
quaternion_algebra.conj_int_cast _
682-
683-
@[simp] lemma conj_smul [monoid S] [distrib_mul_action S R] (s : S) (a : ℍ[R]) :
684-
conj (s • a) = s • conj a := quaternion_algebra.conj_smul _ _
685-
686-
@[simp] lemma conj_one : conj (1 : ℍ[R]) = 1 := conj_coe 1
616+
@[simp] lemma star_smul [monoid S] [distrib_mul_action S R] (s : S) (a : ℍ[R]) :
617+
star (s • a) = s • star a := quaternion_algebra.star_smul _ _
687618

688619
lemma eq_re_of_eq_coe {a : ℍ[R]} {x : R} (h : a = x) : a = a.re :=
689620
quaternion_algebra.eq_re_of_eq_coe h
@@ -694,49 +625,41 @@ quaternion_algebra.eq_re_iff_mem_range_coe
694625
section char_zero
695626
variables [no_zero_divisors R] [char_zero R]
696627

697-
@[simp] lemma conj_eq_self {a : ℍ[R]} : conj a = a ↔ a = a.re := quaternion_algebra.conj_eq_self
628+
@[simp] lemma star_eq_self {a : ℍ[R]} : star a = a ↔ a = a.re := quaternion_algebra.star_eq_self
698629

699-
@[simp] lemma conj_eq_neg {a : ℍ[R]} : conj a = -a ↔ a.re = 0 := quaternion_algebra.conj_eq_neg
630+
@[simp] lemma star_eq_neg {a : ℍ[R]} : star a = -a ↔ a.re = 0 := quaternion_algebra.star_eq_neg
700631

701632
end char_zero
702633

703-
lemma conj_mul_eq_coe : conj a * a = (conj a * a).re := a.conj_mul_eq_coe
704-
705-
lemma mul_conj_eq_coe : a * conj a = (a * conj a).re := a.mul_conj_eq_coe
634+
lemma star_mul_eq_coe : star a * a = (star a * a).re := a.star_mul_eq_coe
706635

707-
@[simp] lemma conj_zero : conj (0:ℍ[R]) = 0 := quaternion_algebra.conj_zero
708-
709-
@[simp] lemma conj_neg : (-a).conj = -a.conj := a.conj_neg
710-
711-
@[simp] lemma conj_sub : (a - b).conj = a.conj - b.conj := a.conj_sub b
712-
713-
@[simp] lemma conj_pow (n : ℕ) : conj (a ^ n) = conj a ^ n := a.conj_pow n
636+
lemma mul_star_eq_coe : a * star a = (a * star a).re := a.mul_star_eq_coe
714637

715638
open mul_opposite
716639

717640
/-- Quaternion conjugate as an `alg_equiv` to the opposite ring. -/
718-
def conj_ae : ℍ[R] ≃ₐ[R] (ℍ[R]ᵐᵒᵖ) := quaternion_algebra.conj_ae
641+
def star_ae : ℍ[R] ≃ₐ[R] (ℍ[R]ᵐᵒᵖ) := quaternion_algebra.star_ae
719642

720-
@[simp] lemma coe_conj_ae : ⇑(conj_ae : ℍ[R] ≃ₐ[R] ℍ[R]ᵐᵒᵖ) = op ∘ conj := rfl
643+
@[simp] lemma coe_star_ae : ⇑(star_ae : ℍ[R] ≃ₐ[R] ℍ[R]ᵐᵒᵖ) = op ∘ star := rfl
721644

722645
/-- Square of the norm. -/
723646
def norm_sq : ℍ[R] →*₀ R :=
724-
{ to_fun := λ a, (a * a.conj).re,
725-
map_zero' := by rw [conj_zero, zero_mul, zero_re],
726-
map_one' := by rw [conj_one, one_mul, one_re],
727-
map_mul' := λ x y, coe_injective $ by conv_lhs { rw [← mul_conj_eq_coe, conj_mul, mul_assoc,
728-
← mul_assoc y, y.mul_conj_eq_coe, coe_commutes, ← mul_assoc, x.mul_conj_eq_coe, ← coe_mul] } }
647+
{ to_fun := λ a, (a * star a).re,
648+
map_zero' := by rw [star_zero, zero_mul, zero_re],
649+
map_one' := by rw [star_one, one_mul, one_re],
650+
map_mul' := λ x y, coe_injective $ by conv_lhs { rw [← mul_star_eq_coe, star_mul, mul_assoc,
651+
← mul_assoc y, y.mul_star_eq_coe, coe_commutes, ← mul_assoc, x.mul_star_eq_coe, ← coe_mul] } }
729652

730-
lemma norm_sq_def : norm_sq a = (a * a.conj).re := rfl
653+
lemma norm_sq_def : norm_sq a = (a * star a).re := rfl
731654

732655
lemma norm_sq_def' : norm_sq a = a.1^2 + a.2^2 + a.3^2 + a.4^2 :=
733656
by simp only [norm_sq_def, sq, mul_neg, sub_neg_eq_add,
734-
mul_re, conj_re, conj_im_i, conj_im_j, conj_im_k]
657+
mul_re, star_re, star_im_i, star_im_j, star_im_k]
735658

736659
lemma norm_sq_coe : norm_sq (x : ℍ[R]) = x^2 :=
737-
by rw [norm_sq_def, conj_coe, ← coe_mul, coe_re, sq]
660+
by rw [norm_sq_def, star_coe, ← coe_mul, coe_re, sq]
738661

739-
@[simp] lemma norm_sq_conj : norm_sq (conj a) = norm_sq a := by simp [norm_sq_def']
662+
@[simp] lemma norm_sq_star : norm_sq (star a) = norm_sq a := by simp [norm_sq_def']
740663

741664
@[norm_cast] lemma norm_sq_nat_cast (n : ℕ) : norm_sq (n : ℍ[R]) = n^2 :=
742665
by rw [←coe_nat_cast, norm_sq_coe]
@@ -745,28 +668,28 @@ by rw [←coe_nat_cast, norm_sq_coe]
745668
by rw [←coe_int_cast, norm_sq_coe]
746669

747670
@[simp] lemma norm_sq_neg : norm_sq (-a) = norm_sq a :=
748-
by simp only [norm_sq_def, conj_neg, neg_mul_neg]
671+
by simp only [norm_sq_def, star_neg, neg_mul_neg]
749672

750-
lemma self_mul_conj : a * a.conj = norm_sq a := by rw [mul_conj_eq_coe, norm_sq_def]
673+
lemma self_mul_star : a * star a = norm_sq a := by rw [mul_star_eq_coe, norm_sq_def]
751674

752-
lemma conj_mul_self : a.conj * a = norm_sq a := by rw [← a.commute_self_conj.eq, self_mul_conj]
675+
lemma star_mul_self : star a * a = norm_sq a := by rw [star_comm_self', self_mul_star]
753676

754677
lemma im_sq : a.im^2 = -norm_sq a.im :=
755-
by simp_rw [sq, ←conj_mul_self, im_conj, neg_mul, neg_neg]
678+
by simp_rw [sq, ←star_mul_self, im_star, neg_mul, neg_neg]
756679

757680
lemma coe_norm_sq_add :
758-
(norm_sq (a + b) : ℍ[R]) = norm_sq a + a * b.conj + b * a.conj + norm_sq b :=
759-
by simp [← self_mul_conj, mul_add, add_mul, add_assoc]
681+
(norm_sq (a + b) : ℍ[R]) = norm_sq a + a * star b + b * star a + norm_sq b :=
682+
by simp [← self_mul_star, mul_add, add_mul, add_assoc]
760683

761684
lemma norm_sq_smul (r : R) (q : ℍ[R]) : norm_sq (r • q) = r^2 * norm_sq q :=
762-
by simp_rw [norm_sq_def, conj_smul, smul_mul_smul, smul_re, sq, smul_eq_mul]
685+
by simp_rw [norm_sq_def, star_smul, smul_mul_smul, smul_re, sq, smul_eq_mul]
763686

764-
lemma norm_sq_add (a b : ℍ[R]) : norm_sq (a + b) = norm_sq a + norm_sq b + 2 * (a * conj b).re :=
765-
calc norm_sq (a + b) = (norm_sq a + (a * conj b).re) + ((b * conj a).re + norm_sq b)
766-
: by simp_rw [norm_sq_def, conj_add, add_mul, mul_add, add_re]
767-
... = norm_sq a + norm_sq b + ((a * conj b).re + (b * conj a).re) : by abel
768-
... = norm_sq a + norm_sq b + 2 * (a * conj b).re
769-
: by rw [←add_re, ←conj_mul_conj a b, self_add_conj', coe_re]
687+
lemma norm_sq_add (a b : ℍ[R]) : norm_sq (a + b) = norm_sq a + norm_sq b + 2 * (a * star b).re :=
688+
calc norm_sq (a + b) = (norm_sq a + (a * star b).re) + ((b * star a).re + norm_sq b)
689+
: by simp_rw [norm_sq_def, star_add, add_mul, mul_add, add_re]
690+
... = norm_sq a + norm_sq b + ((a * star b).re + (b * star a).re) : by abel
691+
... = norm_sq a + norm_sq b + 2 * (a * star b).re
692+
: by rw [←add_re, ←star_mul_star a b, self_add_star', coe_re]
770693

771694
end quaternion
772695

@@ -808,18 +731,18 @@ no_zero_divisors.to_is_domain _
808731

809732
lemma sq_eq_norm_sq : a^2 = norm_sq a ↔ a = a.re :=
810733
begin
811-
simp_rw [←conj_eq_self],
734+
simp_rw [←star_eq_self],
812735
obtain rfl | hq0 := eq_or_ne a 0,
813736
{ simp },
814-
{ rw [←conj_mul_self, sq, mul_left_inj' hq0, eq_comm] }
737+
{ rw [←star_mul_self, sq, mul_left_inj' hq0, eq_comm] }
815738
end
816739

817740
lemma sq_eq_neg_norm_sq : a^2 = -norm_sq a ↔ a.re = 0 :=
818741
begin
819-
simp_rw [←conj_eq_neg],
742+
simp_rw [←star_eq_neg],
820743
obtain rfl | hq0 := eq_or_ne a 0,
821744
{ simp },
822-
rw [←conj_mul_self, ←mul_neg, ←neg_sq, sq, mul_left_inj' (neg_ne_zero.mpr hq0), eq_comm],
745+
rw [←star_mul_self, ←mul_neg, ←neg_sq, sq, mul_left_inj' (neg_ne_zero.mpr hq0), eq_comm],
823746
end
824747

825748
end linear_ordered_comm_ring
@@ -828,12 +751,12 @@ section field
828751

829752
variables [linear_ordered_field R] (a b : ℍ[R])
830753

831-
@[simps { attrs := [] }] instance : has_inv ℍ[R] := ⟨λ a, (norm_sq a)⁻¹ • a.conj
754+
@[simps { attrs := [] }] instance : has_inv ℍ[R] := ⟨λ a, (norm_sq a)⁻¹ • star a
832755

833756
instance : group_with_zero ℍ[R] :=
834757
{ inv := has_inv.inv,
835-
inv_zero := by rw [has_inv_inv, conj_zero, smul_zero],
836-
mul_inv_cancel := λ a ha, by rw [has_inv_inv, algebra.mul_smul_comm, self_mul_conj, smul_coe,
758+
inv_zero := by rw [has_inv_inv, star_zero, smul_zero],
759+
mul_inv_cancel := λ a ha, by rw [has_inv_inv, algebra.mul_smul_comm, self_mul_star, smul_coe,
837760
inv_mul_cancel (norm_sq_ne_zero.2 ha), coe_one],
838761
.. quaternion.nontrivial,
839762
.. (by apply_instance : monoid_with_zero ℍ[R]) }
@@ -865,10 +788,6 @@ instance : division_ring ℍ[R] :=
865788
@[simp, norm_cast] lemma rat_cast_im (q : ℚ) : (q : ℍ[R]).im = 0 := rfl
866789
@[norm_cast] lemma coe_rat_cast (q : ℚ) : ↑(q : R) = (q : ℍ[R]) := rfl
867790

868-
lemma conj_inv : conj (a⁻¹) = (conj a)⁻¹ := star_inv' a
869-
lemma conj_zpow (z : ℤ) : conj (a ^ z) = conj a ^ z := star_zpow₀ a z
870-
@[simp, norm_cast] lemma conj_rat_cast (q : ℚ) : conj (q : ℍ[R]) = q := @star_rat_cast ℍ[R] _ _ q
871-
872791
@[simp] lemma norm_sq_inv : norm_sq a⁻¹ = (norm_sq a)⁻¹ := map_inv₀ norm_sq _
873792
@[simp] lemma norm_sq_div : norm_sq (a / b) = norm_sq a / norm_sq b := map_div₀ norm_sq a b
874793
@[simp] lemma norm_sq_zpow (z : ℤ) : norm_sq (a ^ z) = norm_sq a ^ z := map_zpow₀ norm_sq a z

0 commit comments

Comments
 (0)