|
| 1 | +/- |
| 2 | +Copyright (c) 2018 Ellen Arlt. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Ellen Arlt, Blair Shi, Sean Leather, Mario Carneiro |
| 5 | +
|
| 6 | +Matrices |
| 7 | +-/ |
| 8 | + |
| 9 | +import algebra.module data.fintype |
| 10 | + |
| 11 | +universes u v |
| 12 | + |
| 13 | +def matrix (m n : Type u) [fintype m] [fintype n] (α : Type v) : Type (max u v) := |
| 14 | +m → n → α |
| 15 | + |
| 16 | +namespace matrix |
| 17 | +variables {l m n o : Type u} [fintype l] [fintype m] [fintype n] [fintype o] |
| 18 | +variables {α : Type v} |
| 19 | + |
| 20 | +section ext |
| 21 | +variables {M N : matrix m n α} |
| 22 | + |
| 23 | +theorem ext_iff : (∀ i j, M i j = N i j) ↔ M = N := |
| 24 | +⟨λ h, funext $ λ i, funext $ λ j, h i j, λ h, by simp [h]⟩ |
| 25 | + |
| 26 | +@[extensionality] theorem ext : (∀ i j, M i j = N i j) → M = N := |
| 27 | +ext_iff.mp |
| 28 | + |
| 29 | +end ext |
| 30 | + |
| 31 | +section zero |
| 32 | +variables [has_zero α] |
| 33 | + |
| 34 | +instance : has_zero (matrix m n α) := ⟨λ _ _, 0⟩ |
| 35 | + |
| 36 | +@[simp] theorem zero_val {i j} : (0 : matrix m n α) i j = 0 := rfl |
| 37 | + |
| 38 | +end zero |
| 39 | + |
| 40 | +section one |
| 41 | +variables [decidable_eq n] [has_zero α] [has_one α] |
| 42 | + |
| 43 | +instance : has_one (matrix n n α) := ⟨λ i j, if i = j then 1 else 0⟩ |
| 44 | + |
| 45 | +theorem one_val {i j} : (1 : matrix n n α) i j = if i = j then 1 else 0 := rfl |
| 46 | + |
| 47 | +@[simp] theorem one_val_eq (i) : (1 : matrix n n α) i i = 1 := by simp [one_val] |
| 48 | + |
| 49 | +@[simp] theorem one_val_ne {i j} (h : i ≠ j) : (1 : matrix n n α) i j = 0 := |
| 50 | +by simp [one_val, h] |
| 51 | + |
| 52 | +theorem one_val_ne' {i j} (h : j ≠ i) : (1 : matrix n n α) i j = 0 := |
| 53 | +one_val_ne h.symm |
| 54 | + |
| 55 | +end one |
| 56 | + |
| 57 | +section neg |
| 58 | +variables [has_neg α] |
| 59 | + |
| 60 | +instance : has_neg (matrix m n α) := ⟨λ M i j, - M i j⟩ |
| 61 | + |
| 62 | +@[simp] theorem neg_val {M : matrix m n α} {i j} : (- M) i j = - M i j := rfl |
| 63 | + |
| 64 | +end neg |
| 65 | + |
| 66 | +section add |
| 67 | +variables [has_add α] |
| 68 | + |
| 69 | +instance : has_add (matrix m n α) := ⟨λ M N i j, M i j + N i j⟩ |
| 70 | + |
| 71 | +@[simp] theorem add_val {M N : matrix m n α} {i j} : (M + N) i j = M i j + N i j := rfl |
| 72 | + |
| 73 | +end add |
| 74 | + |
| 75 | +instance [add_semigroup α] : add_semigroup (matrix m n α) := |
| 76 | +{ add_assoc := by intros; ext; simp, ..matrix.has_add } |
| 77 | + |
| 78 | +instance [add_comm_semigroup α] : add_comm_semigroup (matrix m n α) := |
| 79 | +{ add_comm := by intros; ext; simp, ..matrix.add_semigroup } |
| 80 | + |
| 81 | +instance [add_monoid α] : add_monoid (matrix m n α) := |
| 82 | +{ zero := 0, add := (+), |
| 83 | + zero_add := by intros; ext; simp, |
| 84 | + add_zero := by intros; ext; simp, |
| 85 | + ..matrix.add_semigroup } |
| 86 | + |
| 87 | +instance [add_comm_monoid α] : add_comm_monoid (matrix m n α) := |
| 88 | +{ ..matrix.add_monoid, ..matrix.add_comm_semigroup } |
| 89 | + |
| 90 | +protected def mul [has_mul α] [add_comm_monoid α] (M : matrix l m α) (N : matrix m n α) : |
| 91 | + matrix l n α := |
| 92 | +λ i k, finset.univ.sum (λ j, M i j * N j k) |
| 93 | + |
| 94 | +@[simp] theorem mul_val [has_mul α] [add_comm_monoid α] {M : matrix l m α} {N : matrix m n α} {i k} : |
| 95 | + (M.mul N) i k = finset.univ.sum (λ j, M i j * N j k) := rfl |
| 96 | + |
| 97 | +instance [has_mul α] [add_comm_monoid α] : has_mul (matrix n n α) := ⟨matrix.mul⟩ |
| 98 | + |
| 99 | +@[simp] theorem mul_val' [has_mul α] [add_comm_monoid α] {M N : matrix n n α} {i k} : |
| 100 | + (M * N) i k = finset.univ.sum (λ j, M i j * N j k) := rfl |
| 101 | + |
| 102 | +section semigroup |
| 103 | +variables [decidable_eq m] [decidable_eq n] [semiring α] |
| 104 | + |
| 105 | +protected theorem mul_assoc (L : matrix l m α) (M : matrix m n α) (N : matrix n o α) : |
| 106 | + (L.mul M).mul N = L.mul (M.mul N) := |
| 107 | +by funext i k; |
| 108 | + simp [finset.mul_sum, finset.sum_mul, mul_assoc]; |
| 109 | + rw finset.sum_comm |
| 110 | + |
| 111 | +instance : semigroup (matrix n n α) := |
| 112 | +{ mul_assoc := matrix.mul_assoc, ..matrix.has_mul } |
| 113 | + |
| 114 | +end semigroup |
| 115 | + |
| 116 | +section monoid |
| 117 | +variables [decidable_eq n] [decidable_eq m] [semiring α] |
| 118 | + |
| 119 | +protected theorem one_mul (M : matrix n m α) : (1 : matrix n n α).mul M = M := |
| 120 | +by ext i j; simp; rw finset.sum_eq_single i; simp [one_val_ne'] {contextual := tt} |
| 121 | + |
| 122 | +protected theorem mul_one (M : matrix n m α) : M.mul (1 : matrix m m α) = M := |
| 123 | +by ext i j; simp; rw finset.sum_eq_single j; simp {contextual := tt} |
| 124 | + |
| 125 | +instance : monoid (matrix n n α) := |
| 126 | +{ one_mul := matrix.one_mul, |
| 127 | + mul_one := matrix.mul_one, |
| 128 | + ..matrix.has_one, ..matrix.semigroup } |
| 129 | + |
| 130 | +end monoid |
| 131 | + |
| 132 | +instance [add_group α] : add_group (matrix m n α) := |
| 133 | +{ zero := 0, add := (+), neg := has_neg.neg, |
| 134 | + add_left_neg := by intros; ext; simp, |
| 135 | + ..matrix.add_monoid } |
| 136 | + |
| 137 | +instance [add_comm_group α] : add_comm_group (matrix m n α) := |
| 138 | +{ ..matrix.add_group, ..matrix.add_comm_monoid } |
| 139 | + |
| 140 | +section semiring |
| 141 | +variables [semiring α] |
| 142 | + |
| 143 | +theorem mul_zero (M : matrix m n α) : M.mul (0 : matrix n n α) = 0 := |
| 144 | +by ext i j; simp |
| 145 | + |
| 146 | +theorem zero_mul (M : matrix m n α) : (0 : matrix m m α).mul M = 0 := |
| 147 | +by ext i j; simp |
| 148 | + |
| 149 | +theorem mul_add (L : matrix m n α) (M N : matrix n n α) : L.mul (M + N) = L.mul M + L.mul N := |
| 150 | +by ext i j; simp [finset.sum_add_distrib, mul_add] |
| 151 | + |
| 152 | +theorem add_mul (L M : matrix m m α) (N : matrix m n α) : (L + M).mul N = L.mul N + M.mul N := |
| 153 | +by ext i j; simp [finset.sum_add_distrib, add_mul] |
| 154 | + |
| 155 | +instance [decidable_eq n] [semiring α] : semiring (matrix n n α) := |
| 156 | +{ mul_zero := mul_zero, |
| 157 | + zero_mul := zero_mul, |
| 158 | + left_distrib := mul_add, |
| 159 | + right_distrib := add_mul, |
| 160 | + ..matrix.add_comm_monoid, |
| 161 | + ..matrix.monoid } |
| 162 | + |
| 163 | +end semiring |
| 164 | + |
| 165 | +instance [decidable_eq n] [ring α] : ring (matrix n n α) := |
| 166 | +{ ..matrix.add_comm_group, ..matrix.semiring } |
| 167 | + |
| 168 | +instance [has_mul α] : has_scalar α (matrix m n α) := ⟨λ a M i j, a * M i j⟩ |
| 169 | + |
| 170 | +instance [ring α] : module α (matrix m n α) := |
| 171 | +{ smul_add := λ a M N, ext $ λ i j, _root_.mul_add a (M i j) (N i j), |
| 172 | + add_smul := λ a b M, ext $ λ i j, _root_.add_mul a b (M i j), |
| 173 | + mul_smul := λ a b M, ext $ λ i j, mul_assoc a b (M i j), |
| 174 | + one_smul := λ M, ext $ λ i j, one_mul (M i j) } |
| 175 | + |
| 176 | +end matrix |
0 commit comments