@@ -277,58 +277,60 @@ Proof. by apply/eqP; rewrite eq_complex/= mulr0 !mul0r subr0 addr0 !eqxx. Qed.
277277
278278End backport_complex.
279279
280- Section backport_trigo.
281- Variable R : realType.
280+ Section backport_trigo_alternating.
281+ Variables (U : zmodType) (V : ringType).
282+ Implicit Type f : U -> V.
282283
283- Lemma sin_nat_pi (n : nat) : sin (n%:R * pi) = 0 :> R.
284- Proof .
285- elim: n => [|n ih]; first by rewrite mul0r sin0.
286- by rewrite -addn1 natrD mulrDl mul1r sinD ih sinpi mul0r mulr0 add0r.
287- Qed .
284+ Lemma alternatingN f (T : U) : alternating f T -> alternating f (- T).
285+ Proof . by move=> fT u; rewrite -[LHS]opprK -fT subrK. Qed .
288286
289- Lemma sin_int_pi (k : int) : sin (k%:~R * pi) = 0 :> R.
287+ Lemma alternatingz f (T : U) : alternating f T ->
288+ forall k a, f (a + T *~ k) = (- 1) ^+ `|k|%N * f a.
290289Proof .
291- wlog k0 : k / 0 <= k.
292- move=> h; have [k0|k0] := leP 0 k; first by rewrite h .
293- by rewrite -(opprK (_ * _ )) sinN -mulNr -mulrNz h ?oppr0// ler_oppr oppr0 ltW .
294- by rewrite -[in LHS](gez0_abs k0) sin_nat_pi .
290+ move=> fT k; have [k0 a|k0 a] := leP 0 k.
291+ by rewrite -(gez0_abs k0) -pmulrn alternatingn .
292+ rewrite -(alternatingn (alternatingN fT )) -[in LHS](opprK k) -(ltz0_abs k0) .
293+ by rewrite mulrNz mulNrn .
295294Qed .
296295
297- Lemma sin_eq0 (r : R) : sin r = 0 <-> exists k, r = k%:~R * pi.
296+ End backport_trigo_alternating.
297+
298+ Section backport_trigo.
299+ Variable R : realType.
300+
301+ Lemma sin_nat_pi n : sin (pi *+ n) = 0 :> R.
302+ Proof . by rewrite -[_ *+ _]add0r (alternatingn (@sinDpi _)) sin0 mulr0. Qed .
303+
304+ Lemma sin_int_pi k : sin (pi *~ k) = 0 :> R.
305+ Proof . by rewrite -[_ *~ _]add0r (alternatingz (@sinDpi _)) sin0 mulr0. Qed .
306+
307+ Lemma cos_nat_pi n : cos (pi *+ n) = (- 1) ^+ n :> R.
308+ Proof . by rewrite -[_ *+ _]add0r (alternatingn (@cosDpi _)) cos0 mulr1. Qed .
309+
310+ Lemma cos_int_pi k : cos (pi *~ k) = (- 1) ^+ `|k|%N :> R.
311+ Proof . by rewrite -[_ *~ _]add0r (alternatingz (@cosDpi _)) cos0 mulr1. Qed .
312+
313+ Lemma sin_eq0 (r : R) : sin r = 0 <-> exists k, r = pi *~ k.
298314Proof .
299315split; last by move=> [k ->]; rewrite sin_int_pi.
300316wlog rpi : r / - pi < r <= pi.
301317 move=> h1 sr0; wlog r0 : r sr0 / 0 <= r.
302318 move=> h2; have [|r0] := leP 0 r; first exact: h2.
303319 have := h2 (- r); rewrite sinN sr0 oppr0 => /(_ erefl); rewrite ler_oppr.
304- rewrite oppr0 => /(_ (ltW r0))[k rkpi]; exists (- k); rewrite mulrNz mulNr.
305- by rewrite -rkpi opprK.
320+ by rewrite oppr0 => /(_ (ltW r0))[k rkpi]; exists (- k); rewrite mulrNz -rkpi opprK.
306321 have [rpi|pir] := leP r pi.
307322 by apply: h1 => //; rewrite rpi (lt_le_trans _ r0)// ltr_oppl oppr0 pi_gt0.
308- have /h1 : - pi < r - ( floor (r / pi))%:~R * pi <= pi.
323+ have /h1 : - pi < r - pi *~ floor (r / pi) <= pi.
309324 apply/andP; split.
310- rewrite ltr_subr_addr addrC -[X in _ - X]mul1r -mulrBl.
325+ rewrite -mulrzl ltr_subr_addr addrC -[X in _ - X]mul1r -mulrBl.
311326 rewrite -ltr_pdivl_mulr ?pi_gt0// ltr_subl_addr -RfloorE.
312327 by rewrite (le_lt_trans (Rfloor_le _))// ltr_addl ltr01.
313- rewrite ler_subl_addr -[X in X + _]mul1r -mulrDl.
328+ rewrite -mulrzl ler_subl_addr -[X in X + _]mul1r -mulrDl.
314329 by rewrite -ler_pdivr_mulr ?pi_gt0// addrC -RfloorE ltW // lt_succ_Rfloor.
315330 rewrite sinB sin_int_pi mulr0 subr0 sr0 mul0r => /(_ erefl)[k /eqP].
316- by rewrite subr_eq -mulrDl -intrD => /eqP rkpi; eexists; exact: rkpi.
331+ rewrite subr_eq -mulrzDl => /eqP rkpi; eexists; exact: rkpi.
317332by move=> /eqP; rewrite sin_eq0_Npipi// => /orP[|] /eqP ->;
318- [exists 0; rewrite mul0r|exists 1; rewrite mul1r].
319- Qed .
320-
321- Lemma cos_pi_mulrn n : cos (pi *+ n) = (- 1) ^+ odd n :> R.
322- Proof .
323- elim: n => [|n ih]; first by rewrite mulr0n/= cos0 expr0.
324- by rewrite mulrS cosD cospi sinpi mul0r subr0 {}ih/= signrN mulN1r.
325- Qed .
326-
327- Lemma cos_pi_mulrz (k : int) : cos (pi *~ k) = (- 1) ^+ odd `|k|%N :> R.
328- Proof .
329- have [|k0] := leP 0 k.
330- by case: k => // k _; rewrite -pmulrn cos_pi_mulrn.
331- by rewrite -cosN -mulrNz -ltz0_abs // -pmulrn cos_pi_mulrn.
333+ [exists 0; rewrite mulr0z|exists 1; rewrite mulr1z].
332334Qed .
333335
334336Lemma expR_eq0 (x : R) : expR x = 1 -> x = 0.
@@ -387,8 +389,8 @@ split.
387389 by move: (@ltr01 R); rewrite -(eqP h); rewrite pmulr_rgt0 // expR_gt0.
388390 have ok : ~~ odd `|k|%N.
389391 apply/negP => ok; move: cs0.
390- by rewrite yk mulrzl cos_pi_mulrz ok/= expr1 ltr0N1.
391- move: h; rewrite yk mulrzl cos_pi_mulrz (negbTE ok) expr0 mulr1 => /eqP.
392+ by rewrite yk cos_int_pi -signr_odd ok/= expr1 ltr0N1.
393+ move: h; rewrite yk cos_int_pi -signr_odd (negbTE ok) expr0 mulr1 => /eqP.
392394 move/expR_eq0 => ->{x}.
393395 rewrite (intEsg k); exists (sgz k * `|k|./2%N).
394396 rewrite (_ : _ * _%:~R = k%:~R); last first.
@@ -446,25 +448,20 @@ Let add (a b : angle R) : R :=
446448
447449Let two_mone (x : R) : 2%:R * x - x = x.
448450Proof .
449- rewrite -{2}(mul1r x) -mulrBl.
450- by rewrite {2}(_ : 1 = 1%:R)// -natrB// mul1r.
451+ by rewrite mulr2n mulrDl mul1r addrK.
451452Qed .
452453
453454Let add_pi (a b : angle R) : - pi < add a b <= pi.
454455Proof .
455- apply/andP; split; rewrite /add.
456- case: ifPn => [piab|].
457- by rewrite ltr_subr_addl two_mone.
458- rewrite -leNgt => abpi; case: ifPn => [abNpi|]; last by rewrite -ltNge.
459- rewrite -ltr_subl_addr (@lt_trans _ _ (- pi - pi))//.
460- by rewrite ler_lt_sub// ltr_pmull// ?ltr1n// pi_gt0.
461- by rewrite ltr_add// ?(angleNpi _).
462- case: ifPn => [piab|].
463- rewrite ler_subl_addl (@le_trans _ _ (pi + pi))// ler_add// ?(angle_pi _)//.
464- by rewrite ler_pmull ?pi_gt0// ler1n.
465- rewrite -leNgt => abpi; case: ifPn => [abNpi|//].
466- rewrite -ler_subr_addr (le_trans abNpi)// ler_subr_addl.
467- by rewrite two_mone.
456+ rewrite /add; have [ab_gtpi|ab_lepi] := ltrP pi.
457+ rewrite ltr_subr_addl ler_subl_addl two_mone ab_gtpi /=.
458+ rewrite ler_add ?angle_pi // (le_trans (angle_pi _)) //.
459+ by rewrite mulr2n mulrDl mul1r ler_addr ?pi_ge0.
460+ have [ab_leNpi|ab_gtNpi]:= (lerP ((a : R) + (b : R))); last by rewrite ab_gtNpi.
461+ rewrite -ltr_subl_addr -ler_subr_addr ltr_add ?angleNpi //.
462+ by rewrite -opprB two_mone ab_leNpi.
463+ rewrite mulrDl mul1r opprD (le_lt_trans _ (angleNpi _)) //.
464+ by rewrite ler_subl_addl subrr oppr_cp0 pi_ge0.
468465Qed .
469466
470467Definition add_angle (a b : angle R) : angle R := Angle.mk (add_pi a b).
0 commit comments