From 8120250418101bb1bfe20d184e72557e6a61bb9b Mon Sep 17 00:00:00 2001 From: yosakaon Date: Wed, 29 Jul 2026 11:26:03 +0200 Subject: [PATCH] is_derive_trmx Co-authored-by: Reynald Affeldt --- theories/derive.v | 60 +++++++++++++++++++ .../normedtype_theory/matrix_normedtype.v | 28 +++++++++ 2 files changed, 88 insertions(+) diff --git a/theories/derive.v b/theories/derive.v index 07a7aa7cab..ed28952c66 100644 --- a/theories/derive.v +++ b/theories/derive.v @@ -2341,6 +2341,66 @@ apply/derivable_mxP => i0 j0. by have [] := MdM i0 j0. Qed. +Lemma derivable_trmx m n (M : V -> 'M[R]_(m, n)) t v : + derivable (fun x => (M x)^T) t v = derivable M t v. +Proof. +rewrite propeqE; split; rewrite /derivable/=. +- move=> /cvg_ex[/= l Hl]. + apply/cvg_ex => /=; exists l^T. + apply/cvgrPdist_le => /= e e0. + move/cvgrPdist_le : Hl => /(_ _ e0)[/= r r0 re]. + near=> x. + rewrite [leLHS](_ : _ = + `|l - x^-1 *: ((M (x *: v + t))^T - (M t)^T)|); last 2 first. + rewrite -[RHS]norm_trmx. + rewrite [in RHS]linearD/=. + rewrite [in RHS]linearN/=. + congr (`| _ - _ |). + rewrite [RHS]linearZ/=. + rewrite [in RHS]linearB. + by rewrite /= !trmxK. + apply: re => /=. + rewrite sub0r normrN. + by near: x; exact: dnbhs0_lt. + by near: x; exact: nbhs_dnbhs_neq. +- move=> /cvg_ex[/= l Hl]. + apply/cvg_ex => /=; exists l^T. + apply/cvgrPdist_le => /= e e0. + move/cvgrPdist_le : Hl => /(_ _ e0)[/= r r0 re]. + near=> x. + rewrite [leLHS](_ : _ = `|l - x^-1 *: ((M (x *: v + t)) - (M t))|); last 2 first. + rewrite -[RHS]norm_trmx. + rewrite [in RHS]linearD/=. + rewrite [in RHS]linearN/=. + congr (`| _ - _ |). + rewrite [RHS]linearZ/=. + by rewrite [in RHS]linearB. + apply: re => /=. + rewrite sub0r normrN. + by near: x; exact: dnbhs0_lt. + by near: x; exact: nbhs_dnbhs_neq. +Unshelve. all: by end_near. Qed. + +Lemma derive_trmx {m n : nat} (M : V -> 'M[R]_(m, n)) t v : + derivable M t v -> 'D_v (trmx \o M) t = ('D_v M t)^T. +Proof. +move=> Mt1. +rewrite !derive_mx//=. + by rewrite derivable_trmx. +apply/matrixP => i j; rewrite !mxE. +by under eq_fun do rewrite mxE. +Qed. + +Global Instance is_derive_trmx {m n : nat} + (f : V -> 'M[R]_(m, n)) (f' : 'M[R]_(m, n)) (t : V) w: + is_derive t w f f' -> is_derive t w (fun x => (f x)^T) f'^T. +Proof. +move=> fD. +have fDer : derivable f t w by case: fD. +apply/DeriveDef; last by have [_ <-] := fD; rewrite derive_trmx. +by rewrite derivable_trmx. +Qed. + Fact dmx {m n : nat} (M : V -> 'M[R]_(m, n)) (x : V) : let g := fun t : V => (\matrix_(i < m, j < n) 'd M x t i j) in differentiable M x -> diff --git a/theories/normedtype_theory/matrix_normedtype.v b/theories/normedtype_theory/matrix_normedtype.v index 76783da1e7..d8a6b614f3 100644 --- a/theories/normedtype_theory/matrix_normedtype.v +++ b/theories/normedtype_theory/matrix_normedtype.v @@ -172,6 +172,34 @@ Qed. End mx_norm. +Section norm_trmx. + +Import Order.TTheory GRing.Theory Num.Def Num.Theory. +Import Order.Def. +Local Open Scope ring_scope. +Lemma nng_max0r {K : realFieldType} : left_id ((0:K)%:nng) (@maxr {nonneg K}). +Proof. +move=> x. +rewrite /max; case: ifPn => //. +rewrite -leNgt => x0. +apply/eqP; rewrite eq_le; apply/andP; split; last first. + exact: x0. +by have : 0 <= x%:nngnum by []. (* NB: this should be automatic *) +Qed. + +HB.instance Definition _ {K : realFieldType} := + Monoid.isComLaw.Build {nonneg K} 0%:nng max maxA maxC nng_max0r. + +Lemma norm_trmx m n {R : realFieldType} (M : 'M[R]_(m, n)) : mx_norm (M^T) = mx_norm M. +Proof. +rewrite [LHS]mx_normE/=. +under eq_bigr do rewrite mxE /=. +rewrite -(pair_big xpredT xpredT (fun i j => `|M j i|%:nng))/=. +by rewrite exchange_big//= pair_big. +Qed. + +End norm_trmx. + Lemma mx_normrE (K : realDomainType) (m n : nat) (x : 'M[K]_(m, n)) : mx_norm x = \big[maxr/0]_ij `|x ij.1 ij.2|. Proof.