@@ -19,7 +19,7 @@ Require Import signed topology normedtype landau sequences derive realfun.
1919(* pseries_diffs f i == (i + 1) * f (i + 1) *)
2020(* *)
2121(* ln x == the natural logarithm *)
22- (* a `^ x == exponential functions *)
22+ (* a `^ x == power function (assumes a >= 0) *)
2323(* riemannR a == sequence n |-> 1 / (n.+1) `^ a where a has a type *)
2424(* of type realType *)
2525(* *)
@@ -572,68 +572,155 @@ Unshelve. all: by end_near. Qed.
572572
573573End Ln.
574574
575- Section ExpFun .
575+ Section PowerPos .
576576Variable R : realType.
577577Implicit Types a x : R.
578578
579- Definition exp_fun a x := expR (x * ln a).
579+ Definition power_pos a x :=
580+ if a == 0 then (x == 0)%:R else expR (x * ln a).
580581
581- Local Notation "a `^ x" := (exp_fun a x).
582+ Local Notation "a `^ x" := (power_pos a x).
582583
583- Lemma exp_fun_gt0 a x : 0 < a `^ x. Proof . by rewrite expR_gt0. Qed .
584+ Lemma power_pos_ge0 a x : 0 <= a `^ x.
585+ Proof . by rewrite /power_pos; case: ifPn => // _; exact: expR_ge0. Qed .
584586
585- Lemma exp_funr1 a : 0 < a -> a `^ 1 = a .
586- Proof . by move=> a0; rewrite /exp_fun mul1r lnK . Qed .
587+ Lemma power_pos_gt0 a x : 0 < a -> 0 < a `^ x .
588+ Proof . by move=> a0; rewrite /power_pos gt_eqF// expR_gt0 . Qed .
587589
588- Lemma exp_funr0 a : 0 < a -> a `^ 0 = 1.
589- Proof . by move=> a0; rewrite /exp_fun mul0r expR0. Qed .
590+ Lemma power_posr1 a : 0 <= a -> a `^ 1 = a.
591+ Proof .
592+ move=> a0; rewrite /power_pos; case: ifPn => [/eqP->|a0'].
593+ by rewrite oner_eq0.
594+ by rewrite mul1r lnK// posrE lt_neqAle eq_sym a0'.
595+ Qed .
596+
597+ Lemma power_posr0 a : a `^ 0 = 1.
598+ Proof .
599+ by rewrite /power_pos; case: ifPn; rewrite ?eqxx// mul0r expR0.
600+ Qed .
601+
602+ Lemma power_pos0 x : power_pos 0 x = (x == 0)%:R.
603+ Proof . by rewrite /power_pos eqxx. Qed .
604+
605+ Lemma power_pos1 : power_pos 1 = fun=> 1.
606+ Proof . by apply/funext => x; rewrite /power_pos oner_eq0 ln1 mulr0 expR0. Qed .
590607
591- Lemma exp_fun1 : exp_fun 1 = fun=> 1.
592- Proof . by rewrite funeqE => x; rewrite /exp_fun ln1 mulr0 expR0. Qed .
608+ Lemma power_pos_eq0 x p : x `^ p = 0 -> x = 0.
609+ Proof .
610+ rewrite /power_pos. have [->|_] := eqVneq x 0 => //.
611+ by move: (expR_gt0 (p * ln x)) => /gt_eqF /eqP.
612+ Qed .
593613
594- Lemma ler_exp_fun a : 1 < a -> {homo exp_fun a : x y / x <= y}.
595- Proof . by move=> a1 x y xy; rewrite /exp_fun ler_expR ler_pmul2r // ln_gt0. Qed .
614+ Lemma ler_power_pos a : 1 < a -> {homo power_pos a : x y / x <= y}.
615+ Proof .
616+ move=> a1 x y xy.
617+ by rewrite /power_pos gt_eqF ?(le_lt_trans _ a1)// ler_expR ler_pmul2r// ln_gt0.
618+ Qed .
596619
597- Lemma exp_funD a : 0 < a -> {morph exp_fun a : x y / x + y >-> x * y}.
598- Proof . by move=> a0 x y; rewrite [in LHS]/exp_fun mulrDl expRD. Qed .
620+ Lemma power_posM x y r : 0 <= x -> 0 <= y -> (x * y) `^ r = x `^ r * y `^ r.
621+ Proof .
622+ rewrite 2!le_eqVlt.
623+ move=> /predU1P[<-|x0] /predU1P[<-|y0]; rewrite ?(mulr0, mul0r,power_pos0).
624+ - by rewrite -natrM; case: eqP.
625+ - by case: eqP => [->|]/=; rewrite ?mul0r ?power_posr0 ?mulr1.
626+ - by case: eqP => [->|]/=; rewrite ?mulr0 ?power_posr0 ?mulr1.
627+ - rewrite /power_pos mulf_eq0; case: eqP => [->|x0']/=.
628+ rewrite (@gt_eqF _ _ y)//.
629+ by case: eqP => /=; rewrite ?mul0r ?mul1r// => ->; rewrite mul0r expR0.
630+ by rewrite gt_eqF// lnM ?posrE // -expRD mulrDr.
631+ Qed .
599632
600- Lemma exp_fun_inv a : 0 < a -> a `^ (-1) = a ^-1 .
633+ Lemma power_posAC x y z : (x `^ y) `^ z = (x `^ z) `^ y .
601634Proof .
602- move=> a0.
635+ rewrite /power_pos.
636+ have [->/=|z0] := eqVneq z 0; rewrite ?mul0r.
637+ - have [->/=|y0] := eqVneq y 0; rewrite ?mul0r//=.
638+ have [x0|x0] := eqVneq x 0; rewrite ?eqxx ?oner_eq0 ?ln1 ?mulr0 ?expR0//.
639+ by rewrite oner_eq0 if_same ln1 mulr0 expR0.
640+ - have [->/=|y0] := eqVneq y 0; rewrite ?mul0r/=.
641+ have [x0|x0] := eqVneq x 0; rewrite ?eqxx ?oner_eq0 ?ln1 ?mulr0 ?expR0//.
642+ by rewrite oner_eq0 if_same ln1 mulr0 expR0.
643+ have [x0|x0] := eqVneq x 0; rewrite ?eqxx ?oner_eq0 ?ln1 ?mulr0 ?expR0.
644+ by [].
645+ rewrite gt_eqF ?expR_gt0// gt_eqF; last by rewrite expR_gt0.
646+ by rewrite !expK mulrCA.
647+ Qed .
648+
649+ Lemma power_posD a : 0 < a -> {morph power_pos a : x y / x + y >-> x * y}.
650+ Proof . by move=> a0 x y; rewrite /power_pos gt_eqF// mulrDl expRD. Qed .
651+
652+ Lemma power_pos_mulrn a n : 0 <= a -> a `^ n%:R = a ^+ n.
653+ Proof .
654+ move=> a0; elim: n => [|n ih].
655+ by rewrite mulr0n expr0 power_posr0//; apply: lt0r_neq0.
656+ move: a0; rewrite le_eqVlt => /predU1P[<-|a0].
657+ by rewrite !power_pos0 mulrn_eq0/= oner_eq0/= expr0n.
658+ by rewrite -natr1 power_posD// ih power_posr1// ?exprS 1?mulrC// ltW.
659+ Qed .
660+
661+ Lemma power_pos_inv1 a : 0 <= a -> a `^ (-1) = a ^-1.
662+ Proof .
663+ rewrite le_eqVlt => /predU1P[<-|a0].
664+ by rewrite power_pos0 invr0 oppr_eq0 oner_eq0.
603665apply/(@mulrI _ a); first by rewrite unitfE gt_eqF.
604- rewrite -[X in X * _ = _](exp_funr1 a0) -exp_funD // subrr exp_funr0 // .
605- by rewrite divrr // unitfE gt_eqF.
666+ rewrite -[X in X * _ = _](power_posr1 (ltW a0)) -power_posD // subrr.
667+ by rewrite power_posr0 divff// gt_eqF.
606668Qed .
607669
608- Lemma exp_fun_mulrn a n : 0 < a -> exp_fun a n%:R = a ^+ n.
670+ Lemma power_pos_inv a n : 0 <= a -> a `^ (- n%:R) = a ^- n.
609671Proof .
610- move=> a0; elim: n => [|n ih]; first by rewrite mulr0n expr0 exp_funr0.
611- by rewrite -natr1 exprSr exp_funD// ih exp_funr1.
672+ move=> a0; elim: n => [|n ih].
673+ by rewrite -mulNrn mulr0n power_posr0 -exprVn expr0.
674+ move: a0; rewrite le_eqVlt => /predU1P[<-|a0].
675+ by rewrite power_pos0 oppr_eq0 mulrn_eq0 oner_eq0 orbF exprnN exp0rz oppr_eq0.
676+ rewrite -natr1 opprD power_posD// (power_pos_inv1 (ltW a0)) ih.
677+ by rewrite -[in RHS]exprVn exprS [in RHS]mulrC exprVn.
612678Qed .
613679
614- End ExpFun.
615- Notation "a `^ x" := (exp_fun a x).
680+ Lemma power_pos_intmul a (z : int) : 0 <= a -> a `^ z%:~R = a ^ z.
681+ Proof .
682+ move=> a0; have [z0|z0] := leP 0 z.
683+ rewrite -[in RHS](gez0_abs z0) abszE -exprnP -power_pos_mulrn//.
684+ by rewrite natr_absz -abszE gez0_abs.
685+ rewrite -(opprK z) (_ : - z = `|z|%N); last by rewrite ltz0_abs.
686+ by rewrite -exprnN -power_pos_inv// nmulrn.
687+ Qed .
688+
689+ Lemma power12_sqrt a : 0 <= a -> a `^ (2^-1) = Num.sqrt a.
690+ Proof .
691+ rewrite le_eqVlt => /predU1P[<-|a0].
692+ by rewrite power_pos0 sqrtr0 invr_eq0 pnatr_eq0.
693+ have /eqP : (a `^ (2^-1)) ^+ 2 = (Num.sqrt a) ^+ 2.
694+ rewrite sqr_sqrtr; last exact: ltW.
695+ by rewrite /power_pos gt_eqF// -expRMm mulrA divrr ?mul1r ?unitfE// lnK.
696+ rewrite eqf_sqr => /predU1P[//|/eqP h].
697+ have : 0 < a `^ 2^-1 by apply: power_pos_gt0.
698+ by rewrite h oppr_gt0 ltNge sqrtr_ge0.
699+ Qed .
700+
701+ End PowerPos.
702+ Notation "a `^ x" := (power_pos a x) : real_scope.
616703
617704Section riemannR_series.
618705Variable R : realType.
619706Implicit Types a : R.
620- Local Open Scope ring_scope .
707+ Local Open Scope real_scope .
621708
622709Definition riemannR a : R ^nat := fun n => (n.+1%:R `^ a)^-1.
623710Arguments riemannR a n /.
624711
625- Lemma riemannR_gt0 a i : 0 < a -> 0 < riemannR a i.
626- Proof . move=> ?; by rewrite /riemannR invr_gt0 exp_fun_gt0 . Qed .
712+ Lemma riemannR_gt0 a i : 0 <= a -> 0 < riemannR a i.
713+ Proof . by move=> ?; rewrite /riemannR invr_gt0 power_pos_gt0 . Qed .
627714
628- Lemma dvg_riemannR a : 0 < a <= 1 -> ~ cvg (series (riemannR a)).
715+ Lemma dvg_riemannR a : 0 <= a <= 1 -> ~ cvg (series (riemannR a)).
629716Proof .
630- case/andP => a0; rewrite le_eqVlt => /orP[/eqP ->|a1].
717+ case/andP => a0; rewrite le_eqVlt => /predU1P[ ->|a1].
631718 rewrite (_ : riemannR 1 = harmonic); first exact: dvg_harmonic.
632- by rewrite funeqE => i /=; rewrite exp_funr1 .
719+ by rewrite funeqE => i /=; rewrite power_posr1 .
633720have : forall n, harmonic n <= riemannR a n.
634- case=> /= [|n]; first by rewrite exp_fun1 invr1.
635- rewrite -[leRHS]div1r ler_pdivl_mulr ?exp_fun_gt0 // mulrC ler_pdivr_mulr //.
636- by rewrite mul1r -[leRHS]exp_funr1 // (ler_exp_fun ) // ?ltr1n // ltW.
721+ case=> /= [|n]; first by rewrite power_pos1 invr1.
722+ rewrite -[leRHS]div1r ler_pdivl_mulr ?power_pos_gt0 // mulrC ler_pdivr_mulr //.
723+ by rewrite mul1r -[leRHS]power_posr1 // (ler_power_pos ) // ?ltr1n // ltW.
637724move/(series_le_cvg harmonic_ge0 (fun i => ltW (riemannR_gt0 i a0))).
638725by move/contra_not; apply; exact: dvg_harmonic.
639726Qed .
0 commit comments