@@ -118,8 +118,9 @@ Context (n : nat).
118118Notation isword z := (0 <= z < modulus n)%R.
119119
120120(* -------------------------------------------------------------------- *)
121- Lemma mkword_proof (z : Z) : isword (z mod (modulus n) )%Z.
121+ Lemma mkword_proof (z : Z) : isword (zmod_pow2 z n )%Z.
122122Proof .
123+ rewrite zmod_pow2E // -modulusZE.
123124apply/andP; rewrite -(rwP ltzP) -(rwP lezP).
124125by apply/Z_mod_lt/Z.lt_gt/ltzP/modulus_gt0.
125126Qed .
@@ -149,17 +150,17 @@ Proof. by []. Qed.
149150(* -------------------------------------------------------------------- *)
150151Lemma ureprK : cancel urepr mkword.
151152Proof .
152- move=> w; rewrite (rwP eqP) -val_eqE /=; rewrite Z.mod_small //.
153+ move=> w; rewrite (rwP eqP) -val_eqE /=; rewrite zmod_pow2E Z.mod_small // -modulusZE .
153154by rewrite !(rwP lezP, rwP ltzP) (rwP andP) urepr_isword.
154155Qed .
155156
156157(* -------------------------------------------------------------------- *)
157158Lemma mkwordK (z : Z) : urepr (mkword z) = (z mod modulus n)%Z.
158- Proof . by [] . Qed .
159+ Proof . by rewrite modulusZE -zmod_pow2E . Qed .
159160
160161(* -------------------------------------------------------------------- *)
161162Lemma mkword_valK (z : Z) : mkword z = (z mod modulus n)%Z :> Z.
162- Proof . by [] . Qed .
163+ Proof . by rewrite modulusZE -zmod_pow2E . Qed .
163164
164165(* -------------------------------------------------------------------- *)
165166Lemma isword_ofnatZP (k : nat) :
@@ -252,7 +253,7 @@ Lemma sub_wordE (w1 w2 : n.-word) :
252253 sub_word w1 w2 = add_word w1 (opp_word w2).
253254Proof .
254255 apply: val_inj.
255- by rewrite /= /opp_word mkwordK !urepr_word -Z.add_opp_r Zplus_mod_idemp_r.
256+ by rewrite /= /opp_word !zmod_pow2E -modulusZE mkwordK !urepr_word -Z.add_opp_r Zplus_mod_idemp_r.
256257Qed .
257258
258259Definition mul_word (w1 w2 : n.-word) :=
@@ -276,15 +277,15 @@ rewrite (rwP eqP) -val_eqE /= modn_small.
276277 rewrite Z2Nat.id //; case/andP: h => _ /ltzP.
277278 by rewrite /modulus two_power_nat_equiv Nat2Z.n2zX expZE.
278279+ rewrite Z2Nat.id; first by case/andP: h => /lezP.
279- by rewrite Zmod_small // !(rwP lezP, rwP ltzP) (rwP andP).
280+ by rewrite zmod_pow2E -modulusZE Zmod_small // !(rwP lezP, rwP ltzP) (rwP andP).
280281Qed .
281282
282283(* -------------------------------------------------------------------- *)
283284Lemma word_of_ordK : cancel word_of_ord ord_of_word.
284285Proof .
285286rewrite /ord_of_word /word_of_ord => -[k /= lt].
286287apply/eqP; rewrite -val_eqE /= prednK_modulus.
287- rewrite prednK_modulus in lt; rewrite Zmod_small.
288+ rewrite prednK_modulus in lt; rewrite zmod_pow2E -modulusZE Zmod_small.
288289+ by apply/isword_ofnatZP.
289290+ by rewrite modn_small Nat2Z.id.
290291Qed .
@@ -303,6 +304,7 @@ rewrite [Z.to_nat x %% _]modn_small 1?[Z.to_nat y %% _]modn_small.
303304+ by apply/isword_tonatZP/iswordZP.
304305+ by apply/isword_tonatZP/iswordZP.
305306rewrite modnZE ?expn_eq0 // -Zofnat_modulus.
307+ rewrite !zmod_pow2E -modulusZE.
306308by rewrite Zmod_mod Nat2Z.n2zD !Z2Nat.id.
307309Qed .
308310
@@ -312,6 +314,7 @@ Lemma opp_word_ordE (x : n.-word) :
312314Proof .
313315rewrite (rwP eqP) word_eqE /=; case: x => [x hx].
314316rewrite /opp_word /urepr /= prednK_modulus; apply/eqP.
317+ rewrite !zmod_pow2E -modulusZE.
315318rewrite modnZE ?expn_eq0 // -Zofnat_modulus Zmod_mod.
316319rewrite modn_small; first by apply/isword_tonatZP/iswordZP.
317320rewrite Nat2Z.n2zB ?isword_tonatZWP //; first by apply/iswordZP.
@@ -422,7 +425,7 @@ Proof. by rewrite word0_ordE. Qed.
422425
423426(* -------------------------------------------------------------------- *)
424427Lemma word1_zmodE : word1 = word_of_zmod 1%R.
425- Proof . by rewrite (rwP eqP) -val_eqE /= Zmod_small . Qed .
428+ Proof . by rewrite (rwP eqP) -val_eqE. Qed .
426429
427430(* -------------------------------------------------------------------- *)
428431Lemma add_word_zmodE (x y : n.+1.-word) :
@@ -450,6 +453,7 @@ rewrite [Z.to_nat x %% _]modn_small 1?[Z.to_nat y %% _]modn_small.
450453+ by apply/isword_tonatZP/iswordZP.
451454+ by apply/isword_tonatZP/iswordZP.
452455rewrite -word_Fcast prednK_modulus modnZE ?expn_eq0 //.
456+ rewrite !zmod_pow2E -(modulusZE n.+1).
453457by rewrite -Zofnat_modulus Zmod_mod Nat2Z.n2zM !Z2Nat.id.
454458Qed .
455459
@@ -502,7 +506,7 @@ End WordRing.
502506Lemma mkword_val_small {n : nat} (z : Z) :
503507 (0 <= z < 2%:R ^+ n.+1)%R -> mkword n.+1 z = z :> Z.
504508Proof .
505- move=> rg; rewrite /= Zmod_small // modulusE.
509+ move=> rg; rewrite /= zmod_pow2E -(modulusZE n.+1) Zmod_small // modulusE.
506510by rewrite !(rwP lezP, rwP ltzP) (rwP andP).
507511Qed .
508512
@@ -529,7 +533,7 @@ Proof. by apply/val_eqP. Qed.
529533(* ==================================================================== *)
530534Lemma addwE {n} (w1 w2 : n.-word) :
531535 urepr (w1 + w2)%R = ((urepr w1 + urepr w2)%R mod modulus n)%Z.
532- Proof . by [] . Qed .
536+ Proof . by rewrite /urepr /= zmod_pow2E -modulusZE . Qed .
533537
534538Lemma subwE {n} (w1 w2 : n.-word) :
535539 urepr (w1 - w2)%R = ((urepr w1 - urepr w2)%R mod modulus n)%Z.
@@ -549,6 +553,7 @@ have /= {nz_w2} gt0_w2: (0%R < val w2)%R.
549553 apply/contra_neq: nz_w2; pose z : n.-word := 0%R.
550554 by rewrite [X in val _ = X](_ : _ = val z) // => /val_inj.
551555rewrite /GRing.opp /GRing.add /= /add_word /opp_word /urepr /=.
556+ rewrite !zmod_pow2E -modulusZE.
552557rewrite Zplus_mod_idemp_r !(oppZE, addZE).
553558case: ltrP; rewrite (addr0, mulr1n); last first.
554559+ move=> le_w2_w1; rewrite Z.mod_small //; split.
565570
566571Lemma mulwE {n} (w1 w2 : n.-word) :
567572 urepr (mul_word w1 w2)%R = ((urepr w1 * urepr w2)%R mod modulus n)%Z.
568- Proof . by [] . Qed .
573+ Proof . by rewrite /urepr /= zmod_pow2E -modulusZE . Qed .
569574
570575(* -------------------------------------------------------------------- *)
571576Lemma word_sz_eq0 {n} (w : n.-word) : n = 0 -> w = 0%R.
@@ -906,6 +911,7 @@ Lemma sreprK : cancel srepr (mkword n).
906911Proof .
907912rewrite /srepr => w; case: ifP => _; last exact/ureprK.
908913apply/val_eqP/eqP; case: w => w /=.
914+ rewrite zmod_pow2E -modulusZE.
909915rewrite -mulrN1 mulrC -mulZE -addZE Z_mod_plus_full.
910916move/andP; rewrite -!(rwP ltzP, rwP lezP) => h.
911917by rewrite Z.mod_small.
@@ -973,7 +979,11 @@ Qed.
973979
974980Lemma wsplit2_subproof (w : n.*2.-word) :
975981 isword n (Z.div_eucl w (modulus n)).2.
976- Proof . by rewrite [_.2](_ : _ = (w mod modulus n)%Z) ?mkword_proof. Qed .
982+ Proof .
983+ have := mkword_proof n w.
984+ rewrite zmod_pow2E modulusZE.
985+ exact.
986+ Qed .
977987
978988Definition wsplit (w : n.*2.-word) :=
979989 let w' := Z.div_eucl w (modulus n) in
@@ -1089,7 +1099,7 @@ Proof. by rewrite /wbit Z.lxor_spec /=; do 2! case: Z.testbit. Qed.
10891099
10901100Lemma wN1E i : wbit (mkword n (-1)) i = (i < n).
10911101Proof .
1092- rewrite /wbit /= /modulus two_power_nat_equiv .
1102+ rewrite /wbit /= zmod_pow2E .
10931103have hi := Nat2Z.is_nonneg i.
10941104have hn := Nat2Z.is_nonneg n.
10951105have Hn : (0 < 2 ^ Z.of_nat n)%Z.
0 commit comments