@@ -4,38 +4,59 @@ Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Oliver Nash
5
5
-/
6
6
import linear_algebra.multilinear.basic
7
- import linear_algebra.matrix.to_lin
7
+ import linear_algebra.free_module.finite.basic
8
8
9
9
/-! # Multilinear maps over finite dimensional spaces
10
10
11
- The main result of this file is `multilinear_map.finite_dimensional`.
11
+ The main results are that multilinear maps over finitely-generated, free modules are
12
+ finitely-generated and free.
12
13
13
- We do not put this in `linear_algebra/multilinear_map/basic`, as `matrix.to_lin` pulls in a lot of
14
- imports, which can cause timeouts downstream.
14
+ * `module.finite.multilinear_map`
15
+ * `module.free.multilinear_map`
16
+
17
+ We do not put this in `linear_algebra/multilinear_map/basic` to avoid making the imports too large
18
+ there.
15
19
-/
16
20
17
21
namespace multilinear_map
18
22
19
23
variables {ι R M₂ : Type *} {M₁ : ι → Type *}
20
24
variables [decidable_eq ι]
21
- variables [fintype ι] [field R] [add_comm_group M₂] [module R M₂] [finite_dimensional R M₂]
22
- variables [∀ i, add_comm_group (M₁ i)] [∀ i, module R (M₁ i)] [∀ i, finite_dimensional R (M₁ i)]
25
+ variables [fintype ι] [comm_ring R] [add_comm_group M₂] [module R M₂]
26
+ variables [Π i, add_comm_group (M₁ i)] [Π i, module R (M₁ i)]
27
+ variables [module.finite R M₂] [module.free R M₂]
28
+ variables [∀ i, module.finite R (M₁ i)] [∀ i, module.free R (M₁ i)]
23
29
24
- instance : finite_dimensional R (multilinear_map R M₁ M₂) :=
30
+ -- the induction requires us to show both at once
31
+ private lemma free_and_finite :
32
+ module.free R (multilinear_map R M₁ M₂) ∧ module.finite R (multilinear_map R M₁ M₂) :=
25
33
begin
26
- suffices : ∀ n (N : fin n → Type *) [∀ i, add_comm_group (N i)],
27
- by exactI ∀ [∀ i, module R (N i)], by exactI ∀ [∀ i, finite_dimensional R (N i)],
28
- finite_dimensional R (multilinear_map R N M₂),
29
- { haveI := this _ (M₁ ∘ (fintype.equiv_fin ι).symm),
34
+ -- the `fin n` case is sufficient
35
+ suffices : ∀ n (N : fin n → Type *) [Π i, add_comm_group (N i)],
36
+ by exactI ∀ [Π i, module R (N i)],
37
+ by exactI ∀ [∀ i, module.finite R (N i)] [∀ i, module.free R (N i)],
38
+ module.free R (multilinear_map R N M₂) ∧ module.finite R (multilinear_map R N M₂),
39
+ { casesI this _ (M₁ ∘ (fintype.equiv_fin ι).symm),
30
40
have e := dom_dom_congr_linear_equiv' R M₁ M₂ (fintype.equiv_fin ι),
31
- exact e.symm.finite_dimensional, },
32
- intros,
33
- induction n with n ih,
34
- { exactI (const_linear_equiv_of_is_empty R N M₂ : _).finite_dimensional, },
35
- { resetI,
36
- suffices : finite_dimensional R (N 0 →ₗ[R] multilinear_map R (λ (i : fin n), N i.succ) M₂),
37
- { exact (multilinear_curry_left_equiv R N M₂).finite_dimensional, },
38
- apply linear_map.finite_dimensional, },
41
+ exact ⟨module.free.of_equiv e.symm, module.finite.equiv e.symm⟩, },
42
+ introsI n N _ _ _ _,
43
+ unfreezingI { induction n with n ih },
44
+ { exact ⟨module.free.of_equiv (const_linear_equiv_of_is_empty R N M₂),
45
+ module.finite.equiv (const_linear_equiv_of_is_empty R N M₂)⟩ },
46
+ { suffices :
47
+ module.free R (N 0 →ₗ[R] multilinear_map R (λ (i : fin n), N i.succ) M₂) ∧
48
+ module.finite R (N 0 →ₗ[R] multilinear_map R (λ (i : fin n), N i.succ) M₂),
49
+ { casesI this ,
50
+ exact ⟨module.free.of_equiv (multilinear_curry_left_equiv R N M₂),
51
+ module.finite.equiv (multilinear_curry_left_equiv R N M₂)⟩ },
52
+ casesI ih (λ i, N i.succ),
53
+ exact ⟨module.free.linear_map _ _ _, module.finite.linear_map _ _⟩ },
39
54
end
40
55
56
+ instance _root_.module.finite.multilinear_map : module.finite R (multilinear_map R M₁ M₂) :=
57
+ free_and_finite.2
58
+
59
+ instance _root_.module.free.multilinear_map : module.free R (multilinear_map R M₁ M₂) :=
60
+ free_and_finite.1
61
+
41
62
end multilinear_map
0 commit comments