aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jason Gross <jagro@google.com>2016-07-29 13:37:08 -0700
committerGravatar Jason Gross <jagro@google.com>2016-07-29 13:41:21 -0700
commite4cd2e81a5eacb131fee96e0acdfac9422b176bc (patch)
treeabe19c96b5673369dcc4d9f1cf276d236384e418 /src
parent2d866442e53479bb0525797b8155562f31aab5bc (diff)
Add some lemmas and hints about Zmod
After | File Name | Before || Change ---------------------------------------------------------------------------------- 1m42.02s | Total | 1m42.15s || -0m00.13s ---------------------------------------------------------------------------------- 0m32.64s | Specific/GF25519 | 0m32.66s || -0m00.01s 0m15.18s | ModularArithmetic/ModularBaseSystemProofs | 0m15.36s || -0m00.17s 0m11.37s | Experiments/SpecEd25519 | 0m11.31s || +0m00.05s 0m07.05s | Specific/GF1305 | 0m07.03s || +0m00.01s 0m03.99s | ModularArithmetic/Pow2BaseProofs | 0m03.99s || +0m00.00s 0m03.74s | ModularArithmetic/Tutorial | 0m03.74s || +0m00.00s 0m03.68s | BaseSystemProofs | 0m03.69s || -0m00.00s 0m03.19s | ModularArithmetic/ModularBaseSystemOpt | 0m03.20s || -0m00.01s 0m02.48s | Util/ZUtil | 0m02.39s || +0m00.08s 0m01.56s | ModularArithmetic/PrimeFieldTheorems | 0m01.60s || -0m00.04s 0m01.56s | Encoding/PointEncodingPre | 0m01.56s || +0m00.00s 0m01.56s | ModularArithmetic/ModularArithmeticTheorems | 0m01.59s || -0m00.03s 0m01.15s | BaseSystem | 0m01.17s || -0m00.02s 0m01.12s | ModularArithmetic/ExtendedBaseVector | 0m01.10s || +0m00.02s 0m00.98s | Experiments/DerivationsOptionRectLetInEncoding | 0m01.00s || -0m00.02s 0m00.93s | ModularArithmetic/BarrettReduction/Z | 0m00.93s || +0m00.00s 0m00.89s | ModularArithmetic/ModularBaseSystemField | 0m00.89s || +0m00.00s 0m00.88s | Util/NumTheoryUtil | 0m00.87s || +0m00.01s 0m00.80s | ModularArithmetic/ModularBaseSystemListProofs | 0m00.82s || -0m00.01s 0m00.74s | Encoding/ModularWordEncodingTheorems | 0m00.68s || +0m00.05s 0m00.67s | Experiments/SpecificCurve25519 | 0m00.69s || -0m00.01s 0m00.63s | ModularArithmetic/ExtPow2BaseMulProofs | 0m00.64s || -0m00.01s 0m00.62s | Testbit | 0m00.64s || -0m00.02s 0m00.60s | Spec/ModularWordEncoding | 0m00.63s || -0m00.03s 0m00.60s | ModularArithmetic/ModularBaseSystemList | 0m00.57s || +0m00.03s 0m00.59s | ModularArithmetic/PseudoMersenneBaseParamProofs | 0m00.59s || +0m00.00s 0m00.59s | Encoding/ModularWordEncodingPre | 0m00.63s || -0m00.04s 0m00.55s | ModularArithmetic/ModularBaseSystem | 0m00.55s || +0m00.00s 0m00.47s | ModularArithmetic/Pre | 0m00.45s || +0m00.01s 0m00.43s | ModularArithmetic/Pow2Base | 0m00.42s || +0m00.01s 0m00.41s | ModularArithmetic/PseudoMersenneBaseParams | 0m00.36s || +0m00.04s 0m00.37s | Spec/ModularArithmetic | 0m00.41s || -0m00.03s
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.