aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--src/ModularArithmetic/FField.v62
2 files changed, 63 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 2fc573520..890d2384e 100644
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ SRC_DIR := src
SORT_COQPROJECT = sed 's,[^/]*/,~&,g' | env LC_COLLATE=C sort | sed 's,~,,g'
update-_CoqProject::
- (echo '-R $(SRC_DIR) $(MOD_NAME)'; (git ls-files "src/*.v" | $(SORT_COQPROJECT))) > _CoqProject
+ (echo '-R $(SRC_DIR) $(MOD_NAME)'; (git ls-files 'src/*.v' | $(SORT_COQPROJECT))) > _CoqProject
coq: coqprime Makefile.coq
$(MAKE) -f Makefile.coq
diff --git a/src/ModularArithmetic/FField.v b/src/ModularArithmetic/FField.v
new file mode 100644
index 000000000..cd293056f
--- /dev/null
+++ b/src/ModularArithmetic/FField.v
@@ -0,0 +1,62 @@
+Require Export Crypto.Spec.ModularArithmetic.
+Require Export Field.
+
+Require Import Crypto.ModularArithmetic.PrimeFieldTheorems.
+
+Local Open Scope F_scope.
+
+Definition OpaqueF := F.
+Definition OpaqueZmodulo := BinInt.Z.modulo.
+Definition Opaqueadd {p} : OpaqueF p -> OpaqueF p -> OpaqueF p := @add p.
+Definition Opaquemul {p} : OpaqueF p -> OpaqueF p -> OpaqueF p := @mul p.
+Definition Opaquesub {p} : OpaqueF p -> OpaqueF p -> OpaqueF p := @sub p.
+Definition Opaquediv {p} : OpaqueF p -> OpaqueF p -> OpaqueF p := @div p.
+Definition Opaqueopp {p} : OpaqueF p -> OpaqueF p := @opp p.
+Definition Opaqueinv {p} : OpaqueF p -> OpaqueF p := @inv p.
+Definition OpaqueZToField {p} : BinInt.Z -> OpaqueF p := @ZToField p.
+Global Opaque F OpaqueZmodulo Opaqueadd Opaquemul Opaquesub Opaquediv Opaqueopp Opaqueinv OpaqueZToField.
+
+Definition OpaqueFieldTheory p {prime_p} : @field_theory (OpaqueF p) (OpaqueZToField 0%Z) (OpaqueZToField 1%Z) Opaqueadd Opaquemul Opaquesub Opaqueopp Opaquediv Opaqueinv eq := Eval hnf in @Ffield_theory p prime_p.
+
+Ltac FIELD_SIMPL_idtac FLD lH rl :=
+ let Simpl := idtac (* (protect_fv "field") *) in
+ let lemma := get_SimplifyEqLemma FLD in
+ get_FldPre FLD ();
+ Field_Scheme Simpl Ring_tac.ring_subst_niter lemma FLD lH;
+ get_FldPost FLD ().
+Ltac field_simplify_eq_idtac := let G := Get_goal in field_lookup (PackField FIELD_SIMPL_idtac) [] G.
+
+Ltac F_to_Opaque :=
+ change F with OpaqueF in *;
+ change BinInt.Z.modulo with OpaqueZmodulo in *;
+ change @add with @Opaqueadd in *;
+ change @mul with @Opaquemul in *;
+ change @sub with @Opaquesub in *;
+ change @div with @Opaquediv in *;
+ change @opp with @Opaqueopp in *;
+ change @inv with @Opaqueinv in *;
+ change @ZToField with @OpaqueZToField in *.
+
+Ltac F_from_Opaque p :=
+ change OpaqueF with F in *;
+ change (@sig BinNums.Z (fun z : BinNums.Z => @eq BinNums.Z z (BinInt.Z.modulo z p))) with (F p) in *;
+ change OpaqueZmodulo with BinInt.Z.modulo in *;
+ change @Opaqueadd with @add in *;
+ change @Opaquemul with @mul in *;
+ change @Opaquesub with @sub in *;
+ change @Opaquediv with @div in *;
+ change @Opaqueopp with @opp in *;
+ change @Opaqueinv with @inv in *;
+ change @OpaqueZToField with @ZToField in *.
+
+Ltac F_field_simplify_eq :=
+ lazymatch goal with |- @eq (F ?p) _ _ =>
+ F_to_Opaque;
+ field_simplify_eq_idtac;
+ compute;
+ F_from_Opaque p
+ end.
+
+Ltac F_field := F_field_simplify_eq; [ring|..].
+
+Ltac notConstant t := constr:NotConstant. \ No newline at end of file