Skip to content

Commit 9e026f3

Browse files
authored
Merge pull request #887 from proux01/sqrte
Add sqrte
2 parents d835a04 + c286351 commit 9e026f3

3 files changed

Lines changed: 68 additions & 0 deletions

File tree

CHANGELOG_UNRELEASED.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@
6363
+ lemmas `inum_eq`, `inum_le`, `inum_lt`
6464
- in `measure.v`:
6565
+ lemmas `ae_imply`, `ae_imply2`
66+
- in `mathcomp_extra.v`
67+
+ lemma `ler_sqrt`
68+
- in `constructive_ereal.v`
69+
+ definition `sqrte`
70+
+ lemmas `sqrte0`, `sqrte_ge0`, `lee_sqrt`, `sqrteM`, `sqr_sqrte`,
71+
`sqrte_sqr`, `sqrte_fin_num`
6672

6773
### Changed
6874

classical/mathcomp_extra.v

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,3 +1125,12 @@ End DFunWith.
11251125
Arguments dfwith {I T} f i x.
11261126

11271127
Definition swap (T1 T2 : Type) (x : T1 * T2) := (x.2, x.1).
1128+
1129+
Lemma ler_sqrt {R : rcfType} (a b : R) :
1130+
(0 <= b -> (Num.sqrt a <= Num.sqrt b) = (a <= b))%R.
1131+
Proof.
1132+
have [b_gt0 _|//|<- _] := ltgtP; last first.
1133+
by rewrite sqrtr0 -sqrtr_eq0 le_eqVlt ltNge sqrtr_ge0 orbF.
1134+
have [a_le0|a_gt0] := ler0P a; last by rewrite ler_psqrt.
1135+
by rewrite ler0_sqrtr // sqrtr_ge0 (le_trans a_le0) ?ltW.
1136+
Qed.

theories/constructive_ereal.v

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Require Import signed.
3030
(* r%:E == injects real numbers into \bar R *)
3131
(* +%E, -%E, *%E == addition/opposite/multiplication for extended *)
3232
(* reals *)
33+
(* sqrte == square root for extended reals *)
3334
(* `| x |%E == the absolute value of x *)
3435
(* x ^+ n == iterated multiplication *)
3536
(* x *+ n == iterated addition *)
@@ -3063,6 +3064,58 @@ End DualRealFieldType_lemmas.
30633064

30643065
End DualAddTheoryRealField.
30653066

3067+
Section sqrte.
3068+
Variable R : rcfType.
3069+
Implicit Types x y : \bar R.
3070+
3071+
Definition sqrte x :=
3072+
if x is +oo then +oo else if x is r%:E then (Num.sqrt r)%:E else 0.
3073+
3074+
Lemma sqrte0 : sqrte 0 = 0 :> \bar R.
3075+
Proof. by rewrite /= sqrtr0. Qed.
3076+
3077+
Lemma sqrte_ge0 x : 0 <= sqrte x.
3078+
Proof. by case: x => [x|//|]; rewrite /= ?leey// lee_fin sqrtr_ge0. Qed.
3079+
3080+
Lemma lee_sqrt x y : 0 <= y -> (sqrte x <= sqrte y) = (x <= y).
3081+
Proof.
3082+
case: x y => [x||] [y||] yge0 //=.
3083+
- exact: mathcomp_extra.ler_sqrt.
3084+
- by rewrite !leey.
3085+
- by rewrite leNye lee_fin sqrtr_ge0.
3086+
Qed.
3087+
3088+
Lemma sqrteM x y : 0 <= x -> sqrte (x * y) = sqrte x * sqrte y.
3089+
Proof.
3090+
case: x y => [x||] [y||] //= age0.
3091+
- by rewrite sqrtrM ?EFinM.
3092+
- move: age0; rewrite le_eqVlt eqe => /predU1P[<-|x0].
3093+
by rewrite mul0e sqrte0 sqrtr0 mul0e.
3094+
by rewrite mulry gtr0_sg ?mul1e// mulry gtr0_sg ?mul1e// sqrtr_gt0.
3095+
- move: age0; rewrite mule0 mulrNy lee_fin -sgr_ge0.
3096+
by case: sgrP; rewrite ?mul0e ?sqrte0// ?mul1e// ler0N1.
3097+
- rewrite !mulyr; case: (sgrP y) => [->||].
3098+
+ by rewrite sqrtr0 sgr0 mul0e sqrte0.
3099+
+ by rewrite mul1e/= -sqrtr_gt0 -sgr_gt0 -lte_fin => /gt0_muley->.
3100+
+ by move=> y0; rewrite EFinN mulN1e/= ltr0_sqrtr// sgr0 mul0e.
3101+
- by rewrite mulyy.
3102+
- by rewrite mulyNy mule0.
3103+
Qed.
3104+
3105+
Lemma sqr_sqrte x : 0 <= x -> sqrte x ^+ 2 = x.
3106+
Proof.
3107+
case: x => [x||] xge0; rewrite expe2 ?mulyy//.
3108+
by rewrite -sqrteM// -EFinM/= sqrtr_sqr ger0_norm.
3109+
Qed.
3110+
3111+
Lemma sqrte_sqr x : sqrte (x ^+ 2) = `|x|%E.
3112+
Proof. by case: x => [x||//]; rewrite /expe/= ?sqrtr_sqr// mulyy. Qed.
3113+
3114+
Lemma sqrte_fin_num x : 0 <= x -> (sqrte x \is a fin_num) = (x \is a fin_num).
3115+
Proof. by case: x => [x|//|//]; rewrite !qualifE/=. Qed.
3116+
3117+
End sqrte.
3118+
30663119
Module DualAddTheory.
30673120
Export DualAddTheoryNumDomain.
30683121
Export DualAddTheoryRealDomain.

0 commit comments

Comments
 (0)