|
| 1 | +/- |
| 2 | +Copyright (c) 2019 Floris van Doorn. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Floris van Doorn, Yury Kudryashov, Sébastien Gouëzel, Chris Hughes |
| 5 | +-/ |
| 6 | +import Mathlib.Algebra.Group.Basic |
| 7 | +import Mathlib.Algebra.Group.Pi.Basic |
| 8 | +import Mathlib.Data.Fin.VecNotation |
| 9 | + |
| 10 | +#align_import data.fin.tuple.basic from "leanprover-community/mathlib"@"ef997baa41b5c428be3fb50089a7139bf4ee886b" |
| 11 | + |
| 12 | +/-! |
| 13 | +# Algebraic properties of tuples |
| 14 | +-/ |
| 15 | + |
| 16 | +namespace Fin |
| 17 | +variable {m n : ℕ} {α : Fin (n + 1) → Type*} |
| 18 | + |
| 19 | +@[to_additive (attr := simp)] |
| 20 | +lemma insertNth_one_right [∀ j, One (α j)] (i : Fin (n + 1)) (x : α i) : |
| 21 | + i.insertNth x 1 = Pi.mulSingle i x := |
| 22 | + insertNth_eq_iff.2 <| by simp [succAbove_ne, Pi.one_def] |
| 23 | +#align fin.insert_nth_zero_right Fin.insertNth_zero_right |
| 24 | + |
| 25 | +@[to_additive (attr := simp)] |
| 26 | +lemma insertNth_mul [∀ j, Mul (α j)] (i : Fin (n + 1)) (x y : α i) (p q : ∀ j, α (i.succAbove j)) : |
| 27 | + i.insertNth (x * y) (p * q) = i.insertNth x p * i.insertNth y q := |
| 28 | + insertNth_binop (fun _ ↦ (· * ·)) i x y p q |
| 29 | +#align fin.insert_nth_mul Fin.insertNth_mul |
| 30 | +#align fin.insert_nth_add Fin.insertNth_add |
| 31 | + |
| 32 | +@[to_additive (attr := simp)] |
| 33 | +lemma insertNth_div [∀ j, Div (α j)] (i : Fin (n + 1)) (x y : α i)(p q : ∀ j, α (i.succAbove j)) : |
| 34 | + i.insertNth (x / y) (p / q) = i.insertNth x p / i.insertNth y q := |
| 35 | + insertNth_binop (fun _ ↦ (· / ·)) i x y p q |
| 36 | +#align fin.insert_nth_div Fin.insertNth_div |
| 37 | +#align fin.insert_nth_sub Fin.insertNth_sub |
| 38 | + |
| 39 | +@[to_additive (attr := simp)] |
| 40 | +lemma insertNth_div_same [∀ j, Group (α j)] (i : Fin (n + 1)) (x y : α i) |
| 41 | + (p : ∀ j, α (i.succAbove j)) : i.insertNth x p / i.insertNth y p = Pi.mulSingle i (x / y) := by |
| 42 | + simp_rw [← insertNth_div, ← insertNth_one_right, Pi.div_def, div_self', Pi.one_def] |
| 43 | +#align fin.insert_nth_sub_same Fin.insertNth_sub_same |
| 44 | + |
| 45 | +end Fin |
| 46 | + |
| 47 | +namespace Matrix |
| 48 | + |
| 49 | +variable {α M : Type*} {n : ℕ} |
| 50 | + |
| 51 | +section SMul |
| 52 | +variable [SMul M α] |
| 53 | + |
| 54 | +@[simp] lemma smul_empty (x : M) (v : Fin 0 → α) : x • v = ![] := empty_eq _ |
| 55 | +#align matrix.smul_empty Matrix.smul_empty |
| 56 | + |
| 57 | +@[simp] lemma smul_cons (x : M) (y : α) (v : Fin n → α) : |
| 58 | + x • vecCons y v = vecCons (x • y) (x • v) := by ext i; refine i.cases ?_ ?_ <;> simp |
| 59 | +#align matrix.smul_cons Matrix.smul_cons |
| 60 | + |
| 61 | +end SMul |
| 62 | + |
| 63 | +section Add |
| 64 | +variable [Add α] |
| 65 | + |
| 66 | +@[simp] lemma empty_add_empty (v w : Fin 0 → α) : v + w = ![] := empty_eq _ |
| 67 | +#align matrix.empty_add_empty Matrix.empty_add_empty |
| 68 | + |
| 69 | +@[simp] lemma cons_add (x : α) (v : Fin n → α) (w : Fin n.succ → α) : |
| 70 | + vecCons x v + w = vecCons (x + vecHead w) (v + vecTail w) := by |
| 71 | + ext i; refine i.cases ?_ ?_ <;> simp [vecHead, vecTail] |
| 72 | +#align matrix.cons_add Matrix.cons_add |
| 73 | + |
| 74 | +@[simp] lemma add_cons (v : Fin n.succ → α) (y : α) (w : Fin n → α) : |
| 75 | + v + vecCons y w = vecCons (vecHead v + y) (vecTail v + w) := by |
| 76 | + ext i; refine i.cases ?_ ?_ <;> simp [vecHead, vecTail] |
| 77 | +#align matrix.add_cons Matrix.add_cons |
| 78 | + |
| 79 | +lemma cons_add_cons (x : α) (v : Fin n → α) (y : α) (w : Fin n → α) : |
| 80 | + vecCons x v + vecCons y w = vecCons (x + y) (v + w) := by simp |
| 81 | +#align matrix.cons_add_cons Matrix.cons_add_cons |
| 82 | + |
| 83 | +@[simp] lemma head_add (a b : Fin n.succ → α) : vecHead (a + b) = vecHead a + vecHead b := rfl |
| 84 | +#align matrix.head_add Matrix.head_add |
| 85 | + |
| 86 | +@[simp] lemma tail_add (a b : Fin n.succ → α) : vecTail (a + b) = vecTail a + vecTail b := rfl |
| 87 | +#align matrix.tail_add Matrix.tail_add |
| 88 | + |
| 89 | +end Add |
| 90 | + |
| 91 | +section Sub |
| 92 | +variable [Sub α] |
| 93 | + |
| 94 | +@[simp] lemma empty_sub_empty (v w : Fin 0 → α) : v - w = ![] := empty_eq _ |
| 95 | +#align matrix.empty_sub_empty Matrix.empty_sub_empty |
| 96 | + |
| 97 | +@[simp] lemma cons_sub (x : α) (v : Fin n → α) (w : Fin n.succ → α) : |
| 98 | + vecCons x v - w = vecCons (x - vecHead w) (v - vecTail w) := by |
| 99 | + ext i; refine i.cases ?_ ?_ <;> simp [vecHead, vecTail] |
| 100 | +#align matrix.cons_sub Matrix.cons_sub |
| 101 | + |
| 102 | +@[simp] lemma sub_cons (v : Fin n.succ → α) (y : α) (w : Fin n → α) : |
| 103 | + v - vecCons y w = vecCons (vecHead v - y) (vecTail v - w) := by |
| 104 | + ext i; refine i.cases ?_ ?_ <;> simp [vecHead, vecTail] |
| 105 | +#align matrix.sub_cons Matrix.sub_cons |
| 106 | + |
| 107 | +lemma cons_sub_cons (x : α) (v : Fin n → α) (y : α) (w : Fin n → α) : |
| 108 | + vecCons x v - vecCons y w = vecCons (x - y) (v - w) := by simp |
| 109 | +#align matrix.cons_sub_cons Matrix.cons_sub_cons |
| 110 | + |
| 111 | +@[simp] lemma head_sub (a b : Fin n.succ → α) : vecHead (a - b) = vecHead a - vecHead b := rfl |
| 112 | +#align matrix.head_sub Matrix.head_sub |
| 113 | + |
| 114 | +@[simp] lemma tail_sub (a b : Fin n.succ → α) : vecTail (a - b) = vecTail a - vecTail b := rfl |
| 115 | +#align matrix.tail_sub Matrix.tail_sub |
| 116 | + |
| 117 | +end Sub |
| 118 | + |
| 119 | +section Zero |
| 120 | +variable [Zero α] |
| 121 | + |
| 122 | +@[simp] lemma zero_empty : (0 : Fin 0 → α) = ![] := empty_eq _ |
| 123 | +#align matrix.zero_empty Matrix.zero_empty |
| 124 | + |
| 125 | +@[simp] lemma cons_zero_zero : vecCons (0 : α) (0 : Fin n → α) = 0 := by |
| 126 | + ext i; exact i.cases rfl (by simp) |
| 127 | +#align matrix.cons_zero_zero Matrix.cons_zero_zero |
| 128 | + |
| 129 | +@[simp] lemma head_zero : vecHead (0 : Fin n.succ → α) = 0 := rfl |
| 130 | +#align matrix.head_zero Matrix.head_zero |
| 131 | + |
| 132 | +@[simp] lemma tail_zero : vecTail (0 : Fin n.succ → α) = 0 := rfl |
| 133 | +#align matrix.tail_zero Matrix.tail_zero |
| 134 | + |
| 135 | +@[simp] lemma cons_eq_zero_iff {v : Fin n → α} {x : α} : vecCons x v = 0 ↔ x = 0 ∧ v = 0 where |
| 136 | + mp h := ⟨congr_fun h 0, by convert congr_arg vecTail h⟩ |
| 137 | + mpr := fun ⟨hx, hv⟩ ↦ by simp [hx, hv] |
| 138 | +#align matrix.cons_eq_zero_iff Matrix.cons_eq_zero_iff |
| 139 | + |
| 140 | +lemma cons_nonzero_iff {v : Fin n → α} {x : α} : vecCons x v ≠ 0 ↔ x ≠ 0 ∨ v ≠ 0 where |
| 141 | + mp h := not_and_or.mp (h ∘ cons_eq_zero_iff.mpr) |
| 142 | + mpr h := mt cons_eq_zero_iff.mp (not_and_or.mpr h) |
| 143 | +#align matrix.cons_nonzero_iff Matrix.cons_nonzero_iff |
| 144 | + |
| 145 | +end Zero |
| 146 | + |
| 147 | +section Neg |
| 148 | +variable [Neg α] |
| 149 | + |
| 150 | +@[simp] lemma neg_empty (v : Fin 0 → α) : -v = ![] := empty_eq _ |
| 151 | +#align matrix.neg_empty Matrix.neg_empty |
| 152 | + |
| 153 | +@[simp] lemma neg_cons (x : α) (v : Fin n → α) : -vecCons x v = vecCons (-x) (-v) := by |
| 154 | + ext i; refine i.cases ?_ ?_ <;> simp |
| 155 | +#align matrix.neg_cons Matrix.neg_cons |
| 156 | + |
| 157 | +@[simp] lemma head_neg (a : Fin n.succ → α) : vecHead (-a) = -vecHead a := rfl |
| 158 | +#align matrix.head_neg Matrix.head_neg |
| 159 | + |
| 160 | +@[simp] lemma tail_neg (a : Fin n.succ → α) : vecTail (-a) = -vecTail a := rfl |
| 161 | +#align matrix.tail_neg Matrix.tail_neg |
| 162 | + |
| 163 | +end Neg |
| 164 | +end Matrix |
0 commit comments