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

Commit ab0a295

Browse files
committed
feat(linear_algebra/matrix): some bounds on the determinant of matrices (#9029)
This PR shows that matrices with bounded entries also have bounded determinants. `matrix.det_le` is the most generic version of these results, which we specialise in two steps to `matrix.det_sum_smul_le`. In a follow-up PR we will connect this to `algebra.left_mul_matrix` to provide an upper bound on `algebra.norm`. Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>
1 parent 4222c32 commit ab0a295

1 file changed

Lines changed: 72 additions & 0 deletions

File tree

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/-
2+
Copyright (c) 2021 Anne Baanen. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Anne Baanen
5+
-/
6+
import data.int.absolute_value
7+
import linear_algebra.matrix.determinant
8+
9+
/-!
10+
# Absolute values and matrices
11+
12+
This file proves some bounds on matrices involving absolute values.
13+
14+
## Main results
15+
16+
* `matrix.det_le`: if the entries of an `n × n` matrix are bounded by `x`,
17+
then the determinant is bounded by `n! x^n`
18+
* `matrix.det_sum_le`: if we have `s` `n × n` matrices and the entries of each
19+
matrix are bounded by `x`, then the determinant of their sum is bounded by `n! (s * x)^n`
20+
* `matrix.det_sum_smul_le`: if we have `s` `n × n` matrices each multiplied by
21+
a constant bounded by `y`, and the entries of each matrix are bounded by `x`,
22+
then the determinant of the linear combination is bounded by `n! (s * y * x)^n`
23+
-/
24+
25+
open_locale big_operators
26+
open_locale matrix
27+
28+
namespace matrix
29+
30+
open equiv finset
31+
32+
variables {R S : Type*} [comm_ring R] [nontrivial R] [linear_ordered_comm_ring S]
33+
variables {n : Type*} [fintype n] [decidable_eq n]
34+
35+
lemma det_le {A : matrix n n R} {abv : absolute_value R S}
36+
{x : S} (hx : ∀ i j, abv (A i j) ≤ x) :
37+
abv A.det ≤ nat.factorial (fintype.card n) • x ^ (fintype.card n) :=
38+
calc abv A.det
39+
= abv (∑ σ : perm n, _) : congr_arg abv (det_apply _)
40+
... ≤ ∑ σ : perm n, abv _ : abv.sum_le _ _
41+
... = ∑ σ : perm n, (∏ i, abv (A (σ i) i)) : sum_congr rfl (λ σ hσ,
42+
by rw [abv.map_units_int_smul, abv.map_prod])
43+
... ≤ ∑ σ : perm n, (∏ (i : n), x) :
44+
sum_le_sum (λ _ _, prod_le_prod (λ _ _, abv.nonneg _) (λ _ _, hx _ _))
45+
... = ∑ σ : perm n, x ^ (fintype.card n) : sum_congr rfl (λ _ _,
46+
by rw [prod_const, finset.card_univ])
47+
... = nat.factorial (fintype.card n) • x ^ (fintype.card n) :
48+
by rw [sum_const, finset.card_univ, fintype.card_perm]
49+
50+
lemma det_sum_le {ι : Type*} (s : finset ι) {A : ι → matrix n n R}
51+
{abv : absolute_value R S} {x : S} (hx : ∀ k i j, abv (A k i j) ≤ x) :
52+
abv (det (∑ k in s, A k)) ≤
53+
nat.factorial (fintype.card n) • (finset.card s • x) ^ (fintype.card n) :=
54+
det_le $ λ i j,
55+
calc abv ((∑ k in s, A k) i j)
56+
= abv (∑ k in s, A k i j) : by simp only [sum_apply]
57+
... ≤ ∑ k in s, abv (A k i j) : abv.sum_le _ _
58+
... ≤ ∑ k in s, x : sum_le_sum (λ k _, hx k i j)
59+
... = s.card • x : sum_const _
60+
61+
lemma det_sum_smul_le {ι : Type*} (s : finset ι) {c : ι → R} {A : ι → matrix n n R}
62+
{abv : absolute_value R S}
63+
{x : S} (hx : ∀ k i j, abv (A k i j) ≤ x) {y : S} (hy : ∀ k, abv (c k) ≤ y) :
64+
abv (det (∑ k in s, c k • A k)) ≤
65+
nat.factorial (fintype.card n) • (finset.card s • y * x) ^ (fintype.card n) :=
66+
by simpa only [smul_mul_assoc] using
67+
det_sum_le s (λ k i j,
68+
calc abv (c k * A k i j)
69+
= abv (c k) * abv (A k i j) : abv.map_mul _ _
70+
... ≤ y * x : mul_le_mul (hy k) (hx k i j) (abv.nonneg _) ((abv.nonneg _).trans (hy k)))
71+
72+
end matrix

0 commit comments

Comments
 (0)