Skip to content

Commit 28a26e7

Browse files
committed
second half of algebra backports
1 parent 9c6f54e commit 28a26e7

File tree

1 file changed

+0
-190
lines changed

1 file changed

+0
-190
lines changed

theories/xmathcomp/various.v

Lines changed: 0 additions & 190 deletions
Original file line numberDiff line numberDiff line change
@@ -108,17 +108,6 @@ Qed.
108108
(* package algebra *)
109109
(*******************)
110110

111-
(**********)
112-
(* ssrint *)
113-
(**********)
114-
115-
Lemma dvdz_charf (R : ringType) (p : nat) :
116-
p \in [char R] -> forall n : int, (p %| n)%Z = (n%:~R == 0 :> R).
117-
Proof.
118-
move=> charRp [] n; rewrite [LHS](dvdn_charf charRp)//.
119-
by rewrite NegzE abszN rmorphN// oppr_eq0.
120-
Qed.
121-
122111
(********)
123112
(* poly *)
124113
(********)
@@ -165,185 +154,6 @@ move=> /prim_expr_order/esym/eqP.
165154
by rewrite expr0n; case: (n =P 0%N); rewrite ?oner_eq0.
166155
Qed.
167156

168-
(**********)
169-
(* intdiv *)
170-
(**********)
171-
172-
Lemma eisenstein (p : nat) (q : {poly int}) : prime p -> (size q != 1)%N ->
173-
(~~ (p %| lead_coef q))%Z -> (~~ ((p : int) ^+ 2 %| q`_0))%Z ->
174-
(forall i, (i < (size q).-1)%N -> p %| q`_i)%Z ->
175-
irreducible_poly (map_poly (intr : int -> rat) q).
176-
Proof.
177-
move=> p_prime qN1 Ndvd_pql Ndvd_pq0 dvd_pq.
178-
have qN0 : q != 0 by rewrite -lead_coef_eq0; apply: contraNneq Ndvd_pql => ->.
179-
split.
180-
rewrite size_map_poly_id0 ?intr_eq0 ?lead_coef_eq0//.
181-
by rewrite ltn_neqAle eq_sym qN1 size_poly_gt0.
182-
move=> f' +/dvdpP_rat_int[f [d dN0 feq]]; rewrite {f'}feq size_scale// => fN1.
183-
move=> /= [g q_eq]; rewrite q_eq (eqp_trans (eqp_scale _ _))//.
184-
have fN0 : f != 0 by apply: contra_neq qN0; rewrite q_eq => ->; rewrite mul0r.
185-
have gN0 : g != 0 by apply: contra_neq qN0; rewrite q_eq => ->; rewrite mulr0.
186-
rewrite size_map_poly_id0 ?intr_eq0 ?lead_coef_eq0// in fN1.
187-
have [/eqP/size_poly1P[c cN0 ->]|gN1] := eqVneq (size g) 1%N.
188-
by rewrite mulrC mul_polyC map_polyZ/= eqp_sym eqp_scale// intr_eq0.
189-
have c_neq0 : (lead_coef q)%:~R != 0 :> 'F_p
190-
by rewrite -(dvdz_charf (char_Fp _)).
191-
have : map_poly (intr : int -> 'F_p) q = (lead_coef q)%:~R *: 'X^(size q).-1.
192-
apply/val_inj/(@eq_from_nth _ 0) => [|i]; rewrite size_map_poly_id0//.
193-
by rewrite size_scale// size_polyXn -polySpred.
194-
move=> i_small; rewrite coef_poly i_small coefZ coefXn lead_coefE.
195-
move: i_small; rewrite polySpred// ltnS/=.
196-
case: ltngtP => // [i_lt|->]; rewrite (mulr1, mulr0)//= => _.
197-
by apply/eqP; rewrite -(dvdz_charf (char_Fp _))// dvd_pq.
198-
rewrite [in LHS]q_eq rmorphM/=.
199-
set c := (X in X *: _); set n := (_.-1).
200-
set pf := map_poly _ f; set pg := map_poly _ g => pfMpg.
201-
have dvdXn (r : {poly _}) : size r != 1%N -> r %| c *: 'X^n -> r`_0 = 0.
202-
move=> rN1; rewrite (eqp_dvdr _ (eqp_scale _ _))//.
203-
rewrite -['X]subr0; move=> /dvdp_exp_XsubC[k lekn]; rewrite subr0.
204-
move=> /eqpP[u /andP[u1N0 u2N0]]; have [->|k_gt0] := posnP k.
205-
move=> /(congr1 (size \o val))/eqP.
206-
by rewrite /= !size_scale// size_polyXn (negPf rN1).
207-
move=> /(congr1 (fun p : {poly _} => p`_0))/eqP.
208-
by rewrite !coefZ coefXn ltn_eqF// mulr0 mulf_eq0 (negPf u1N0) => /eqP.
209-
suff : ((p : int) ^+ 2 %| q`_0)%Z by rewrite (negPf Ndvd_pq0).
210-
have := c_neq0; rewrite q_eq coefM big_ord1.
211-
rewrite lead_coefM rmorphM mulf_eq0 negb_or => /andP[lpfN0 qfN0].
212-
have pfN1 : size pf != 1%N by rewrite size_map_poly_id0.
213-
have pgN1 : size pg != 1%N by rewrite size_map_poly_id0.
214-
have /(dvdXn _ pgN1) /eqP : pg %| c *: 'X^n by rewrite -pfMpg dvdp_mull.
215-
have /(dvdXn _ pfN1) /eqP : pf %| c *: 'X^n by rewrite -pfMpg dvdp_mulr.
216-
by rewrite !coef_map// -!(dvdz_charf (char_Fp _))//; apply: dvdz_mul.
217-
Qed.
218-
219-
(***********)
220-
(* polydiv *)
221-
(***********)
222-
Lemma irredp_XaddC (F : fieldType) (x : F) : irreducible_poly ('X + x%:P).
223-
Proof. by rewrite -[x]opprK rmorphN; apply: irredp_XsubC. Qed.
224-
225-
Lemma eqpW (R : idomainType) (p q : {poly R}) : p = q -> p %= q.
226-
Proof. by move->; rewrite eqpxx. Qed.
227-
228-
Lemma horner_mod (R : fieldType) (p q : {poly R}) x : root q x ->
229-
(p %% q).[x] = p.[x].
230-
Proof.
231-
by move=> /eqP qx0; rewrite [p in RHS](divp_eq p q) !hornerE qx0 mulr0 add0r.
232-
Qed.
233-
234-
Lemma root_dvdp (F : idomainType) (p q : {poly F}) (x : F) :
235-
root p x -> p %| q -> root q x.
236-
Proof. rewrite -!dvdp_XsubCl; exact: dvdp_trans. Qed.
237-
238-
Section multiplicity.
239-
Variable (L : fieldType).
240-
241-
Definition mup (x : L) (p : {poly L}) :=
242-
[arg max_(n > (0 : 'I_(size p).+1) | ('X - x%:P) ^+ n %| p) n] : nat.
243-
244-
Lemma mup_geq x q n : q != 0 -> (n <= mup x q)%N = (('X - x%:P) ^+ n %| q).
245-
Proof.
246-
move=> q_neq0; rewrite /mup; symmetry.
247-
case: arg_maxnP; rewrite ?expr0 ?dvd1p//= => i i_dvd gti.
248-
case: ltnP => [|/dvdp_exp2l/dvdp_trans]; last exact.
249-
apply: contraTF => dvdq; rewrite -leqNgt.
250-
suff n_small : (n < (size q).+1)%N by exact: (gti (Ordinal n_small)).
251-
by rewrite ltnS ltnW// -(size_exp_XsubC _ x) dvdp_leq.
252-
Qed.
253-
254-
Lemma mup_leq x q n : q != 0 -> (mup x q <= n)%N = ~~ (('X - x%:P) ^+ n.+1 %| q).
255-
Proof. by move=> qN0; rewrite leqNgt mup_geq. Qed.
256-
257-
Lemma mup_ltn x q n : q != 0 -> (mup x q < n)%N = ~~ (('X - x%:P) ^+ n %| q).
258-
Proof. by move=> qN0; rewrite ltnNge mup_geq. Qed.
259-
260-
Lemma XsubC_dvd x q : q != 0 -> ('X - x%:P %| q) = (0 < mup x q)%N.
261-
Proof. by move=> /mup_geq-/(_ _ 1%N)/esym; apply. Qed.
262-
263-
Lemma mup_XsubCX n (x y : L) :
264-
mup x (('X - y%:P) ^+ n) = (if (y == x) then n else 0)%N.
265-
Proof.
266-
have Xxn0 : ('X - y%:P) ^+ n != 0 by rewrite ?expf_neq0 ?polyXsubC_eq0.
267-
apply/eqP; rewrite eqn_leq mup_leq ?mup_geq//.
268-
have [->|Nxy] := eqVneq x y.
269-
by rewrite /= dvdpp ?dvdp_Pexp2l ?size_XsubC ?ltnn.
270-
by rewrite dvd1p dvdp_XsubCl /root !hornerE ?horner_exp ?hornerE expf_neq0// subr_eq0.
271-
(* FIXME: remove ?horner_exp ?hornerE when requiring MC >= 1.16.0 *)
272-
Qed.
273-
274-
Lemma mupNroot (x : L) q : ~~ root q x -> mup x q = 0%N.
275-
Proof.
276-
move=> qNx; have qN0 : q != 0 by apply: contraNneq qNx => ->; rewrite root0.
277-
by move: qNx; rewrite -dvdp_XsubCl XsubC_dvd// lt0n negbK => /eqP.
278-
Qed.
279-
280-
Lemma mupMl x q1 q2 : ~~ root q1 x -> mup x (q1 * q2) = mup x q2.
281-
Proof.
282-
move=> q1Nx; have q1N0 : q1 != 0 by apply: contraNneq q1Nx => ->; rewrite root0.
283-
have [->|q2N0] := eqVneq q2 0; first by rewrite mulr0.
284-
apply/esym/eqP; rewrite eqn_leq mup_geq ?mulf_neq0// dvdp_mull -?mup_geq//=.
285-
rewrite mup_leq ?mulf_neq0// Gauss_dvdpr -?mup_ltn//.
286-
by rewrite coprimep_expl// coprimep_sym coprimep_XsubC.
287-
Qed.
288-
289-
Lemma mupM x q1 q2 : q1 != 0 -> q2 != 0 ->
290-
mup x (q1 * q2) = (mup x q1 + mup x q2)%N.
291-
Proof.
292-
move=> q1N0 q2N0; apply/eqP; rewrite eqn_leq mup_leq ?mulf_neq0//.
293-
rewrite mup_geq ?mulf_neq0// exprD ?dvdp_mul; do ?by rewrite -mup_geq.
294-
have [m1 [r1]] := multiplicity_XsubC q1 x; rewrite q1N0 /= => r1Nx ->.
295-
have [m2 [r2]] := multiplicity_XsubC q2 x; rewrite q2N0 /= => r2Nx ->.
296-
rewrite !mupMl// ?mup_XsubCX eqxx/= mulrACA exprS exprD.
297-
rewrite dvdp_mul2r ?mulf_neq0 ?expf_neq0 ?polyXsubC_eq0//.
298-
by rewrite dvdp_XsubCl rootM negb_or r1Nx r2Nx.
299-
Qed.
300-
301-
Lemma mu_prod_XsubC (x : L) (s : seq L) :
302-
mup x (\prod_(x <- s) ('X - x%:P)) = count_mem x s.
303-
Proof.
304-
elim: s => [|y s IHs]; rewrite (big_cons, big_nil)/=.
305-
by rewrite mupNroot// root1.
306-
rewrite mupM ?polyXsubC_eq0// ?monic_neq0 ?monic_prod_XsubC//.
307-
by rewrite IHs (@mup_XsubCX 1).
308-
Qed.
309-
310-
Lemma prod_XsubC_eq (s t : seq L) :
311-
\prod_(x <- s) ('X - x%:P) = \prod_(x <- t) ('X - x%:P) -> perm_eq s t.
312-
Proof.
313-
move=> eq_prod; apply/allP => x _ /=; apply/eqP.
314-
by have /(congr1 (mup x)) := eq_prod; rewrite !mu_prod_XsubC.
315-
Qed.
316-
317-
End multiplicity.
318-
319-
Lemma dvdp_exp_XsubC (R : idomainType) (p : {poly R}) (c : R) n :
320-
reflect (exists2 k, (k <= n)%N & p %= ('X - c%:P) ^+ k)
321-
(p %| ('X - c%:P) ^+ n).
322-
Proof.
323-
apply: (iffP idP) => [|[k lkn /eqp_dvdl->]]; last by rewrite dvdp_exp2l.
324-
move=> /Pdiv.WeakIdomain.dvdpP[[/= a q] a_neq0].
325-
have [m [r]] := multiplicity_XsubC p c; have [->|pN0]/= := eqVneq p 0.
326-
rewrite mulr0 => _ _ /eqP; rewrite scale_poly_eq0 (negPf a_neq0)/=.
327-
by rewrite expf_eq0/= andbC polyXsubC_eq0.
328-
move=> rNc ->; rewrite mulrA => eq_qrm; exists m.
329-
have: ('X - c%:P) ^+ m %| a *: ('X - c%:P) ^+ n by rewrite eq_qrm dvdp_mull.
330-
by rewrite (eqp_dvdr _ (eqp_scale _ _))// dvdp_Pexp2l// size_XsubC.
331-
suff /eqP : size r = 1%N.
332-
by rewrite size_poly_eq1 => /eqp_mulr/eqp_trans->//; rewrite mul1r eqpxx.
333-
have : r %| a *: ('X - c%:P) ^+ n by rewrite eq_qrm mulrAC dvdp_mull.
334-
rewrite (eqp_dvdr _ (eqp_scale _ _))//.
335-
move: rNc; rewrite -coprimep_XsubC => /(coprimep_expr n) /coprimepP.
336-
by move=> /(_ _ (dvdpp _)); rewrite -size_poly_eq1 => /(_ _)/eqP.
337-
Qed.
338-
339-
(**********)
340-
(* vector *)
341-
(**********)
342-
343-
Lemma SubvsE (F0 : fieldType) (L : vectType F0) (k : {vspace L}) x (xk : x \in k) :
344-
Subvs xk = vsproj k x.
345-
Proof. by apply/val_inj; rewrite /= vsprojK. Qed.
346-
347157
(*****************)
348158
(* package field *)
349159
(*****************)

0 commit comments

Comments
 (0)