aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Util/ZUtil.v42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/Util/ZUtil.v b/src/Util/ZUtil.v
index 8177444a5..7b7daef67 100644
--- a/src/Util/ZUtil.v
+++ b/src/Util/ZUtil.v
@@ -34,12 +34,16 @@ Create HintDb push_Zpow discriminated.
Create HintDb pull_Zpow discriminated.
Create HintDb push_Zmul discriminated.
Create HintDb pull_Zmul discriminated.
+Create HintDb pull_Zmod discriminated.
+Create HintDb push_Zmod discriminated.
Hint Extern 1 => autorewrite with push_Zopp in * : push_Zopp.
Hint Extern 1 => autorewrite with pull_Zopp in * : pull_Zopp.
Hint Extern 1 => autorewrite with push_Zpow in * : push_Zpow.
Hint Extern 1 => autorewrite with pull_Zpow in * : pull_Zpow.
Hint Extern 1 => autorewrite with push_Zmul in * : push_Zmul.
Hint Extern 1 => autorewrite with pull_Zmul in * : pull_Zmul.
+Hint Extern 1 => autorewrite with pull_Zmod in * : pull_Zmod.
+Hint Extern 1 => autorewrite with push_Zmod in * : push_Zmod.
Hint Rewrite Z.div_opp_l_nz Z.div_opp_l_z using lia : pull_Zopp.
Hint Rewrite Z.mul_opp_l : pull_Zopp.
Hint Rewrite <- Z.opp_add_distr : pull_Zopp.
@@ -50,6 +54,7 @@ Hint Rewrite Z.pow_sub_r Z.pow_div_l Z.pow_twice_r Z.pow_mul_l Z.pow_add_r using
Hint Rewrite <- Z.pow_sub_r Z.pow_div_l Z.pow_mul_l Z.pow_add_r Z.pow_twice_r using lia : pull_Zpow.
Hint Rewrite Z.mul_add_distr_l Z.mul_add_distr_r Z.mul_sub_distr_l Z.mul_sub_distr_r : push_Zmul.
Hint Rewrite <- Z.mul_add_distr_l Z.mul_add_distr_r Z.mul_sub_distr_l Z.mul_sub_distr_r : pull_Zmul.
+Hint Rewrite <- Z.mul_mod Z.add_mod using lia : pull_Zmod.
(** For the occasional lemma that can remove the use of [Z.div] *)
Create HintDb zstrip_div.
@@ -1140,6 +1145,43 @@ Module Z.
reflexivity.
Qed.
+ Lemma mul_mod_l a b n : n <> 0 -> (a * b) mod n = ((a mod n) * b) mod n.
+ Proof.
+ intros; rewrite (Z.mul_mod a b), (Z.mul_mod (a mod n) b) by lia.
+ autorewrite with zsimplify; reflexivity.
+ Qed.
+ Hint Rewrite <- mul_mod_l using lia : pull_Zmod.
+
+ Lemma mul_mod_r a b n : n <> 0 -> (a * b) mod n = (a * (b mod n)) mod n.
+ Proof.
+ intros; rewrite (Z.mul_mod a b), (Z.mul_mod a (b mod n)) by lia.
+ autorewrite with zsimplify; reflexivity.
+ Qed.
+ Hint Rewrite <- mul_mod_r using lia : pull_Zmod.
+
+ Definition NoZMod (x : Z) := True.
+ Ltac NoZMod :=
+ lazymatch goal with
+ | [ |- NoZMod (?x mod ?y) ] => fail 0 "Goal has" x "mod" y
+ | [ |- NoZMod _ ] => constructor
+ end.
+
+ Lemma mul_mod_push a b n : n <> 0 -> NoZMod a -> NoZMod b -> (a * b) mod n = ((a mod n) * (b mod n)) mod n.
+ Proof. intros; apply Z.mul_mod; assumption. Qed.
+ Hint Rewrite mul_mod_push using solve [ NoZMod | lia ] : push_Zmod.
+
+ Lemma add_mod_push a b n : n <> 0 -> NoZMod a -> NoZMod b -> (a + b) mod n = ((a mod n) + (b mod n)) mod n.
+ Proof. intros; apply Z.add_mod; assumption. Qed.
+ Hint Rewrite add_mod_push using solve [ NoZMod | lia ] : push_Zmod.
+
+ Lemma mul_mod_l_push a b n : n <> 0 -> NoZMod a -> (a * b) mod n = ((a mod n) * b) mod n.
+ Proof. intros; apply mul_mod_l; assumption. Qed.
+ Hint Rewrite mul_mod_l_push using solve [ NoZMod | lia ] : push_Zmod.
+
+ Lemma mul_mod_r_push a b n : n <> 0 -> NoZMod b -> (a * b) mod n = (a * (b mod n)) mod n.
+ Proof. intros; apply mul_mod_r; assumption. Qed.
+ Hint Rewrite mul_mod_r_push using solve [ NoZMod | lia ] : push_Zmod.
+
Section equiv_modulo.
Context (N : Z).
Definition equiv_modulo x y := x mod N = y mod N.