aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jason Gross <jagro@google.com>2016-07-29 15:30:39 -0700
committerGravatar Jason Gross <jagro@google.com>2016-07-29 15:34:52 -0700
commite649d412435b47ba79a8f5dbb49e5f723fa54db2 (patch)
treed9e15b53835b5c2cdeab2df81ea8f7cf31161f2d /src
parentdcb4a7e5a3a5401c23cf940b26b51b3fc0c38b41 (diff)
Add more Z.modulo lemmas
After | File Name | Before || Change ---------------------------------------------------------------------------------- 1m46.85s | Total | 1m47.35s || -0m00.49s ---------------------------------------------------------------------------------- 0m16.06s | ModularArithmetic/ModularBaseSystemProofs | 0m15.05s || +0m01.00s 0m33.23s | Specific/GF25519 | 0m32.88s || +0m00.34s 0m11.78s | Experiments/SpecEd25519 | 0m11.50s || +0m00.27s 0m07.61s | Specific/GF1305 | 0m07.36s || +0m00.25s 0m04.57s | ModularArithmetic/Tutorial | 0m04.04s || +0m00.53s 0m04.12s | ModularArithmetic/Pow2BaseProofs | 0m04.82s || -0m00.70s 0m03.93s | BaseSystemProofs | 0m03.73s || +0m00.20s 0m03.19s | ModularArithmetic/ModularBaseSystemOpt | 0m03.25s || -0m00.06s 0m02.75s | Util/ZUtil | 0m02.64s || +0m00.10s 0m01.70s | ModularArithmetic/PrimeFieldTheorems | 0m01.56s || +0m00.13s 0m01.59s | ModularArithmetic/ModularArithmeticTheorems | 0m01.65s || -0m00.05s 0m01.58s | Encoding/PointEncodingPre | 0m02.25s || -0m00.67s 0m01.21s | BaseSystem | 0m01.39s || -0m00.17s 0m01.07s | ModularArithmetic/ExtendedBaseVector | 0m01.34s || -0m00.27s 0m01.01s | Experiments/DerivationsOptionRectLetInEncoding | 0m01.31s || -0m00.30s 0m00.97s | Util/NumTheoryUtil | 0m00.89s || +0m00.07s 0m00.91s | ModularArithmetic/BarrettReduction/Z | 0m01.16s || -0m00.24s 0m00.89s | ModularArithmetic/ModularBaseSystemField | 0m00.87s || +0m00.02s 0m00.86s | ModularArithmetic/ModularBaseSystemListProofs | 0m00.80s || +0m00.05s 0m00.78s | ModularArithmetic/PseudoMersenneBaseParamProofs | 0m00.61s || +0m00.17s 0m00.72s | Encoding/ModularWordEncodingTheorems | 0m01.02s || -0m00.30s 0m00.71s | Experiments/SpecificCurve25519 | 0m00.72s || -0m00.01s 0m00.67s | Testbit | 0m00.89s || -0m00.21s 0m00.66s | ModularArithmetic/ExtPow2BaseMulProofs | 0m00.66s || +0m00.00s 0m00.62s | Encoding/ModularWordEncodingPre | 0m00.65s || -0m00.03s 0m00.60s | ModularArithmetic/ModularBaseSystem | 0m00.61s || -0m00.01s 0m00.60s | Spec/ModularWordEncoding | 0m00.64s || -0m00.04s 0m00.58s | ModularArithmetic/ModularBaseSystemList | 0m00.89s || -0m00.31s 0m00.58s | ModularArithmetic/Pow2Base | 0m00.68s || -0m00.10s 0m00.54s | ModularArithmetic/Pre | 0m00.48s || +0m00.06s 0m00.44s | ModularArithmetic/PseudoMersenneBaseParams | 0m00.60s || -0m00.15s 0m00.33s | Spec/ModularArithmetic | 0m00.41s || -0m00.07s
Diffstat (limited to 'src')
-rw-r--r--src/Util/ZUtil.v37
1 files changed, 36 insertions, 1 deletions
diff --git a/src/Util/ZUtil.v b/src/Util/ZUtil.v
index b7abb2023..319e018a9 100644
--- a/src/Util/ZUtil.v
+++ b/src/Util/ZUtil.v
@@ -55,7 +55,8 @@ 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.
+Hint Rewrite <- Z.mul_mod Z.add_mod Zminus_mod using lia : pull_Zmod.
+Hint Rewrite Zminus_mod_idemp_l Zminus_mod_idemp_r : pull_Zmod.
(** For the occasional lemma that can remove the use of [Z.div] *)
Create HintDb zstrip_div.
@@ -1160,6 +1161,20 @@ Module Z.
Qed.
Hint Rewrite <- mul_mod_r using lia : pull_Zmod.
+ Lemma add_mod_l a b n : n <> 0 -> (a + b) mod n = ((a mod n) + b) mod n.
+ Proof.
+ intros; rewrite (Z.add_mod a b), (Z.add_mod (a mod n) b) by lia.
+ autorewrite with zsimplify; reflexivity.
+ Qed.
+ Hint Rewrite <- add_mod_l using lia : pull_Zmod.
+
+ Lemma add_mod_r a b n : n <> 0 -> (a + b) mod n = (a + (b mod n)) mod n.
+ Proof.
+ intros; rewrite (Z.add_mod a b), (Z.add_mod a (b mod n)) by lia.
+ autorewrite with zsimplify; reflexivity.
+ Qed.
+ Hint Rewrite <- add_mod_r using lia : pull_Zmod.
+
Definition NoZMod (x : Z) := True.
Ltac NoZMod :=
lazymatch goal with
@@ -1183,6 +1198,26 @@ Module Z.
Proof. intros; apply mul_mod_r; assumption. Qed.
Hint Rewrite mul_mod_r_push using solve [ NoZMod | lia ] : push_Zmod.
+ Lemma add_mod_l_push a b n : n <> 0 -> NoZMod a -> (a + b) mod n = ((a mod n) + b) mod n.
+ Proof. intros; apply add_mod_l; assumption. Qed.
+ Hint Rewrite add_mod_l_push using solve [ NoZMod | lia ] : push_Zmod.
+
+ Lemma add_mod_r_push a b n : n <> 0 -> NoZMod b -> (a + b) mod n = (a + (b mod n)) mod n.
+ Proof. intros; apply add_mod_r; assumption. Qed.
+ Hint Rewrite add_mod_r_push using solve [ NoZMod | lia ] : push_Zmod.
+
+ Lemma sub_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 Zminus_mod; assumption. Qed.
+ Hint Rewrite sub_mod_push using solve [ NoZMod | lia ] : push_Zmod.
+
+ Lemma sub_mod_l_push a b n : n <> 0 -> NoZMod a -> (a - b) mod n = ((a mod n) - b) mod n.
+ Proof. intros; symmetry; apply Zminus_mod_idemp_l; assumption. Qed.
+ Hint Rewrite sub_mod_l_push using solve [ NoZMod | lia ] : push_Zmod.
+
+ Lemma sub_mod_r_push a b n : n <> 0 -> NoZMod b -> (a - b) mod n = (a - (b mod n)) mod n.
+ Proof. intros; symmetry; apply Zminus_mod_idemp_r; assumption. Qed.
+ Hint Rewrite sub_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.