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

Commit a72807f

Browse files
kbuzzarddigama0
authored andcommitted
feat(ring_theory/matrix): (finally!) adding matrices (#334)
Joint work by: Ellen Arlt, Blair Shi, Sean Leather, Scott Morrison, Johan Commelin, Kenny Lau, Johannes Hölzl, Mario Carneiro
1 parent 7dedf3c commit a72807f

File tree

1 file changed

+176
-0
lines changed

1 file changed

+176
-0
lines changed

ring_theory/matrix.lean

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
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

Comments
 (0)