aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_CoqProject2
-rw-r--r--src/ModularArithmetic/ModularBaseSystemInterface.v30
-rw-r--r--src/ModularArithmetic/ModularBaseSystemProofs.v52
3 files changed, 63 insertions, 21 deletions
diff --git a/_CoqProject b/_CoqProject
index 904d716b8..49fad12e0 100644
--- a/_CoqProject
+++ b/_CoqProject
@@ -35,13 +35,13 @@ src/Experiments/SpecEd25519.v
src/ModularArithmetic/ExtendedBaseVector.v
src/ModularArithmetic/ModularArithmeticTheorems.v
src/ModularArithmetic/ModularBaseSystem.v
+src/ModularArithmetic/ModularBaseSystemInterface.v
src/ModularArithmetic/ModularBaseSystemOpt.v
src/ModularArithmetic/ModularBaseSystemProofs.v
src/ModularArithmetic/Pre.v
src/ModularArithmetic/PrimeFieldTheorems.v
src/ModularArithmetic/PseudoMersenneBaseParamProofs.v
src/ModularArithmetic/PseudoMersenneBaseParams.v
-src/ModularArithmetic/PseudoMersenneBaseRep.v
src/ModularArithmetic/Tutorial.v
src/Spec/CompleteEdwardsCurve.v
src/Spec/EdDSA.v
diff --git a/src/ModularArithmetic/ModularBaseSystemInterface.v b/src/ModularArithmetic/ModularBaseSystemInterface.v
new file mode 100644
index 000000000..b0cfffe8b
--- /dev/null
+++ b/src/ModularArithmetic/ModularBaseSystemInterface.v
@@ -0,0 +1,30 @@
+Require Import Crypto.BaseSystem.
+Require Import Crypto.ModularArithmetic.ModularBaseSystem.
+Require Import Crypto.ModularArithmetic.ModularBaseSystemOpt.
+Require Import Crypto.ModularArithmetic.ModularBaseSystemProofs.
+Require Import Crypto.BaseSystemProofs.
+Require Import Crypto.Util.Tuple Crypto.Util.CaseUtil.
+Require Import ZArith.
+Import PseudoMersenneBaseParams PseudoMersenneBaseParamProofs.
+
+Generalizable All Variables.
+Section s.
+ Context `{prm:PseudoMersenneBaseParams m} {sc : SubtractionCoefficient m prm}.
+
+ Definition frep := tuple Z (length PseudoMersenneBaseParamProofs.base).
+
+ Definition mul : frep -> frep -> frep.
+ refine (on_tuple2 (mul_opt k c) _).
+ abstract (intros; rewrite mul_opt_correct; auto using length_mul).
+ Defined.
+
+ Definition add : frep -> frep -> frep.
+ refine (on_tuple2 add_opt _).
+ abstract (intros; rewrite add_opt_correct, add_length_exact; case_max; omega).
+ Defined.
+
+ Definition sub : frep -> frep -> frep.
+ refine (on_tuple2 sub_opt _).
+ abstract (intros; rewrite sub_opt_correct; apply length_sub; rewrite ?coeff_length; auto).
+ Defined.
+End S. \ No newline at end of file
diff --git a/src/ModularArithmetic/ModularBaseSystemProofs.v b/src/ModularArithmetic/ModularBaseSystemProofs.v
index 6f82a8950..eaa1fc19e 100644
--- a/src/ModularArithmetic/ModularBaseSystemProofs.v
+++ b/src/ModularArithmetic/ModularBaseSystemProofs.v
@@ -56,20 +56,27 @@ Section PseudoMersenneProofs.
subst; auto.
Qed.
+ Lemma length_sub : forall c x u v,
+ length c = length base
+ -> length u = length base
+ -> length v = length base
+ -> length (ModularBaseSystem.sub c x u v) = length base.
+ Proof.
+ autounfold; unfold ModularBaseSystem.sub; intuition idtac.
+ rewrite sub_length, add_length_exact.
+ case_max; try rewrite Max.max_r; omega.
+ Qed.
+
Lemma sub_rep : forall c c_0modq, (length c = length base)%nat ->
forall u v x y, u ~= x -> v ~= y ->
ModularBaseSystem.sub c c_0modq u v ~= (x-y)%F.
Proof.
- autounfold; unfold ModularBaseSystem.sub; intuition. {
- rewrite sub_length.
- case_max; try rewrite Max.max_r; try omega.
- auto using add_same_length.
- }
- unfold decode in *; unfold BaseSystem.decode in *.
- rewrite BaseSystemProofs.sub_rep, BaseSystemProofs.add_rep.
- rewrite ZToField_sub, ZToField_add, ZToField_mod.
- rewrite c_0modq, F_add_0_l.
- subst; auto.
+ split; autounfold in *.
+ { apply length_sub; intuition (auto; omega). }
+ { unfold decode, ModularBaseSystem.sub, BaseSystem.decode in *; intuition idtac.
+ rewrite BaseSystemProofs.sub_rep, BaseSystemProofs.add_rep.
+ rewrite ZToField_sub, ZToField_add, ZToField_mod.
+ rewrite c_0modq, F_add_0_l. congruence. }
Qed.
Lemma decode_short : forall (us : BaseSystem.digits),
@@ -155,23 +162,28 @@ Section PseudoMersenneProofs.
apply Max.max_l; omega.
Qed.
- Lemma mul_rep : forall u v x y, u ~= x -> v ~= y -> u .* v ~= (x*y)%F.
+ Lemma length_mul : forall u v,
+ length u = length base
+ -> length v = length base
+ -> length (u .* v) = length base.
Proof.
- autounfold; unfold ModularBaseSystem.mul; intuition.
- {
+ autounfold in *; unfold ModularBaseSystem.mul in *; intuition eauto.
apply reduce_length.
rewrite mul_length_exact, extended_base_length; try omega.
destruct u; try congruence.
rewrite @nil_length0 in *.
pose proof base_length_nonzero; omega.
- } {
+ Qed.
+
+ Lemma mul_rep : forall u v x y, u ~= x -> v ~= y -> u .* v ~= (x*y)%F.
+ Proof.
+ split; autounfold in *; unfold ModularBaseSystem.mul in *.
+ { apply length_mul; intuition auto. }
+ { intuition idtac; subst.
rewrite ZToField_mod, reduce_rep, <-ZToField_mod.
- rewrite mul_rep by
- (apply ExtBaseVector || rewrite extended_base_length; omega).
- subst.
- do 2 rewrite decode_short by omega.
- apply ZToField_mul.
- }
+ rewrite mul_rep by (apply ExtBaseVector || rewrite extended_base_length; omega).
+ rewrite 2decode_short by omega.
+ apply ZToField_mul. }
Qed.
Lemma set_nth_sum : forall n x us, (n < length us)%nat ->