From a47b49b11d17add5ca1ea5e650d2f344219b4f7e Mon Sep 17 00:00:00 2001 From: Jason Gross Date: Fri, 5 Feb 2016 15:24:42 -0500 Subject: 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.). --- coqprime/num/Lucas.v | 213 --------------------------------------------------- 1 file changed, 213 deletions(-) delete mode 100644 coqprime/num/Lucas.v (limited to 'coqprime/num/Lucas.v') diff --git a/coqprime/num/Lucas.v b/coqprime/num/Lucas.v deleted file mode 100644 index dfd3e8142..000000000 --- a/coqprime/num/Lucas.v +++ /dev/null @@ -1,213 +0,0 @@ - -(*************************************************************) -(* This file is distributed under the terms of the *) -(* GNU Lesser General Public License Version 2.1 *) -(*************************************************************) -(* Benjamin.Gregoire@inria.fr Laurent.Thery@inria.fr *) -(*************************************************************) - -Set Implicit Arguments. - -Require Import ZArith Znumtheory Zpow_facts. -Require Import CyclicAxioms DoubleCyclic BigN Cyclic31 Int31. -Require Import ZCAux. -Require Import W. -Require Import Mod_op. -Require Import LucasLehmer. -Require Import Coqprime.Bits. -Import CyclicAxioms DoubleType DoubleBase. - -Open Scope Z_scope. - -Section test. - -Variable w: Type. -Variable w_op: ZnZ.Ops w. -Variable op_spec: ZnZ.Specs w_op. -Variable p: positive. -Variable b: w. - -Notation "[| x |]" := - (ZnZ.to_Z x) (at level 0, x at level 99). - - -Hypothesis p_more_1: 2 < Zpos p. -Hypothesis b_p: [|b|] = 2 ^ Zpos p - 1. - -Lemma b_pos: 0 < [|b|]. -rewrite b_p; auto with zarith. -assert (2 ^ 0 < 2 ^ Zpos p); auto with zarith. -apply Zpower_lt_monotone; auto with zarith. -rewrite Zpower_0_r in H; auto with zarith. -Qed. - -Hint Resolve b_pos. - -Variable m_op: mod_op w. -Variable m_op_spec: mod_spec w_op b m_op. - -Let w2 := m_op.(add_mod) ZnZ.one ZnZ.one. - -Lemma w1_b: [|ZnZ.one|] = 1 mod [|b|]. -rewrite ZnZ.spec_1; simpl; auto. -rewrite Zmod_small; auto with zarith. -split; auto with zarith. -rewrite b_p. -assert (2 ^ 1 < 2 ^ Zpos p); auto with zarith. -apply Zpower_lt_monotone; auto with zarith. -rewrite Zpower_1_r in H; auto with zarith. -Qed. - -Lemma w2_b: [|w2|] = 2 mod [|b|]. -unfold w2; rewrite (add_mod_spec m_op_spec _ _ _ _ w1_b w1_b). -rewrite w1_b; rewrite <- Zplus_mod; auto with zarith. -Qed. - -Let w4 := m_op.(add_mod) w2 w2. - -Lemma w4_b: [|w4|] = 4 mod [|b|]. -unfold w4; rewrite (add_mod_spec m_op_spec _ _ _ _ w2_b w2_b). -rewrite w2_b; rewrite <- Zplus_mod; auto with zarith. -Qed. - -Let square_m2 := - let square := m_op.(square_mod) in - let sub := m_op.(sub_mod) in - fun x => sub (square x) w2. - -Definition lucastest := - ZnZ.to_Z (iter_pos (Pminus p 2) _ square_m2 w4). - -Theorem lucastest_aux_correct: - forall p1 z n, 0 <= n -> [|z|] = fst (s n) mod (2 ^ Zpos p - 1) -> - [|iter_pos p1 _ square_m2 z|] = fst (s (n + Zpos p1)) mod (2 ^ Zpos p - 1). -intros p1; pattern p1; apply Pind; simpl iter_pos; simpl s; clear p1. -intros z p1 Hp1 H. -unfold square_m2. -rewrite <- b_p in H. -generalize (square_mod_spec m_op_spec _ _ H); intros H1. -rewrite (sub_mod_spec m_op_spec _ _ _ _ H1 w2_b). -rewrite H1; rewrite w2_b; auto with zarith. -rewrite H; rewrite <- Zmult_mod; auto with zarith. -rewrite <- Zminus_mod; auto with zarith. -rewrite sn; simpl; auto with zarith. -rewrite b_p; auto. -intros p1 Rec w1 z Hz Hw1. -rewrite Pplus_one_succ_l; rewrite iter_pos_plus; - simpl iter_pos. -match goal with |- context[square_m2 ?X] => - set (tmp := X); unfold square_m2; unfold tmp; clear tmp -end. -generalize (Rec _ _ Hz Hw1); intros H1. -rewrite <- b_p in H1. -generalize (square_mod_spec m_op_spec _ _ H1); intros H2. -rewrite (sub_mod_spec m_op_spec _ _ _ _ H2 w2_b). -rewrite H2; rewrite w2_b; auto with zarith. -rewrite H1; rewrite <- Zmult_mod; auto with zarith. -rewrite <- Zminus_mod; auto with zarith. -replace (z + Zpos (1 + p1)) with ((z + Zpos p1) + 1); auto with zarith. -rewrite sn; simpl fst; try rewrite b_p; auto with zarith. -rewrite Zpos_plus_distr; auto with zarith. -Qed. - -Theorem lucastest_prop: lucastest = fst(s (Zpos p -2)) mod (2 ^ Zpos p - 1). -unfold lucastest. -assert (F: 0 <= 0); auto with zarith. -generalize (lucastest_aux_correct (p -2) w4 F); simpl Zplus; - rewrite Zpos_minus; auto with zarith. -rewrite Zmax_right; auto with zarith. -intros tmp; apply tmp; clear tmp. -rewrite <- b_p; simpl; exact w4_b. -Qed. - -Theorem lucastest_prop_cor: lucastest = 0 -> (2 ^ Zpos p - 1 | fst(s (Zpos p - 2)))%Z. -intros H. -apply Zmod_divide. -assert (H1: 2 ^ 1 < 2 ^ Zpos p); auto with zarith. -apply Zpower_lt_monotone; auto with zarith. -rewrite Zpower_1_r in H1; auto with zarith. -apply trans_equal with (2:= H); apply sym_equal; apply lucastest_prop; auto. -Qed. - -Theorem lucastest_prime: lucastest = 0 -> prime (2 ^ Zpos p - 1). -intros H1; case (prime_dec (2 ^ Zpos p - 1)); auto; intros H2. -case Zdivide_div_prime_le_square with (2 := H2). -assert (H3: 2 ^ 1 < 2 ^ Zpos p); auto with zarith. -apply Zpower_lt_monotone; auto with zarith. -rewrite Zpower_1_r in H3; auto with zarith. -intros q (H3, (H4, H5)). -contradict H5; apply Zlt_not_le. -generalize q_more_than_square; unfold Mp; intros tmp; apply tmp; - auto; clear tmp. -apply lucastest_prop_cor; auto. -case (Zle_lt_or_eq 2 q); auto. -apply prime_ge_2; auto. -intros H5; subst. -absurd (2 <= 1); auto with arith. -apply Zdivide_le; auto with zarith. -case H4; intros x Hx. -exists (2 ^ (Zpos p -1) - x). -rewrite Zmult_minus_distr_r; rewrite <- Hx; unfold Mp. -pattern 2 at 2; rewrite <- Zpower_1_r; rewrite <- Zpower_exp; auto with zarith. -replace (Zpos p - 1 + 1) with (Zpos p); auto with zarith. -Qed. - -End test. - -Definition znz_of_Z (w: Type) (op: ZnZ.Ops w) z := - match z with - | Zpos p => snd (ZnZ.of_pos p) - | _ => ZnZ.zero - end. - -Definition lucas p := - let op := cmk_op (Peano.pred (nat_of_P (get_height 31 p))) in - let b := znz_of_Z op (Zpower 2 (Zpos p) - 1) in - let zp := znz_of_Z op (Zpos p) in - let mod_op := mmake_mod_op op b zp in - lucastest op p mod_op. - -Theorem lucas_prime: - forall p, 2 < Zpos p -> lucas p = 0 -> prime (2 ^ Zpos p - 1). -unfold lucas; intros p Hp H. -match type of H with lucastest (cmk_op ?x) ?y ?z = _ => - set (w_op := (cmk_op x)); assert(A1: ZnZ.Specs w_op) -end. -unfold w_op; apply cmk_spec. -assert (F0: Zpos p <= Zpos (ZnZ.digits w_op)). -unfold w_op, base; rewrite (cmk_op_digits (Peano.pred (nat_of_P (get_height 31 p)))). -generalize (get_height_correct 31 p). -replace (Z_of_nat (Peano.pred (nat_of_P (get_height 31 p)))) with - ((Zpos (get_height 31 p) - 1) ); auto with zarith. -rewrite pred_of_minus; rewrite inj_minus1; auto with zarith. -rewrite <- Zpos_eq_Z_of_nat_o_nat_of_P; auto with zarith. -generalize (lt_O_nat_of_P (get_height 31 p)); auto with zarith. -assert (F1: ZnZ.to_Z (znz_of_Z w_op (2 ^ (Zpos p) - 1)) = 2 ^ (Zpos p) - 1). -assert (F1: 0 < 2 ^ (Zpos p) - 1). -assert (F2: 2 ^ 0 < 2 ^ (Zpos p)); auto with zarith. -apply Zpower_lt_monotone; auto with zarith. -rewrite Zpower_0_r in F2; auto with zarith. -case_eq (2 ^ (Zpos p) - 1); simpl ZnZ.to_Z. -intros HH; contradict F1; rewrite HH; auto with zarith. -2: intros p1 HH; contradict F1; rewrite HH; - apply Zle_not_lt; red; simpl; intros; discriminate. -intros p1 Hp1; apply ZnZ.of_pos_correct; auto. -rewrite <- Hp1. -unfold base. -apply Zlt_le_trans with (2 ^ (Zpos p)); auto with zarith. -apply Zpower_le_monotone; auto with zarith. -match type of H with lucastest (cmk_op ?x) ?y ?z = _ => - apply - (@lucastest_prime _ _ (cmk_spec x) p (znz_of_Z w_op (2 ^ Zpos p -1)) Hp F1 z) -end; auto with zarith; fold w_op. -eapply mmake_mod_spec with (p := p); auto with zarith. -unfold znz_of_Z; unfold znz_of_Z in F1; rewrite F1. -assert (F2: 2 ^ 1 < 2 ^ (Zpos p)); auto with zarith. -apply Zpower_lt_monotone; auto with zarith. -rewrite Zpower_1_r in F2; auto with zarith. -rewrite ZnZ.of_Z_correct; auto with zarith. -split; auto with zarith. -apply Zle_lt_trans with (1 := F0); auto with zarith. -unfold base; apply Zpower2_lt_lin; auto with zarith. -Qed. - -- cgit v1.2.3