aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/real_closed/polyorder.v
diff options
context:
space:
mode:
Diffstat (limited to 'mathcomp/real_closed/polyorder.v')
-rw-r--r--mathcomp/real_closed/polyorder.v274
1 files changed, 0 insertions, 274 deletions
diff --git a/mathcomp/real_closed/polyorder.v b/mathcomp/real_closed/polyorder.v
deleted file mode 100644
index 4a96dcc..0000000
--- a/mathcomp/real_closed/polyorder.v
+++ /dev/null
@@ -1,274 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrfun ssrbool eqtype ssrnat seq choice fintype.
-From mathcomp
-Require Import ssralg poly ssrnum zmodp polydiv interval.
-
-Import GRing.Theory.
-Import Num.Theory.
-
-Import Pdiv.Idomain.
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Local Open Scope ring_scope.
-
-Section Multiplicity.
-
-Variable R : idomainType.
-Implicit Types x y c : R.
-Implicit Types p q r d : {poly R}.
-
-(* Definition multiplicity (x : R) (p : {poly R}) : nat := *)
-(* (odflt ord0 (pick (fun i : 'I_(size p).+1 => ((('X - x%:P) ^+ i %| p)) *)
-(* && (~~ (('X - x%:P) ^+ i.+1 %| p))))). *)
-
-(* Notation "'\mu_' x" := (multiplicity x) *)
-(* (at level 8, format "'\mu_' x") : ring_scope. *)
-
-(* Lemma mu0 : forall x, \mu_x 0 = 0%N. *)
-(* Proof. *)
-(* by move=> x; rewrite /multiplicity; case: pickP=> //= i; rewrite !dvdp0. *)
-(* Qed. *)
-
-(* Lemma muP : forall p x, p != 0 -> *)
-(* (('X - x%:P) ^+ (\mu_x p) %| p) && ~~(('X - x%:P) ^+ (\mu_x p).+1 %| p). *)
-(* Proof. *)
-(* move=> p x np0; rewrite /multiplicity; case: pickP=> //= hp. *)
-(* have {hp} hip: forall i, i <= size p *)
-(* -> (('X - x%:P) ^+ i %| p) -> (('X - x%:P) ^+ i.+1 %| p). *)
-(* move=> i; rewrite -ltnS=> hi; move/negbT: (hp (Ordinal hi)). *)
-(* by rewrite -negb_imply negbK=> /implyP. *)
-(* suff: forall i, i <= size p -> ('X - x%:P) ^+ i %| p. *)
-(* move=> /(_ _ (leqnn _)) /(size_dvdp np0). *)
-(* rewrite -[size _]prednK; first by rewrite size_exp size_XsubC mul1n ltnn. *)
-(* by rewrite lt0n size_poly_eq0 expf_eq0 polyXsubC_eq0 lt0n size_poly_eq0 np0. *)
-(* elim=> [|i ihi /ltnW hsp]; first by rewrite expr0 dvd1p. *)
-(* by rewrite hip // ihi. *)
-(* Qed. *)
-
-(* Lemma cofactor_XsubC : forall p a, p != 0 -> *)
-(* exists2 q : {poly R}, (~~ root q a) & p = q * ('X - a%:P) ^+ (\mu_a p). *)
-(* Proof. *)
-(* move=> p a np0. *)
-
-Definition multiplicity (x : R) (p : {poly R}) :=
- if p == 0 then 0%N else sval (multiplicity_XsubC p x).
-
-Notation "'\mu_' x" := (multiplicity x)
- (at level 8, format "'\mu_' x") : ring_scope.
-
-Lemma mu_spec p a : p != 0 ->
- { q : {poly R} & (~~ root q a)
- & ( p = q * ('X - a%:P) ^+ (\mu_a p)) }.
-Proof.
-move=> nz_p; rewrite /multiplicity -if_neg.
-by case: (_ p a) => m /=/sig2_eqW[q]; rewrite nz_p; exists q.
-Qed.
-
-Lemma mu0 x : \mu_x 0 = 0%N.
-Proof. by rewrite /multiplicity {1}eqxx. Qed.
-
-Lemma root_mu p x : ('X - x%:P) ^+ (\mu_x p) %| p.
-Proof.
-case p0: (p == 0); first by rewrite (eqP p0) mu0 expr0 dvd1p.
-case: (@mu_spec p x); first by rewrite p0.
-by move=> q qn0 hp //=; rewrite {2}hp dvdp_mulIr.
-Qed.
-
-(* Lemma size_exp_XsubC : forall x n, size (('X - x%:P) ^+ n) = n.+1. *)
-(* Proof. *)
-(* move=> x n; rewrite -[size _]prednK ?size_exp ?size_XsubC ?mul1n //. *)
-(* by rewrite ltnNge leqn0 size_poly_eq0 expf_neq0 // polyXsubC_eq0. *)
-(* Qed. *)
-
-Lemma root_muN p x : p != 0 ->
- (('X - x%:P)^+(\mu_x p).+1 %| p) = false.
-Proof.
-move=> pn0; case: (mu_spec x pn0)=> q qn0 hp /=.
-rewrite {2}hp exprS dvdp_mul2r; last first.
- by rewrite expf_neq0 // polyXsubC_eq0.
-apply: negbTE; rewrite -eqp_div_XsubC; apply: contra qn0.
-by move/eqP->; rewrite rootM root_XsubC eqxx orbT.
-Qed.
-
-Lemma root_le_mu p x n : p != 0 -> ('X - x%:P)^+n %| p = (n <= \mu_x p)%N.
-Proof.
-move=> pn0; case: leqP=> hn; last apply/negP=> hp.
- apply: (@dvdp_trans _ (('X - x%:P) ^+ (\mu_x p))); last by rewrite root_mu.
- by rewrite dvdp_Pexp2l // size_XsubC.
-suff : ('X - x%:P) ^+ (\mu_x p).+1 %| p by rewrite root_muN.
-by apply: dvdp_trans hp; rewrite dvdp_Pexp2l // size_XsubC.
-Qed.
-
-Lemma muP p x n : p != 0 ->
- (('X - x%:P)^+n %| p) && ~~(('X - x%:P)^+n.+1 %| p) = (n == \mu_x p).
-Proof.
-by move=> hp0; rewrite !root_le_mu//; case: (ltngtP n (\mu_x p)).
-Qed.
-
-Lemma mu_gt0 p x : p != 0 -> (0 < \mu_x p)%N = root p x.
-Proof. by move=> pn0; rewrite -root_le_mu// expr1 root_factor_theorem. Qed.
-
-Lemma muNroot p x : ~~ root p x -> \mu_x p = 0%N.
-Proof.
-case p0: (p == 0); first by rewrite (eqP p0) rootC eqxx.
-by move=> pnx0; apply/eqP; rewrite -leqn0 leqNgt mu_gt0 ?p0.
-Qed.
-
-Lemma mu_polyC c x : \mu_x (c%:P) = 0%N.
-Proof.
-case c0: (c == 0); first by rewrite (eqP c0) mu0.
-by apply: muNroot; rewrite rootC c0.
-Qed.
-
-Lemma cofactor_XsubC_mu x p n :
- ~~ root p x -> \mu_x (p * ('X - x%:P) ^+ n) = n.
-Proof.
-move=> p0; apply/eqP; rewrite eq_sym -muP//; last first.
- apply: contra p0; rewrite mulf_eq0 expf_eq0 polyXsubC_eq0 andbF orbF.
- by move/eqP->; rewrite root0.
-rewrite dvdp_mulIr /= exprS dvdp_mul2r -?root_factor_theorem //.
-by rewrite expf_eq0 polyXsubC_eq0 andbF //.
-Qed.
-
-Lemma mu_mul p q x : p * q != 0 ->
- \mu_x (p * q) = (\mu_x p + \mu_x q)%N.
-Proof.
-move=> hpqn0; apply/eqP; rewrite eq_sym -muP//.
-rewrite exprD dvdp_mul ?root_mu//=.
-move: hpqn0; rewrite mulf_eq0 negb_or; case/andP=> hp0 hq0.
-move: (mu_spec x hp0)=> [qp qp0 hp].
-move: (mu_spec x hq0)=> [qq qq0 hq].
-rewrite {2}hp {2}hq exprS exprD !mulrA [qp * _ * _]mulrAC.
-rewrite !dvdp_mul2r ?expf_neq0 ?polyXsubC_eq0 // -eqp_div_XsubC.
-move: (mulf_neq0 qp0 qq0); rewrite -hornerM; apply: contra; move/eqP->.
-by rewrite hornerM hornerXsubC subrr mulr0.
-Qed.
-
-Lemma mu_XsubC x : \mu_x ('X - x%:P) = 1%N.
-Proof.
-apply/eqP; rewrite eq_sym -muP; last by rewrite polyXsubC_eq0.
-by rewrite expr1 dvdpp/= -{2}[_ - _]expr1 dvdp_Pexp2l // size_XsubC.
-Qed.
-
-Lemma mu_mulC c p x : c != 0 -> \mu_x (c *: p) = \mu_x p.
-Proof.
-move=> cn0; case p0: (p == 0); first by rewrite (eqP p0) scaler0.
-by rewrite -mul_polyC mu_mul ?mu_polyC// mulf_neq0 ?p0 ?polyC_eq0.
-Qed.
-
-Lemma mu_opp p x : \mu_x (-p) = \mu_x p.
-Proof.
-rewrite -mulN1r -polyC1 -polyC_opp mul_polyC mu_mulC //.
-by rewrite -oppr0 (inj_eq (inv_inj (@opprK _))) oner_eq0.
-Qed.
-
-Lemma mu_exp p x n : \mu_x (p ^+ n) = (\mu_x p * n)%N.
-Proof.
-elim: n p => [|n ihn] p; first by rewrite expr0 mu_polyC muln0.
-case p0: (p == 0); first by rewrite (eqP p0) exprS mul0r mu0 mul0n.
-by rewrite exprS mu_mul ?ihn ?mulnS// mulf_eq0 expf_eq0 p0 andbF.
-Qed.
-
-Lemma mu_addr p q x : p != 0 -> (\mu_x p < \mu_x q)%N ->
- \mu_x (p + q) = \mu_x p.
-Proof.
-move=> pn0 mupq.
-have pqn0 : p + q != 0.
- move: mupq; rewrite ltnNge; apply: contra.
- by rewrite -[q]opprK subr_eq0; move/eqP->; rewrite opprK mu_opp leqnn.
-have qn0: q != 0 by move: mupq; apply: contraL; move/eqP->; rewrite mu0 ltn0.
-case: (mu_spec x pn0)=> [qqp qqp0] hp.
-case: (mu_spec x qn0)=> [qqq qqq0] hq.
-rewrite hp hq -(subnK (ltnW mupq)).
-rewrite mu_mul ?mulf_eq0; last first.
- rewrite expf_eq0 polyXsubC_eq0 andbF orbF.
- by apply: contra qqp0; move/eqP->; rewrite root0.
-rewrite mu_exp mu_XsubC mul1n [\mu_x qqp]muNroot // add0n.
-rewrite exprD mulrA -mulrDl mu_mul; last first.
- by rewrite mulrDl -mulrA -exprD subnK 1?ltnW // -hp -hq.
-rewrite muNroot ?add0n ?mu_exp ?mu_XsubC ?mul1n //.
-rewrite rootE !hornerE horner_exp hornerXsubC subrr.
-by rewrite -subnSK // subnS exprS mul0r mulr0 addr0.
-Qed.
-
-Lemma mu_addl p q x : q != 0 -> (\mu_x p > \mu_x q)%N ->
- \mu_x (p + q) = \mu_x q.
-Proof. by move=> q0 hmu; rewrite addrC mu_addr. Qed.
-
-Lemma mu_div p x n : (n <= \mu_x p)%N ->
- \mu_x (p %/ ('X - x%:P) ^+ n) = (\mu_x p - n)%N.
-Proof.
-move=> hn.
-case p0: (p == 0); first by rewrite (eqP p0) div0p mu0 sub0n.
-case: (@mu_spec p x); rewrite ?p0 // => q hq hp.
-rewrite {1}hp -{1}(subnK hn) exprD mulrA.
-rewrite Pdiv.IdomainMonic.mulpK; last by apply: monic_exp; apply: monicXsubC.
-rewrite mu_mul ?mulf_eq0 ?expf_eq0 ?polyXsubC_eq0 ?andbF ?orbF; last first.
- by apply: contra hq; move/eqP->; rewrite root0.
-by rewrite mu_exp muNroot // add0n mu_XsubC mul1n.
-Qed.
-
-End Multiplicity.
-
-Notation "'\mu_' x" := (multiplicity x)
- (at level 8, format "'\mu_' x") : ring_scope.
-
-
-Section PolyrealIdomain.
-
- (*************************************************************************)
- (* This should be replaced by a 0-characteristic condition + integrality *)
- (* and merged into poly and polydiv *)
- (*************************************************************************)
-
-Variable R : realDomainType.
-
-Lemma size_deriv (p : {poly R}) : size p^`() = (size p).-1.
-Proof.
-have [lep1|lt1p] := leqP (size p) 1.
- by rewrite {1}[p]size1_polyC // derivC size_poly0 -subn1 (eqnP lep1).
-rewrite size_poly_eq // mulrn_eq0 -subn2 -subSn // subn2.
-by rewrite lead_coef_eq0 -size_poly_eq0 -(subnKC lt1p).
-Qed.
-
-Lemma derivn_poly0 : forall (p : {poly R}) n, (size p <= n)%N = (p^`(n) == 0).
-Proof.
-move=> p n; apply/idP/idP.
- move=> Hpn; apply/eqP; apply/polyP=>i; rewrite coef_derivn.
- rewrite nth_default; first by rewrite mul0rn coef0.
- by apply: leq_trans Hpn _; apply leq_addr.
-elim: n {-2}n p (leqnn n) => [m | n ihn [| m]] p.
-- by rewrite leqn0; move/eqP->; rewrite derivn0 leqn0 -size_poly_eq0.
-- by move=> _; apply: ihn; rewrite leq0n.
-- rewrite derivSn => hmn hder; case e: (size p) => [|sp] //.
- rewrite -(prednK (ltn0Sn sp)) [(_.-1)%N]lock -e -lock -size_deriv ltnS.
- exact: ihn.
-Qed.
-
-Lemma mu_deriv : forall x (p : {poly R}), root p x ->
- \mu_x (p^`()) = (\mu_x p - 1)%N.
-Proof.
-move=> x p px0; have [-> | nz_p] := eqVneq p 0; first by rewrite derivC mu0.
-have [q nz_qx Dp] := mu_spec x nz_p.
-case Dm: (\mu_x p) => [|m]; first by rewrite Dp Dm mulr1 (negPf nz_qx) in px0.
-rewrite subn1 Dp Dm !derivCE exprS mul1r mulrnAr -mulrnAl mulrA -mulrDl.
-rewrite cofactor_XsubC_mu // rootE !(hornerE, hornerMn) subrr mulr0 add0r.
-by rewrite mulrn_eq0.
-Qed.
-
-Lemma mu_deriv_root : forall x (p : {poly R}), p != 0 -> root p x ->
- \mu_x p = (\mu_x (p^`()) + 1)%N.
-Proof.
-by move=> x p p0 rpx; rewrite mu_deriv // subn1 addn1 prednK // mu_gt0.
-Qed.
-
-End PolyrealIdomain.
-
-
-