Skip to content

Commit 78c16c2

Browse files
committed
feat(LinearAlgebra/Basis): assume [Finite ι] instead of [Fintype ι] (#10251)
1 parent c3c6047 commit 78c16c2

File tree

1 file changed

+28
-36
lines changed

1 file changed

+28
-36
lines changed

Mathlib/LinearAlgebra/Basis.lean

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -882,11 +882,9 @@ open Basis
882882

883883
open Fintype
884884

885-
variable [Fintype ι] (b : Basis ι R M)
886-
887885
/-- A module over `R` with a finite basis is linearly equivalent to functions from its basis to `R`.
888886
-/
889-
def Basis.equivFun : M ≃ₗ[R] ι → R :=
887+
def Basis.equivFun [Finite ι] (b : Basis ι R M) : M ≃ₗ[R] ι → R :=
890888
LinearEquiv.trans b.repr
891889
({ Finsupp.equivFunOnFinite with
892890
toFun := (↑)
@@ -896,12 +894,12 @@ def Basis.equivFun : M ≃ₗ[R] ι → R :=
896894
#align basis.equiv_fun Basis.equivFun
897895

898896
/-- A module over a finite ring that admits a finite basis is finite. -/
899-
def Module.fintypeOfFintype (b : Basis ι R M) [Fintype R] : Fintype M :=
897+
def Module.fintypeOfFintype [Fintype ι] (b : Basis ι R M) [Fintype R] : Fintype M :=
900898
haveI := Classical.decEq ι
901899
Fintype.ofEquiv _ b.equivFun.toEquiv.symm
902900
#align module.fintype_of_fintype Module.fintypeOfFintype
903901

904-
theorem Module.card_fintype (b : Basis ι R M) [Fintype R] [Fintype M] :
902+
theorem Module.card_fintype [Fintype ι] (b : Basis ι R M) [Fintype R] [Fintype M] :
905903
card M = card R ^ card ι := by
906904
classical
907905
calc
@@ -912,60 +910,55 @@ theorem Module.card_fintype (b : Basis ι R M) [Fintype R] [Fintype M] :
912910
/-- Given a basis `v` indexed by `ι`, the canonical linear equivalence between `ι → R` and `M` maps
913911
a function `x : ι → R` to the linear combination `∑_i x i • v i`. -/
914912
@[simp]
915-
theorem Basis.equivFun_symm_apply (x : ι → R) : b.equivFun.symm x = ∑ i, x i • b i := by
913+
theorem Basis.equivFun_symm_apply [Fintype ι] (b : Basis ι R M) (x : ι → R) :
914+
b.equivFun.symm x = ∑ i, x i • b i := by
916915
simp [Basis.equivFun, Finsupp.total_apply, Finsupp.sum_fintype, Finsupp.equivFunOnFinite]
917916
#align basis.equiv_fun_symm_apply Basis.equivFun_symm_apply
918917

919918
@[simp]
920-
theorem Basis.equivFun_apply (u : M) : b.equivFun u = b.repr u :=
919+
theorem Basis.equivFun_apply [Finite ι] (b : Basis ι R M) (u : M) : b.equivFun u = b.repr u :=
921920
rfl
922921
#align basis.equiv_fun_apply Basis.equivFun_apply
923922

924923
@[simp]
925-
theorem Basis.map_equivFun (f : M ≃ₗ[R] M') : (b.map f).equivFun = f.symm.trans b.equivFun :=
924+
theorem Basis.map_equivFun [Finite ι] (b : Basis ι R M) (f : M ≃ₗ[R] M') :
925+
(b.map f).equivFun = f.symm.trans b.equivFun :=
926926
rfl
927927
#align basis.map_equiv_fun Basis.map_equivFun
928928

929-
theorem Basis.sum_equivFun (u : M) : ∑ i, b.equivFun u i • b i = u := by
930-
conv_rhs => rw [← b.total_repr u]
931-
simp [Finsupp.total_apply, Finsupp.sum_fintype, b.equivFun_apply]
929+
theorem Basis.sum_equivFun [Fintype ι] (b : Basis ι R M) (u : M) :
930+
∑ i, b.equivFun u i • b i = u := by
931+
rw [← b.equivFun_symm_apply, b.equivFun.symm_apply_apply]
932932
#align basis.sum_equiv_fun Basis.sum_equivFun
933933

934-
theorem Basis.sum_repr (u : M) : ∑ i, b.repr u i • b i = u :=
934+
theorem Basis.sum_repr [Fintype ι] (b : Basis ι R M) (u : M) : ∑ i, b.repr u i • b i = u :=
935935
b.sum_equivFun u
936936
#align basis.sum_repr Basis.sum_repr
937937

938938
@[simp]
939-
theorem Basis.equivFun_self [DecidableEq ι] (i j : ι) :
939+
theorem Basis.equivFun_self [Finite ι] [DecidableEq ι] (b : Basis ι R M) (i j : ι) :
940940
b.equivFun (b i) j = if i = j then 1 else 0 := by rw [b.equivFun_apply, b.repr_self_apply]
941941
#align basis.equiv_fun_self Basis.equivFun_self
942942

943-
theorem Basis.repr_sum_self (c : ι → R) : ⇑(b.repr (∑ i, c i • b i)) = c := by
944-
ext j
945-
simp only [map_sum, LinearEquiv.map_smul, repr_self, Finsupp.smul_single, smul_eq_mul, mul_one,
946-
Finset.sum_apply']
947-
rw [Finset.sum_eq_single j, Finsupp.single_eq_same]
948-
· rintro i - hi
949-
exact Finsupp.single_eq_of_ne hi
950-
· intros
951-
have := Finset.mem_univ j
952-
contradiction
943+
theorem Basis.repr_sum_self [Fintype ι] (b : Basis ι R M) (c : ι → R) :
944+
b.repr (∑ i, c i • b i) = c := by
945+
simp_rw [← b.equivFun_symm_apply, ← b.equivFun_apply, b.equivFun.apply_symm_apply]
953946
#align basis.repr_sum_self Basis.repr_sum_self
954947

955948
/-- Define a basis by mapping each vector `x : M` to its coordinates `e x : ι → R`,
956949
as long as `ι` is finite. -/
957-
def Basis.ofEquivFun (e : M ≃ₗ[R] ι → R) : Basis ι R M :=
950+
def Basis.ofEquivFun [Finite ι] (e : M ≃ₗ[R] ι → R) : Basis ι R M :=
958951
.ofRepr <| e.trans <| LinearEquiv.symm <| Finsupp.linearEquivFunOnFinite R R ι
959952
#align basis.of_equiv_fun Basis.ofEquivFun
960953

961954
@[simp]
962-
theorem Basis.ofEquivFun_repr_apply (e : M ≃ₗ[R] ι → R) (x : M) (i : ι) :
955+
theorem Basis.ofEquivFun_repr_apply [Finite ι] (e : M ≃ₗ[R] ι → R) (x : M) (i : ι) :
963956
(Basis.ofEquivFun e).repr x i = e x i :=
964957
rfl
965958
#align basis.of_equiv_fun_repr_apply Basis.ofEquivFun_repr_apply
966959

967960
@[simp]
968-
theorem Basis.coe_ofEquivFun [DecidableEq ι] (e : M ≃ₗ[R] ι → R) :
961+
theorem Basis.coe_ofEquivFun [Finite ι] [DecidableEq ι] (e : M ≃ₗ[R] ι → R) :
969962
(Basis.ofEquivFun e : ι → M) = fun i => e.symm (Function.update 0 i 1) :=
970963
funext fun i =>
971964
e.injective <|
@@ -974,16 +967,14 @@ theorem Basis.coe_ofEquivFun [DecidableEq ι] (e : M ≃ₗ[R] ι → R) :
974967
#align basis.coe_of_equiv_fun Basis.coe_ofEquivFun
975968

976969
@[simp]
977-
theorem Basis.ofEquivFun_equivFun (v : Basis ι R M) : Basis.ofEquivFun v.equivFun = v := by
978-
classical
979-
ext j
980-
simp only [Basis.equivFun_symm_apply, Basis.coe_ofEquivFun]
981-
simp_rw [Function.update_apply, ite_smul]
982-
simp only [Finset.mem_univ, if_true, Pi.zero_apply, one_smul, Finset.sum_ite_eq', zero_smul]
970+
theorem Basis.ofEquivFun_equivFun [Finite ι] (v : Basis ι R M) :
971+
Basis.ofEquivFun v.equivFun = v :=
972+
Basis.repr_injective <| by ext; rfl
983973
#align basis.of_equiv_fun_equiv_fun Basis.ofEquivFun_equivFun
984974

985975
@[simp]
986-
theorem Basis.equivFun_ofEquivFun (e : M ≃ₗ[R] ι → R) : (Basis.ofEquivFun e).equivFun = e := by
976+
theorem Basis.equivFun_ofEquivFun [Finite ι] (e : M ≃ₗ[R] ι → R) :
977+
(Basis.ofEquivFun e).equivFun = e := by
987978
ext j
988979
simp_rw [Basis.equivFun_apply, Basis.ofEquivFun_repr_apply]
989980
#align basis.equiv_fun_of_equiv_fun Basis.equivFun_ofEquivFun
@@ -993,21 +984,22 @@ variable (S : Type*) [Semiring S] [Module S M']
993984
variable [SMulCommClass R S M']
994985

995986
@[simp]
996-
theorem Basis.constr_apply_fintype (f : ι → M') (x : M) :
987+
theorem Basis.constr_apply_fintype [Fintype ι] (b : Basis ι R M) (f : ι → M') (x : M) :
997988
(constr (M' := M') b S f : M → M') x = ∑ i, b.equivFun x i • f i := by
998989
simp [b.constr_apply, b.equivFun_apply, Finsupp.sum_fintype]
999990
#align basis.constr_apply_fintype Basis.constr_apply_fintype
1000991

1001992
/-- If the submodule `P` has a finite basis,
1002993
`x ∈ P` iff it is a linear combination of basis vectors. -/
1003-
theorem Basis.mem_submodule_iff' {P : Submodule R M} (b : Basis ι R P) {x : M} :
994+
theorem Basis.mem_submodule_iff' [Fintype ι] {P : Submodule R M} (b : Basis ι R P) {x : M} :
1004995
x ∈ P ↔ ∃ c : ι → R, x = ∑ i, c i • (b i : M) :=
1005996
b.mem_submodule_iff.trans <|
1006997
Finsupp.equivFunOnFinite.exists_congr_left.trans <|
1007998
exists_congr fun c => by simp [Finsupp.sum_fintype, Finsupp.equivFunOnFinite]
1008999
#align basis.mem_submodule_iff' Basis.mem_submodule_iff'
10091000

1010-
theorem Basis.coord_equivFun_symm (i : ι) (f : ι → R) : b.coord i (b.equivFun.symm f) = f i :=
1001+
theorem Basis.coord_equivFun_symm [Finite ι] (b : Basis ι R M) (i : ι) (f : ι → R) :
1002+
b.coord i (b.equivFun.symm f) = f i :=
10111003
b.coord_repr_symm i (Finsupp.equivFunOnFinite.symm f)
10121004
#align basis.coord_equiv_fun_symm Basis.coord_equivFun_symm
10131005

0 commit comments

Comments
 (0)