diff options
Diffstat (limited to 'src/Specific/GF1305.v')
-rw-r--r-- | src/Specific/GF1305.v | 60 |
1 files changed, 31 insertions, 29 deletions
diff --git a/src/Specific/GF1305.v b/src/Specific/GF1305.v index 077c98954..fba77a4a8 100644 --- a/src/Specific/GF1305.v +++ b/src/Specific/GF1305.v @@ -1,13 +1,15 @@ -Require Import Crypto.ModularArithmetic.ModularBaseSystem. -Require Import Crypto.ModularArithmetic.ModularBaseSystemOpt. +Require Import Crypto.BaseSystem. +Require Import Crypto.ModularArithmetic.PrimeFieldTheorems. Require Import Crypto.ModularArithmetic.PseudoMersenneBaseParams. Require Import Crypto.ModularArithmetic.PseudoMersenneBaseParamProofs. +Require Import Crypto.ModularArithmetic.ModularBaseSystem. +Require Import Crypto.ModularArithmetic.ModularBaseSystemProofs. +Require Import Crypto.ModularArithmetic.ModularBaseSystemOpt. +Require Import Crypto.ModularArithmetic.ModularBaseSystemField. Require Import Coq.Lists.List Crypto.Util.ListUtil. -Require Import Crypto.ModularArithmetic.PrimeFieldTheorems. -Require Import Crypto.ModularArithmetic.ModularBaseSystemInterface. Require Import Crypto.Tactics.VerdiTactics. -Require Import Crypto.BaseSystem. Require Import Crypto.Util.ZUtil. +Require Import Crypto.Util.Tuple. Require Import Crypto.Util.Notations. Require Import Crypto.Algebra. Import ListNotations. @@ -26,12 +28,13 @@ Instance params1305 : PseudoMersenneBaseParams modulus. construct_params prime_modulus 5%nat 130. Defined. -Definition mul2modulus := Eval compute in (construct_mul2modulus params1305). +Definition fe1305 := Eval compute in (tuple Z (length limb_widths)). + +Definition mul2modulus : fe1305 := + Eval compute in (from_list_default 0%Z (length limb_widths) (construct_mul2modulus params1305)). Instance subCoeff : SubtractionCoefficient modulus params1305. apply Build_SubtractionCoefficient with (coeff := mul2modulus). - cbv; auto. - cbv [ModularBaseSystem.decode]. apply ZToField_eqmod. cbv; reflexivity. Defined. @@ -49,9 +52,7 @@ Definition c_ := Eval compute in c. Definition k_subst : k = k_ := eq_refl k_. Definition c_subst : c = c_ := eq_refl c_. -Definition fe1305 : Type := Eval cbv in fe. - -Local Opaque Z.shiftr Z.shiftl Z.land Z.mul Z.add Z.sub Let_In phi. +Local Opaque Z.shiftr Z.shiftl Z.land Z.mul Z.add Z.sub Let_In. Definition app_5 (f : fe1305) (P : fe1305 -> fe1305) : fe1305. Proof. @@ -80,25 +81,25 @@ Proof. Qed. Definition add_sig (f g : fe1305) : - { fg : fe1305 | fg = ModularBaseSystemInterface.add f g}. + { fg : fe1305 | fg = add_opt f g}. Proof. eexists. - rewrite <-appify2_correct. (* Coq 8.4 : 6s *) + rewrite <-appify2_correct. cbv. reflexivity. -Defined. (* Coq 8.4 : 7s *) +Defined. Definition add (f g : fe1305) : fe1305 := Eval cbv beta iota delta [proj1_sig add_sig] in proj1_sig (add_sig f g). Definition add_correct (f g : fe1305) - : add f g = ModularBaseSystemInterface.add f g := + : add f g = add_opt f g := Eval cbv beta iota delta [proj1_sig add_sig] in - proj2_sig (add_sig f g). (* Coq 8.4 : 10s *) + proj2_sig (add_sig f g). Definition sub_sig (f g : fe1305) : - { fg : fe1305 | fg = ModularBaseSystemInterface.sub f g}. + { fg : fe1305 | fg = sub_opt f g}. Proof. eexists. rewrite <-appify2_correct. @@ -111,12 +112,14 @@ Definition sub (f g : fe1305) : fe1305 := proj1_sig (sub_sig f g). Definition sub_correct (f g : fe1305) - : sub f g = ModularBaseSystemInterface.sub f g := + : sub f g = sub_opt f g := Eval cbv beta iota delta [proj1_sig sub_sig] in - proj2_sig (sub_sig f g). (* Coq 8.4 : 10s *) + proj2_sig (sub_sig f g). +(* For multiplication, we add another layer of definition so that we can + rewrite under the [let] binders. *) Definition mul_simpl_sig (f g : fe1305) : - { fg : fe1305 | fg = ModularBaseSystemInterface.mul (k_ := k_) (c_ := c_) f g}. + { fg : fe1305 | fg = carry_mul_opt k_ c_ f g}. Proof. cbv [fe1305] in *. repeat match goal with p : (_ * Z)%type |- _ => destruct p end. @@ -131,41 +134,40 @@ Definition mul_simpl (f g : fe1305) : fe1305 := proj1_sig (mul_simpl_sig f g). Definition mul_simpl_correct (f g : fe1305) - : mul_simpl f g = ModularBaseSystemInterface.mul (k_ := k_) (c_ := c_) f g := + : mul_simpl f g = carry_mul_opt k_ c_ f g := Eval cbv beta iota delta [proj1_sig mul_simpl_sig] in proj2_sig (mul_simpl_sig f g). Definition mul_sig (f g : fe1305) : - { fg : fe1305 | fg = ModularBaseSystemInterface.mul (k_ := k_) (c_ := c_) f g}. + { fg : fe1305 | fg = carry_mul_opt k_ c_ f g}. Proof. eexists. rewrite <-mul_simpl_correct. rewrite <-appify2_correct. cbv. - autorewrite with zsimplify. reflexivity. -Defined. (* Coq 8.4 : 14s *) +Defined. Definition mul (f g : fe1305) : fe1305 := Eval cbv beta iota delta [proj1_sig mul_sig] in proj1_sig (mul_sig f g). Definition mul_correct (f g : fe1305) - : mul f g = ModularBaseSystemInterface.mul (k_ := k_) (c_ := c_) f g := + : mul f g = carry_mul_opt k_ c_ f g := Eval cbv beta iota delta [proj1_sig add_sig] in - proj2_sig (mul_sig f g). (* Coq 8.4 : 5s *) + proj2_sig (mul_sig f g). Import Morphisms. -Lemma field1305 : @field fe eq zero one opp add sub mul inv div. +Lemma field1305 : @field fe1305 eq zero one opp add sub mul inv div. Proof. pose proof (Equivalence_Reflexive : Reflexive eq). - eapply (Field.equivalent_operations_field (fieldR := modular_base_system_field k_subst c_subst)). + eapply (Field.equivalent_operations_field (fieldR := modular_base_system_field k_ c_ k_subst c_subst)). Grab Existential Variables. + reflexivity. + reflexivity. + reflexivity. - + intros; rewrite mul_correct; reflexivity. + + intros; rewrite mul_correct. reflexivity. + intros; rewrite sub_correct; reflexivity. + intros; rewrite add_correct; reflexivity. + reflexivity. |