diff options
author | Jason Gross <jgross@mit.edu> | 2016-02-05 15:24:42 -0500 |
---|---|---|
committer | Jason Gross <jgross@mit.edu> | 2016-02-05 15:24:42 -0500 |
commit | a47b49b11d17add5ca1ea5e650d2f344219b4f7e (patch) | |
tree | 699bff16674a68d1a5dc059bfdbd2f9ca85e95a7 /src | |
parent | 1f83ff39458ca80acf3192c938490cf4988b7489 (diff) |
Update build process to use COQPATH & _CoqProject
Removed all of the files not built by default; they can be resurrected from git
history. _CoqProject is the standard way to list the files in a project and to
give information to coq_makefile. COQPATH is the standard way to make use of
not-yet-installed libraries that are not part of your project (i.e., you don't
want to remove them when you `make clean`, etc.).
Diffstat (limited to 'src')
-rw-r--r-- | src/Assembly/Asm.v | 66 | ||||
-rw-r--r-- | src/Assembly/AsmDSL.v | 34 | ||||
-rw-r--r-- | src/Assembly/Computation.v | 175 | ||||
-rw-r--r-- | src/Assembly/DSL.v | 28 | ||||
-rw-r--r-- | src/Assembly/WordBounds.v | 122 | ||||
-rw-r--r-- | src/Scratch/fermat.v | 185 |
6 files changed, 0 insertions, 610 deletions
diff --git a/src/Assembly/Asm.v b/src/Assembly/Asm.v deleted file mode 100644 index e2186df81..000000000 --- a/src/Assembly/Asm.v +++ /dev/null @@ -1,66 +0,0 @@ - -Require Export Bedrock.Word. - -Inductive AsmType: Set := - | Int32 | Int64 - | Float80 | Int128 - | Pointer. - -Definition Name := String. - -Inductive AsmVar (type: AsmType) := - | StackAsmVar : Name -> AsmVar - | MemoryAsmVar : Name -> AsmVar - | Register : Name -> AsmVar. - -Definition bits (type: AsmType): nat := - match type with - | Int32 => 32 - | Int64 => 64 - | Float80 => 80 - | Int128 => 128 - | Pointer => 64 - end. - -Definition isDouble (a b: AsmType): Prop := - match (a, b) with - | (Int32, Int64) => True - | (Int64, Int128) => True - | _ => False - end. - -Inductive UnaryOp := - | AsmId | AsmNot | AsmOpp. - -Inductive BinaryOp := - | AsmPlus | AsmMinus | AsmMult - | AsmDiv | AsmAnd | AsmOr - | AsmXor | AsmRShift | AsmLShift. - -Inductive AsmTerm (type: AsmType) := - | AsmConst : (word (bits type)) -> (AsmTerm type) - | AsmVarTerm : AsmVar type -> AsmTerm type - | AsmRef: AsmVar type -> AsmTerm Pointer - | AsmDeref: AsmVar Pointer -> AsmTerm type. - -Inductive AsmExpr (type: AsmType) := - | Unary : UnaryOp -> (AsmTerm type) -> (AsmExpr type) - | Binary : BinaryOp -> (AsmTerm type) -> (AsmTerm type) -> (AsmExpr type). - -Inductive AsmComputation := - | AsmDeclare : forall t, AsmVar t -> AsmComputation - | AsmSet : forall t, AsmVar t -> Expr t -> AsmComputation - | AsmDestruct : forall t1 t2, - isDouble t1 t2 -> AsmVar t1 -> AsmVar t1 -> AsmExpr t2 - -> Unit. - | AsmConstruct : forall t1 t2, - isDouble t1 t2 -> AsmVar t2 -> AsmExpr t1 -> AsmExpr t1 - -> Unit. - | AsmSeq : AsmComputation -> AsmComputation -> AsmComputation - | AsmLabel : String -> AsmComputation -> AsmComputation - | AsmGoto : String -> AsmComputation - | AsmIf : forall t, (AsmTerm t) -> AsmComputation -> AsmComputation. - -Inductive AsmSub := - | Asm: forall t, - list ((AsmVar t) * (AsmTerm t)) -> AsmComputation -> AsmTerm t. diff --git a/src/Assembly/AsmDSL.v b/src/Assembly/AsmDSL.v deleted file mode 100644 index 791b07391..000000000 --- a/src/Assembly/AsmDSL.v +++ /dev/null @@ -1,34 +0,0 @@ - -Require Import AsmComputation. - -Notation "stack32 A" := StackAsmVar A. -Notation "int32 A" := MemoryAsmVar A. -Notation "reg32 A" := Register A. - -Notation "{{ A }}" := AsmConst A. - -Notation "** A" := AsmRef A. -Notation "&& A" := AsmDeref A. - -Notation "~ A" := Unary AsmNot A. -Notation "- A" := Unary AsmOpp A. -Notation "A + B" := Binary AsmPlus A B. -Notation "A - B" := Binary AsmMinus A B. -Notation "A * B" := Binary AsmMult A B. -Notation "A / B" := Binary AsmDiv A B. -Notation "A & B" := Binary AsmAnd A B. -Notation "A | B" := Binary AsmOr A B. -Notation "A ^ B" := Binary AsmXor A B. -Notation "A >> B" := Binary AsmRShift A B. -Notation "A << B" := Binary AsmLShift A B. - -Notation "declare A" := AsmDeclare A -Notation "A ::= B" := AsmSet A B -Notation "(A B) =:= C" := AsmDestruct A B C -Notation "A =:= (B C)" := AsmConstruct A B C -Notation "A ;; B" := AsmSeq A B -Notation "A :: B" := AsmLabel A B -Notation "goto A" := AsmGoto A -Notation "A ? B" := AsmIf A B - -Notation "enter A do B" := Asm A B diff --git a/src/Assembly/Computation.v b/src/Assembly/Computation.v deleted file mode 100644 index 33af0974e..000000000 --- a/src/Assembly/Computation.v +++ /dev/null @@ -1,175 +0,0 @@ - -Require Import EqNat Peano_dec. -Require Import Bedrock.Word. - -(* Very basic definitions *) - -Definition wordSize := 32. - -Definition Name := nat. - -Definition WordCount := nat. - -Definition WordList (words: WordCount) := - {x: list (word wordSize) | length x = words}. - -Inductive Pointer := - | ListPtr: forall n, WordList n -> Pointer. - -Definition TypeBindings := Name -> option WordCount. - -Definition Bindings := Name -> option Pointer. - -(* Primary inductive language definitions *) - -Inductive CTerm (words: WordCount) := - | CConst : WordList words -> CTerm words - | CVar : Name -> CTerm words - | CConcat: forall t1 t2, t1 + t2 = words -> CTerm t1 -> CTerm t2 -> CTerm words - | CHead: forall n: nat, gt n words -> CTerm n -> CTerm words - | CTail: forall n: nat, gt n words -> CTerm n -> CTerm words. - -Inductive CExpr (words: WordCount) := - | CLift : (CTerm words) -> (CExpr words) - | CNot : (CExpr words) -> (CExpr words) - | COpp : (CExpr words) -> (CExpr words) - | COr : (CExpr words) -> (CExpr words) -> (CExpr words) - | CAnd : (CExpr words) -> (CExpr words) -> (CExpr words) - | CXor : (CExpr words) -> (CExpr words) -> (CExpr words) - | CRShift : forall n: nat, (CExpr words) -> (CExpr words) - | CLShift : forall n: nat, (CExpr words) -> (CExpr words) - | CPlus : (CExpr words) -> (CExpr words) -> (CExpr words) - | CMinus : (CExpr words) -> (CExpr words) -> (CExpr words) - | CMult : forall n: nat, n*2 = words -> - (CExpr n) -> (CExpr n) -> (CExpr words) - | CDiv : (CExpr words) -> (CExpr words) -> (CExpr words) - | CMod : (CExpr words) -> (CExpr words) -> (CExpr words). - -Definition bindType (name: Name) (type: WordCount) (bindings: TypeBindings) - : Name -> option WordCount := - fun x => if (beq_nat x name) then Some type else bindings x. - -Inductive Sub (inputs: TypeBindings) (output: WordCount) := - | CRet : CExpr output -> Sub inputs output - | CCompose : forall resultName resultSize, - inputs resultName = None - -> (Sub inputs resultSize) - -> (Sub (bindType resultName resultSize inputs) output) - -> (Sub inputs output) - | CIte : (Sub inputs 1) (* condition *) - -> (Sub inputs output) (* then *) - -> (Sub inputs output) (* else *) - -> (Sub inputs output) - | CLet : forall (name: Name) (n: WordCount), - CExpr n - -> (Sub (bindType name n inputs) output) - -> (Sub inputs output) - | CRepeat : forall (bindOutputTo: Name) (n: nat), - inputs bindOutputTo <> None - -> (Sub (bindType bindOutputTo output inputs) output) - -> (Sub inputs output). - -(* Some simple option-monad sugar *) - -Definition optionReturn {A} (x : A) := Some x. - -Definition optionBind {A B} (a : option A) (f : A -> option B) : option B := - match a with - | Some x => f x - | None => None - end. - -Notation "'do' A <- B ; C" := (optionBind B (fun A => C)) - (at level 200, X ident, A at level 100, B at level 200). - -Definition optionType {n m} (w: WordList n): option (WordList m). - destruct (eq_nat_dec n m); - abstract (try rewrite e in *; first [exact (Some w) | exact None]). -Defined. - -Definition wordListConcat {t1 t2 words}: - t1 + t2 = words -> WordList t1 -> WordList t2 -> WordList words. - intros; exists ((proj1_sig H0) ++ (proj1_sig H1))%list. - abstract (destruct H0, H1; simpl; - rewrite List.app_length; intuition). -Defined. - -Definition wordListHead {n words}: - gt n words -> WordList n -> WordList words. - intros; exists (List.firstn words (proj1_sig H0)). - abstract (destruct H0; simpl; - rewrite List.firstn_length; intuition). -Defined. - -Lemma skipnLength: forall A m (x: list A), - ge (length x) m -> - length (List.skipn m x) = length x - m. -Proof. - intros; assert (length x = length (List.firstn m x ++ List.skipn m x)%list). - - rewrite List.firstn_skipn; trivial. - - rewrite H0; rewrite List.app_length; rewrite List.firstn_length. - replace (min m (length x)) with m; try rewrite min_l; intuition. -Qed. - -Definition wordListTail {n words}: - gt n words -> WordList n -> WordList words. - intros; exists (List.skipn (n - words) (proj1_sig H0)). - abstract (destruct H0; simpl; - rewrite skipnLength; rewrite e; intuition). -Defined. - -(* Now some basic evaluation routines *) - -Fixpoint evalTerm {n} (bindings: Bindings) (term: CTerm n): - option (WordList n) := - match term with - | CConst lst => Some lst - | CVar name => - do p <- bindings name ; - match p with - | ListPtr m lst => optionType lst - end - | CConcat t1 t2 pf term1 term2 => - do a <- evalTerm bindings term1; - do b <- evalTerm bindings term2; - Some (wordListConcat pf a b)%list - | CHead n pf t => - do x <- evalTerm bindings t; - Some (wordListHead pf x) - | CTail n pf t => - do x <- evalTerm bindings t; - Some (wordListTail pf x) - end. - -Fixpoint evalExpr {n} (expr: CExpr n): option (word n) := - match expr with - | CLift term => None - | CNot a => None - | COpp a => None - | COr a b => - do x <- evalExpr a; - do y <- evalExpr b; - Some (x |^ y)%word - | CAnd a b => None - | CXor a b => None - | CRShift shift a => None - | CLShift shift a => None - | CPlus a b => None - | CMinus a b => None - | CMult _ _ a b => None - | CDiv a b => None - | CMod a b => None - end. - -Fixpoint evalSub (inputs: Name -> option WordCount) (output: WordCount) (sub: Sub inputs output) - : word output := - match sub with - | CRet e => natToWord output 0 - | CCompose resName resSize _ a b => natToWord output 0 - | CIte cond thenSub elseSub => natToWord output 0 - | CLet name wordCount expr inside => natToWord output 0 - | CRepeat inName times _ inside => natToWord output 0 - end. - -(* Equivalence Lemmas *) - diff --git a/src/Assembly/DSL.v b/src/Assembly/DSL.v deleted file mode 100644 index 2cb07a5d4..000000000 --- a/src/Assembly/DSL.v +++ /dev/null @@ -1,28 +0,0 @@ - -Require Export ConstrainedComputation. - -Notation "const A" := CConst A. -Notation "var A" := CVar A. -Notation "A : B" := CJoin A B. -Notation "left A" := CLeft A. -Notation "right A" := CRight A. - -Notation "~ A" := UnaryExpr CNot A. -Notation "- A" := UnaryExpr COpp A. -Notation "A + B" := BinaryExpr CPlus A B. -Notation "A - B" := BinaryExpr CMinus A B. -Notation "A * B" := BinaryExpr CMult A B. -Notation "A / B" := BinaryExpr CDiv A B. -Notation "A & B" := BinaryExpr CAnd A B. -Notation "A | B" := BinaryExpr COr A B. -Notation "A ^ B" := BinaryExpr CXor A B. -Notation "A >> B" := BinaryExpr CRShift A B. -Notation "A << B" := BinaryExpr CLShift A B. - -Definition toExpr {type} (term: CTerm type) = TermExpr term. -Coersion toExpr: {type} CTerm type >-> CExpr type. - -Notation "ret A" := CRet A -Notation "A . B" := CCompose A B -Notation "A ? B : C" := CIte A B C -Notation "set A to B in C" := CLet A B C diff --git a/src/Assembly/WordBounds.v b/src/Assembly/WordBounds.v deleted file mode 100644 index e05fcb1d4..000000000 --- a/src/Assembly/WordBounds.v +++ /dev/null @@ -1,122 +0,0 @@ -Require Import Bedrock.Word. -Import BinNums PArith.BinPos NArith.BinNat NArith.Ndigits. - -Definition wordUn (f : N -> N) {sz : nat} (x : word sz) := - NToWord sz (f (wordToN x)). -Definition wshr {l} n := @wordUn (fun x => N.shiftr x n) l. -Lemma wshr_test : (wordToN (wshr 3 (NToWord 32 (128- 19)))) = 13%N. - reflexivity. -Qed. - -Module WordBoundsExamples. - Definition u31 := word 31. - Definition U31 := NToWord 31. - Definition u64 := word 64. - Definition U64 := NToWord 64. - - Definition c2 : u64 := NToWord _ 2. - Definition c19_31 : u31 := NToWord _ 19. - Definition c19 : u64 := NToWord _ 19. - Definition c38 : u64 := NToWord _ 38. - Definition t25_31 : u31 := NToWord _ (Npos (2^25)). - Definition t26_31 : u31 := NToWord _ (Npos (2^26)). - Definition t25 : u64 := NToWord _ (Npos (2^25)). - Definition t26 : u64 := NToWord _ (Npos (2^26)). - Definition t27 : u64 := NToWord _ (Npos (2^26)). - Definition m25 : u64 := t25^-(NToWord _ 1). - Definition m26 : u64 := t26^-(NToWord _ 1). - Definition r25 (hSk hk:u64) : (u64 * u64) := (hSk ^+ wshr 25 hk, wand m25 hk). - Definition r26 (hSk hk:u64) : (u64 * u64) := (hSk ^+ wshr 26 hk, wand m26 hk). - Definition r25mod (hSk hk:u64) : (u64 * u64) := (hSk ^+ c19^*wshr 25 hk, wand m25 hk). - - Lemma simple_add_rep : forall (a b c d:N), - (a < Npos(2^29) -> b < Npos(2^29) -> c < Npos(2^29) -> d < Npos(2^29))%N -> - wordToN(U31 a ^+ U31 b ^+ U31 c ^+ U31 d) = (a + b + c + d)%N. - Admitted. - - Lemma simple_add_bound : forall (a b c d:u64), - a < t25 -> b < t25 -> c < t25 -> d < t25 -> - (a ^+ b ^+ c ^+ d) < t27. - Admitted. - - (* the bounds can as well be stated in N if the _rep lemma works. - I am not sure whether it is a better idea to propagate the bounds in word or - in N, though -- proving rep requires propagating bounds for the subexpressions. - *) - - Lemma simple_linear_rep : forall (a b:N), (a < Npos(2^25) + Npos(2^26) -> b < Npos(2^25))%N -> - wordToN((U31 a)^*c19_31 ^+ U31 b) = (a*19 + b)%N. - Admitted. - - Lemma simple_linear_bound : forall (a b:u31), a < t25_31 ^+ t26_31 -> b < t25_31 -> - a^*c19_31 ^+ b < (NToWord _ 1946157056). (* (2**26+2**25)*19 + 2**25 = 1946157056 *) - Admitted. - - Lemma simple_mul_carry_rep : forall (a b c:N), (a < Npos(2^26) -> b < Npos(2^26) -> c < Npos(2^26))%N -> - wordToN(wshr 26 (U64 a ^* U64 b) ^+ U64 c) = ((a*b)/(2^26) + c)%N. - Admitted. - - Lemma simple_mul_carry_bound : forall (a b c:u64), a < t26 -> b < t26 -> c < t26 -> - wshr 26 (a ^* b) ^+ c < t27. - Admitted. - - Lemma simple_mul_reduce_rep : forall (a b c:N), (a < Npos(2^26) -> b < Npos(2^26))%N -> - wordToN(wand m26 (U64 a ^* U64 b)) = ((a*b) mod (2^26) + c)%N. - Admitted. - - Lemma sandy2x_bound : forall - (* this example is transcribed by hand from <https://eprint.iacr.org/2015/943.pdf> section 2.2. - it is very representative of the bounds check / absence-of-overflow proofs we actually - want to do. However, given its size, presence of transcription errors is totally plausible. - A corresponding _rep proof will also necessary.*) - (f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 : u64) - (g0 g1 g2 g3 g4 g5 g6 g7 g8 g9 : u64), - f0 < t26 -> g0 < t26 -> - f1 < t25 -> g1 < t25 -> - f2 < t26 -> g2 < t26 -> - f3 < t25 -> g3 < t25 -> - f4 < t26 -> g4 < t26 -> - f5 < t25 -> g5 < t25 -> - f6 < t26 -> g6 < t26 -> - f7 < t25 -> g7 < t25 -> - f8 < t26 -> g8 < t26 -> - f9 < t25 -> g9 < t25 -> - - let h0 := f0^*g0 ^+ c38^*f1^*g9 ^+ c19^*f2^*g8 ^+ c38^*f3^*g7 ^+ c19^*f4^*g6 ^+ c38^*f5^*g5 ^+ c19^*f6^*g4 ^+ c38^*f7^*g3 ^+ c19^*f8^*g2 ^+ c38^*f9^*g1 in - let h1 := f0^*g1 ^+ f1^*g0 ^+ c19^*f2^*g9 ^+ c19^*f3^*g8 ^+ c19^*f4^*g7 ^+ c19^*f5^*g6 ^+ c19^*f6^*g5 ^+ c19^*f7^*g4 ^+ c19^*f8^*g3 ^+ c19^*f9^*g2 in - let h2 := f0^*g2 ^+ c2^* f1^*g1 ^+ f2^*g0 ^+ c38^*f3^*g9 ^+ c19^*f4^*g8 ^+ c38^*f5^*g7 ^+ c19^*f6^*g6 ^+ c38^*f7^*g5 ^+ c19^*f8^*g4 ^+ c38^*f9^*g3 in - let h3 := f0^*g3 ^+ f1^*g2 ^+ f2^*g1 ^+ f3^*g0 ^+ c19^*f4^*g9 ^+ c19^*f5^*g8 ^+ c19^*f6^*g7 ^+ c19^*f7^*g6 ^+ c19^*f8^*g5 ^+ c19^*f9^*g4 in - let h4 := f0^*g4 ^+ c2^* f1^*g3 ^+ f2^*g2 ^+ c2^* f3^*g1 ^+ f4^*g0 ^+ c38^*f5^*g9 ^+ c19^*f6^*g8 ^+ c38^*f7^*g7 ^+ c19^*f8^*g6 ^+ c38^*f9^*g5 in - let h5 := f0^*g5 ^+ f1^*g4 ^+ f2^*g3 ^+ f3^*g2 ^+ f4^*g1 ^+ f5^*g0 ^+ c19^*f6^*g9 ^+ c19^*f7^*g8 ^+ c19^*f8^*g7 ^+ c19^*f9^*g6 in - let h6 := f0^*g6 ^+ c2^* f1^*g5 ^+ f2^*g4 ^+ c2^* f3^*g3 ^+ f4^*g2 ^+ c2^* f5^*g1 ^+ f6^*g0 ^+ c38^*f7^*g9 ^+ c19^*f8^*g8 ^+ c38^*f9^*g7 in - let h7 := f0^*g7 ^+ f1^*g6 ^+ f2^*g5 ^+ f3^*g4 ^+ f4^*g3 ^+ f5^*g2 ^+ f6^*g1 ^+ f7^*g0 ^+ c19^*f8^*g9 ^+ c19^*f9^*g8 in - let h8 := f0^*g8 ^+ c2^* f1^*g7 ^+ f2^*g6 ^+ c2^* f3^*g5 ^+ f4^*g4 ^+ c2^* f5^*g3 ^+ f6^*g2 ^+ c2^* f7^*g1 ^+ f8^*g0 ^+ c38^*f9^*g9 in - let h9 := f0^*g9 ^+ f1^*g8 ^+ f2^*g7 ^+ f3^*g6 ^+ f4^*g5 ^+ f5^*g4 ^+ f6^*g3 ^+ f7^*g2 ^+ f8^*g1 ^+ f9^*g0 in - - let (h1_1, h0_1) := r26 h1 h0 in - let (h2_1, h1_2) := r25 h2 h1_1 in - let (h3_1, h2_2) := r26 h3 h2_1 in - let (h4_1, h3_2) := r25 h4 h3_1 in - - let (h6_1, h5_1) := r25 h6 h5 in - let (h7_1, h6_2) := r26 h7 h6_1 in - let (h8_1, h7_2) := r25 h8 h7_1 in - let (h9_1, h8_2) := r26 h9 h8_1 in - let (h0_2, h9_2) := r25mod h0_1 h9_1 in - let (h1_3, h0_2) := r26 h1_2 h0_1 in - - let (h5_2, h4_2) := r26 h5_1 h4_1 in - let (h6_2, h5_3) := r25 h6_1 h5_2 in - - h0_2 < t26 /\ - h1_3 < t27 /\ - h2_2 < t26 /\ - h3_2 < t25 /\ - h4_2 < t26 /\ - h5_3 < t25 /\ - h6_2 < t27 /\ - h7_2 < t25 /\ - h8_2 < t26 /\ - h9_2 < t25. - Admitted. -End WordBoundsExamples. diff --git a/src/Scratch/fermat.v b/src/Scratch/fermat.v deleted file mode 100644 index 947ffce15..000000000 --- a/src/Scratch/fermat.v +++ /dev/null @@ -1,185 +0,0 @@ -Require Import NPeano. -Require Import List. -Require Import Sorting.Permutation. -Require Import BinInt. -Require Import Util.ListUtil. -Require Znumtheory. - -Lemma all_neq_NoDup : forall {T} (xs:list T), - (forall i j x y, - nth_error xs i = Some x -> - nth_error xs j = Some y -> - i <> j -> x <> y) <-> NoDup xs. -Admitted. - -Definition F (q:nat) := { n : nat | n = n mod q}. - -Section Fq. - Context {q : nat}. - Axiom q_prime : Znumtheory.prime (Z.of_nat q). - Let Fq := F q. - - Lemma q_is_succ : q = S (q-1). Admitted. - - Definition natToField (n:nat) : Fq. exists (n mod q). abstract admit. Defined. - Definition fieldToNat (n:Fq) : nat := proj1_sig n. - Coercion fieldToNat : Fq >-> nat. - - Definition zero : Fq. exists 0. abstract admit. Defined. - Definition one : Fq. exists 1. abstract admit. Defined. - - Definition add (a b: Fq) : Fq. exists (a+b mod q); abstract admit. Defined. - Infix "+" := add. - Definition mul (a b: Fq) : Fq. exists (a*b mod q); abstract admit. Defined. - Infix "*" := mul. - Definition pow (a:Fq) (n:nat) : Fq. exists (pow a n mod q). abstract admit. Defined. - Infix "^" := pow. - - Axiom opp : Fq -> Fq. - Axiom opp_spec : forall a, opp a + a = zero. - Definition sub a b := add a (opp b). - Infix "-" := sub. - - Axiom inv : Fq -> Fq. - Axiom inv_spec : forall a, inv a * a = one. - Definition div a b := mul a (inv b). - Infix "/" := div. - - Fixpoint replicate {T} n (x:T) : list T := match n with O => nil | S n' => x::replicate n' x end. - Definition prod := fold_right mul one. - - Lemma mul_one_l : forall a, one * a = a. Admitted. - Lemma mul_one_r : forall a, a * one = a. Admitted. - - Lemma mul_cancel_l : forall a, a <> zero -> forall b c, a * b = a * c -> b = c. Admitted. - Lemma mul_cancel_r : forall a, a <> zero -> forall b c, b * a = c * c -> b = c. Admitted. - Lemma mul_cancel_l_1 : forall a, a <> zero -> forall b, a * b = a -> b = one. Admitted. - Lemma mul_cancel_r_1 : forall a, a <> zero -> forall b, b * a = a -> b = one. Admitted. - - Lemma mul_0_why : forall a b, a * b = zero -> a = zero \/ b = zero. Admitted. - - Lemma mul_assoc : forall a b c, a * (b * c) = a * b * c. Admitted. - Lemma mul_assoc_pairs' : forall a b c d, (a * b) * (c * d) = a * (c * (b * d)). Admitted. - - Lemma div_cancel : forall a, a <> zero -> forall b c, b / a = c / a -> b = c. Admitted. - Lemma div_cancel_neq : forall a, a <> zero -> forall b c, b / a <> c / a -> b <> c. Admitted. - - Lemma div_mul : forall a, a <> zero -> forall b, (a * b) / a = b. Admitted. - - Hint Resolve mul_assoc. - Hint Rewrite div_mul. - - Lemma pow_zero : forall (n:nat), zero^n = zero. Admitted. - - Lemma pow_S : forall a n, a ^ S n = a * a ^ n. Admitted. - - Lemma prod_replicate : forall a n, a ^ n = prod (replicate n a). Admitted. - - Lemma prod_perm : forall xs ys, Permutation xs ys -> prod xs = prod ys. Admitted. - - Hint Resolve pow_zero mul_one_l mul_one_r prod_replicate. - - - Definition F_eq_dec : forall (a b:Fq), {a = b} + {a <> b}. Admitted. - - Definition elements : list Fq := map natToField (seq 0 q). - Lemma elements_all : forall (a:Fq), In a elements. Admitted. - Lemma elements_unique : forall (a:Fq), NoDup elements. Admitted. - Lemma length_elements : length elements = q. Admitted. - - Definition invertibles : list Fq := map natToField (seq 1 (q-1)%nat). - Lemma invertibles_all : forall (a:Fq), a <> zero -> In a invertibles. Admitted. - Lemma invertibles_unique : NoDup invertibles. Admitted. - Lemma prod_invertibles_nonzero : prod invertibles <> zero. Admitted. - Lemma length_invertibles : length invertibles = (q-1)%nat. Admitted. - - Hint Resolve invertibles_unique. - - Section FermatsLittleTheorem. - Variable a : Fq. - Axiom a_nonzero : a <> zero. - Hint Resolve a_nonzero. - - Definition bag := map (mul a) invertibles. - Lemma bag_unique : NoDup bag. - Proof. - unfold bag; intros. - eapply all_neq_NoDup; intros. - eapply div_cancel_neq; eauto. - eapply all_neq_NoDup; eauto; - match goal with - | [H: nth_error (map _ _) ?i = Some _ |- _ ] => - destruct (nth_error_map _ _ _ _ _ _ H) as [t [HtIn HtEq]]; rewrite <- HtEq; autorewrite with core; auto - end. - Qed. - - Lemma bag_invertibles : forall b, b <> zero -> In b bag. - Proof. - unfold bag; intros. - assert (b/a <> zero) as Hdnz by admit. - replace b with (a * (b/a)) by admit. - destruct (In_nth_error_value _ _ (invertibles_all _ Hdnz)). - eauto using nth_error_value_In, map_nth_error. - Qed. - - Lemma In_bag_equiv_In_invertibles : forall b, In b bag <-> In b invertibles. - Proof. - unfold bag; intros. - case (F_eq_dec b zero); intuition; subst; - eauto using invertibles_all, bag_invertibles; - repeat progress match goal with - | [ H : In _ (map _ _) |- _ ] => rewrite in_map_iff in H; destruct H; - pose proof a_nonzero; intuition - | [ H : ?a * ?b = zero |- _ ] => destruct (mul_0_why a b H); clear H; - intuition; try solve [subst; auto] - end. - assert (In zero invertibles -> In zero (map (mul a) invertibles)) by admit; auto. - Qed. - - Lemma bag_perm_elements : Permutation bag invertibles. - Proof. - eauto using NoDup_Permutation, bag_unique, invertibles_unique, In_bag_equiv_In_invertibles. - Qed. - - Hint Resolve prod_perm bag_perm_elements. - Lemma prod_bag_ref : prod bag = prod invertibles. - Proof. - auto. - Qed. - - Lemma prod_bag_interspersed : prod (flat_map (fun b => a::b::nil) invertibles) = prod invertibles. - Proof. - intros. - rewrite <- prod_bag_ref. - unfold bag. - induction invertibles; auto; simpl. - rewrite IHl. - auto. - Qed. - - Lemma prod_bag_sorted : prod (replicate (q-1)%nat a) * prod invertibles = prod invertibles. - rewrite <- length_invertibles. - rewrite <- prod_bag_interspersed at 2. - induction invertibles; auto; simpl. - rewrite mul_assoc_pairs'; repeat f_equal; auto. - Qed. - - Theorem fermat' : a <> zero -> a^(q-1) = one. - Proof. - rewrite prod_replicate; eauto using mul_cancel_r_1, prod_bag_sorted, prod_invertibles_nonzero. - Qed. - End FermatsLittleTheorem. - - Theorem fermat (a:Fq) : a^q = a. - Proof. - case (F_eq_dec a zero); intros; subst; auto. - rewrite q_is_succ, pow_S, fermat'; auto. - Qed. -End Fq. -Arguments fermat' : default implicits. -Arguments fermat : default implicits. -Arguments elements : default implicits. -Arguments invertibles : default implicits. - -Print Assumptions fermat. -Check fermat. |