Variant rdvdp_spec p q : {poly R} -> bool -> Type :=
| Rdvdp k q1 & p * ((lead_coef q)^+ k)%:P = q1 * q : rdvdp_spec p q 0 true
| RdvdpN & rmodp p q != 0 : rdvdp_spec p q (rmodp p q) false.
(* Is that version useable ? *)

(* Specifications: *)
Lemma rdvdp_eqP p : rdvdp_spec p d (rmodp p d) (rdvdp d p).
Lemma rdvdp_mull p : rdvdp d (p * d).
Lemma rmodpp : rmodp d d = 0.
Lemma rdvdpp : rdvdp d d.
Lemma rdivp_eq p :
p = (rdivp p d) * d + (rmodp p d).
Lemma rdivpp : rdivp d d = 1.
Lemma rdivp_addl_mul_small q r :
size r < size d -> rdivp (q * d + r) d = q.
Lemma rdivp_addl_mul q r : rdivp (q * d + r) d = q + rdivp r d.
Lemma rdivp_addl q r :
rdvdp d q -> rdivp (q + r) d = rdivp q d + rdivp r d.
Lemma rdivp_addr q r :
rdvdp d r -> rdivp (q + r) d = rdivp q d + rdivp r d.
Lemma rmodpp : rmodp d d = 0.
Lemma rmodp_addl_mul_small q r :
size r < size d -> rmodp (q * d + r) d = r.
Lemma rmodp_add p q : rmodp (p + q) d = rmodp p d + rmodp q d.
Lemma rmodp_mulmr p q : rmodp (p * (rmodp q d)) d = rmodp (p * q) d.
Lemma rdvdpp : rdvdp d d.
(* section variables impose an inconvenient order on parameters *)
Lemma eq_rdvdp q1 p : p = q1 * d -> rdvdp d p.
Lemma rdvdp_mull p : rdvdp d (p * d).
Lemma rdvdpP p : reflect (exists qq, p = qq * d) (rdvdp d p).
Lemma rdivpK p : rdvdp d p -> (rdivp p d) * d = p.
Lemma polyXsubCP p x : reflect (p.[x] = 0) (rdvdp ('X - x%:P) p).
Lemma rdivp_eq d p :
(lead_coef d ^+ (rscalp p d)) *: p = (rdivp p d) * d + (rmodp p d).
Lemma rdvdp_eqP d p : rdvdp_spec p d (rmodp p d) (rdvdp d p).
Lemma rdvdp_eq q p :
(rdvdp q p) = ((lead_coef q) ^+ (rscalp p q) *: p == (rdivp p q) * q).