diff options
Diffstat (limited to 'theories')
-rw-r--r-- | theories/Numbers/Cyclic/Int31/Cyclic31.v | 514 |
1 files changed, 265 insertions, 249 deletions
diff --git a/theories/Numbers/Cyclic/Int31/Cyclic31.v b/theories/Numbers/Cyclic/Int31/Cyclic31.v index 044883ec6..d327e13b3 100644 --- a/theories/Numbers/Cyclic/Int31/Cyclic31.v +++ b/theories/Numbers/Cyclic/Int31/Cyclic31.v @@ -1136,7 +1136,7 @@ Let w_iszero i := match i ?= 0 with Eq => true | _ => false end. (** Modulo [2^p] *) Let w_pos_mod p i := - match compare31 p 32 with + match compare31 p 31 with | Lt => addmuldiv31 p 0 (addmuldiv31 (31-p) i 0) | _ => i end. @@ -1227,9 +1227,7 @@ Section Int31_Spec. Notation "[|| x ||]" := (zn2z_to_Z wB phi x) (at level 0, x at level 99). - Definition spec_to_Z := phi_bounded. - - Lemma spec_zdigits : [| 31%int31 |] = 31. + Lemma spec_zdigits : [| 31 |] = 31. Proof. reflexivity. Qed. @@ -1239,23 +1237,23 @@ Section Int31_Spec. auto with zarith. Qed. - Lemma spec_0 : [|0%int31|] = 0. + Lemma spec_0 : [| 0 |] = 0. Proof. reflexivity. Qed. - Lemma spec_1 : [|1%int31|] = 1. + Lemma spec_1 : [| 1 |] = 1. Proof. reflexivity. Qed. - Lemma spec_Bm1 : [|Tn|] = wB - 1. + Lemma spec_Bm1 : [| Tn |] = wB - 1. Proof. reflexivity. Qed. Lemma spec_compare : forall x y, - match compare31 x y with + match (x ?= y)%int31 with | Eq => [|x|] = [|y|] | Lt => [|x|] < [|y|] | Gt => [|x|] > [|y|] @@ -1266,65 +1264,12 @@ Section Int31_Spec. intros; apply Zcompare_Eq_eq; auto. Qed. - Let w_eq0 := int31_op.(znz_eq0). - - Lemma spec_eq0 : forall x, w_eq0 x = true -> [|x|] = 0. - Proof. - clear; unfold w_eq0, znz_eq0; simpl. - unfold compare31; simpl; intros. - change [|0|] with 0 in H. - apply Zcompare_Eq_eq. - now destruct ([|x|] ?= 0). - Qed. - - Let wWW := int31_op.(znz_WW). - Let w0W := int31_op.(znz_0W). - Let wW0 := int31_op.(znz_W0). - - Lemma spec_WW : forall h l, [||wWW h l||] = [|h|] * wB + [|l|]. - Proof. - clear; unfold wWW; simpl; intros. - unfold compare31 in *. - change [|0|] with 0. - case_eq ([|h|] ?= 0); simpl; auto. - case_eq ([|l|] ?= 0); simpl; auto. - intros. - rewrite (Zcompare_Eq_eq _ _ H); simpl. - rewrite (Zcompare_Eq_eq _ _ H0); simpl; auto. - Qed. - - Lemma spec_0W : forall l, [||w0W l||] = [|l|]. - Proof. - clear; unfold w0W; simpl; intros. - unfold compare31 in *. - change [|0|] with 0. - case_eq ([|l|] ?= 0); simpl; auto. - intros; symmetry; apply Zcompare_Eq_eq; auto. - Qed. - - Lemma spec_W0 : forall h, [||wW0 h||] = [|h|]*wB. - Proof. - clear; unfold wW0; simpl; intros. - unfold compare31 in *. - change [|0|] with 0. - case_eq ([|h|] ?= 0); simpl; auto with zarith. - intro H; rewrite (Zcompare_Eq_eq _ _ H); auto. - Qed. - (** Addition *) - Let w_add_c := int31_op.(znz_add_c). - Let w_add_carry_c := int31_op.(znz_add_carry_c). - Let w_add := int31_op.(znz_add). - Let w_add_carry := int31_op.(znz_add_carry). - Let w_succ := int31_op.(znz_succ). - Let w_succ_c := int31_op.(znz_succ_c). - - Lemma spec_add_c : forall x y, [+|w_add_c x y|] = [|x|] + [|y|]. + Lemma spec_add_c : forall x y, [+|add31c x y|] = [|x|] + [|y|]. Proof. - clear; unfold w_add_c, znz_add_c; simpl; intros. - unfold add31c, add31, interp_carry; rewrite phi_phi_inv. - generalize (spec_to_Z x)(spec_to_Z y); intros. + intros; unfold add31c, add31, interp_carry; rewrite phi_phi_inv. + generalize (phi_bounded x)(phi_bounded y); intros. set (X:=[|x|]) in *; set (Y:=[|y|]) in *; clearbody X Y. assert ((X+Y) mod wB ?= X+Y <> Eq -> [+|C1 (phi_inv (X+Y))|] = X+Y). @@ -1332,24 +1277,23 @@ Section Int31_Spec. destruct (Z_lt_le_dec (X+Y) wB). contradict H1; auto using Zmod_small with zarith. rewrite <- (Z_mod_plus_full (X+Y) (-1) wB). - rewrite Zmod_small; romega. (* omega : BUG !! (peut-etre a cause du clear) *) + rewrite Zmod_small; romega. generalize (Zcompare_Eq_eq ((X+Y) mod wB) (X+Y)); intros Heq. destruct Zcompare; intros; [ rewrite phi_phi_inv; auto | now apply H1 | now apply H1]. Qed. - Lemma spec_succ_c : forall x, [+|w_succ_c x|] = [|x|] + 1. + Lemma spec_succ_c : forall x, [+|add31c x 1|] = [|x|] + 1. Proof. - clear - w_add_c; unfold w_succ_c, znz_succ_c; simpl; intros. - apply spec_add_c. (* erreur gore si clear trop violent *) + intros; apply spec_add_c. Qed. - Lemma spec_add_carry_c : forall x y, [+|w_add_carry_c x y|] = [|x|] + [|y|] + 1. + Lemma spec_add_carry_c : forall x y, [+|add31carryc x y|] = [|x|] + [|y|] + 1. Proof. - clear; unfold w_add_carry_c, znz_add_carry_c, int31_op; intros. + intros. unfold add31carryc, interp_carry; rewrite phi_phi_inv. - generalize (spec_to_Z x)(spec_to_Z y); intros. + generalize (phi_bounded x)(phi_bounded y); intros. set (X:=[|x|]) in *; set (Y:=[|y|]) in *; clearbody X Y. assert ((X+Y+1) mod wB ?= X+Y+1 <> Eq -> [+|C1 (phi_inv (X+Y+1))|] = X+Y+1). @@ -1364,45 +1308,31 @@ Section Int31_Spec. [ rewrite phi_phi_inv; auto | now apply H1 | now apply H1]. Qed. - Lemma spec_add : forall x y, [|w_add x y|] = ([|x|] + [|y|]) mod wB. + Lemma spec_add : forall x y, [|x+y|] = ([|x|] + [|y|]) mod wB. Proof. - clear; unfold w_add; simpl; intros. - apply phi_phi_inv. + intros; apply phi_phi_inv. Qed. Lemma spec_add_carry : - forall x y, [|w_add_carry x y|] = ([|x|] + [|y|] + 1) mod wB. + forall x y, [|x+y+1|] = ([|x|] + [|y|] + 1) mod wB. Proof. - clear; unfold w_add_carry, znz_add_carry, int31_op, add31; intros. + unfold add31; intros. repeat rewrite phi_phi_inv. apply Zplus_mod_idemp_l. Qed. - Lemma spec_succ : forall x, [|w_succ x|] = ([|x|] + 1) mod wB. + Lemma spec_succ : forall x, [|x+1|] = ([|x|] + 1) mod wB. Proof. - clear - w_add; unfold w_succ, znz_succ, int31_op; intros. - change 1 with [|1|]. - apply spec_add. + intros; rewrite <- spec_1; apply spec_add. Qed. (** Substraction *) - Let w_sub_c := int31_op.(znz_sub_c). - Let w_sub_carry_c := int31_op.(znz_sub_carry_c). - Let w_sub := int31_op.(znz_sub). - Let w_sub_carry := int31_op.(znz_sub_carry). - Let w_pred_c := int31_op.(znz_pred_c). - Let w_pred := int31_op.(znz_pred). - Let w_opp_c := int31_op.(znz_opp_c). - Let w_opp := int31_op.(znz_opp). - Let w_opp_carry := int31_op.(znz_opp_carry). - - Lemma spec_sub_c : forall x y, [-|w_sub_c x y|] = [|x|] - [|y|]. + Lemma spec_sub_c : forall x y, [-|sub31c x y|] = [|x|] - [|y|]. Proof. - clear; unfold w_sub_c; simpl; intros. unfold sub31c, sub31, interp_carry; intros. rewrite phi_phi_inv. - generalize (spec_to_Z x)(spec_to_Z y); intros. + generalize (phi_bounded x)(phi_bounded y); intros. set (X:=[|x|]) in *; set (Y:=[|y|]) in *; clearbody X Y. assert ((X-Y) mod wB ?= X-Y <> Eq -> [-|C1 (phi_inv (X-Y))|] = X-Y). @@ -1417,12 +1347,11 @@ Section Int31_Spec. [ rewrite phi_phi_inv; auto | now apply H1 | now apply H1]. Qed. - Lemma spec_sub_carry_c : forall x y, [-|w_sub_carry_c x y|] = [|x|] - [|y|] - 1. + Lemma spec_sub_carry_c : forall x y, [-|sub31carryc x y|] = [|x|] - [|y|] - 1. Proof. - clear; unfold w_sub_carry_c; simpl; intros. unfold sub31carryc, sub31, interp_carry; intros. rewrite phi_phi_inv. - generalize (spec_to_Z x)(spec_to_Z y); intros. + generalize (phi_bounded x)(phi_bounded y); intros. set (X:=[|x|]) in *; set (Y:=[|y|]) in *; clearbody X Y. assert ((X-Y-1) mod wB ?= X-Y-1 <> Eq -> [-|C1 (phi_inv (X-Y-1))|] = X-Y-1). @@ -1437,62 +1366,51 @@ Section Int31_Spec. [ rewrite phi_phi_inv; auto | now apply H1 | now apply H1]. Qed. - Lemma spec_sub : forall x y, [|w_sub x y|] = ([|x|] - [|y|]) mod wB. + Lemma spec_sub : forall x y, [|x-y|] = ([|x|] - [|y|]) mod wB. Proof. - clear; unfold w_sub; simpl; intros. - apply phi_phi_inv. + intros; apply phi_phi_inv. Qed. Lemma spec_sub_carry : - forall x y, [|w_sub_carry x y|] = ([|x|] - [|y|] - 1) mod wB. + forall x y, [|x-y-1|] = ([|x|] - [|y|] - 1) mod wB. Proof. - clear; unfold w_sub_carry; simpl; intros. - unfold sub31. + unfold sub31; intros. repeat rewrite phi_phi_inv. apply Zminus_mod_idemp_l. Qed. - Lemma spec_opp_c : forall x, [-|w_opp_c x|] = -[|x|]. + Lemma spec_opp_c : forall x, [-|sub31c 0 x|] = -[|x|]. Proof. - clear - w_sub_c; unfold w_opp_c; simpl; intros. - apply spec_sub_c. + intros; apply spec_sub_c. Qed. - Lemma spec_opp : forall x, [|w_opp x|] = (-[|x|]) mod wB. + Lemma spec_opp : forall x, [|0 - x|] = (-[|x|]) mod wB. Proof. - clear; unfold w_opp; simpl; intros. - apply phi_phi_inv. + intros; apply phi_phi_inv. Qed. - Lemma spec_opp_carry : forall x, [|w_opp_carry x|] = wB - [|x|] - 1. + Lemma spec_opp_carry : forall x, [|0 - x - 1|] = wB - [|x|] - 1. Proof. - clear; unfold w_opp_carry, znz_opp_carry, int31_op; intros. - unfold sub31. + unfold sub31; intros. repeat rewrite phi_phi_inv. change [|1|] with 1; change [|0|] with 0. rewrite <- (Z_mod_plus_full (0-[|x|]) 1 wB). rewrite Zminus_mod_idemp_l. - rewrite Zmod_small; generalize (spec_to_Z x); romega. + rewrite Zmod_small; generalize (phi_bounded x); romega. Qed. - Lemma spec_pred_c : forall x, [-|w_pred_c x|] = [|x|] - 1. + Lemma spec_pred_c : forall x, [-|sub31c x 1|] = [|x|] - 1. Proof. - clear -w_sub_c; unfold w_pred_c; simpl; intros. - apply spec_sub_c. + intros; apply spec_sub_c. Qed. - Lemma spec_pred : forall x, [|w_pred x|] = ([|x|] - 1) mod wB. + Lemma spec_pred : forall x, [|x-1|] = ([|x|] - 1) mod wB. Proof. - clear -w_sub; unfold w_pred; simpl; intros. - apply spec_sub. + intros; apply spec_sub. Qed. (** Multiplication *) - Let w_mul_c := int31_op.(znz_mul_c). - Let w_mul := int31_op.(znz_mul). - Let w_square_c := int31_op.(znz_square_c). - Lemma phi2_phi_inv2 : forall x, [||phi_inv2 x||] = x mod (wB^2). Proof. assert (forall z, (z / wB) mod wB * wB + z mod wB = z mod wB ^ 2). @@ -1513,54 +1431,37 @@ Section Int31_Spec. change base with wB; auto. Qed. - Lemma spec_mul_c : forall x y, [|| w_mul_c x y ||] = [|x|] * [|y|]. + Lemma spec_mul_c : forall x y, [|| mul31c x y ||] = [|x|] * [|y|]. Proof. - clear; unfold w_mul_c; simpl; intros. - unfold mul31c. + unfold mul31c; intros. rewrite phi2_phi_inv2. apply Zmod_small. - generalize (spec_to_Z x)(spec_to_Z y); intros. + generalize (phi_bounded x)(phi_bounded y); intros. change (wB^2) with (wB * wB). auto using Zmult_lt_compat with zarith. Qed. - Lemma spec_mul : forall x y, [|w_mul x y|] = ([|x|] * [|y|]) mod wB. + Lemma spec_mul : forall x y, [|x*y|] = ([|x|] * [|y|]) mod wB. Proof. - clear; unfold w_mul; simpl; intros. - apply phi_phi_inv. + intros; apply phi_phi_inv. Qed. - Lemma spec_square_c : forall x, [|| w_square_c x||] = [|x|] * [|x|]. + Lemma spec_square_c : forall x, [|| mul31c x x ||] = [|x|] * [|x|]. Proof. - clear -w_mul_c; unfold w_square_c; simpl; intros. - apply spec_mul_c. + intros; apply spec_mul_c. Qed. (** Division *) - Let w_div21 := int31_op.(znz_div21). - Let w_div_gt := int31_op.(znz_div_gt). - Let w_div := int31_op.(znz_div). - - Let w_mod_gt := int31_op.(znz_mod_gt). - Let w_mod := int31_op.(znz_mod). - Let w_gcd_gt := int31_op.(znz_gcd_gt). - Let w_gcd := int31_op.(znz_gcd). - - Let w_add_mul_div := int31_op.(znz_add_mul_div). - - Let w_pos_mod := int31_op.(znz_pos_mod). - Lemma spec_div21 : forall a1 a2 b, wB/2 <= [|b|] -> [|a1|] < [|b|] -> - let (q,r) := w_div21 a1 a2 b in + let (q,r) := div3121 a1 a2 b in [|a1|] *wB+ [|a2|] = [|q|] * [|b|] + [|r|] /\ 0 <= [|r|] < [|b|]. Proof. - unfold w_div21, znz_div21; simpl; unfold div3121. - intros. - generalize (spec_to_Z a1)(spec_to_Z a2)(spec_to_Z b); intros. + unfold div3121; intros. + generalize (phi_bounded a1)(phi_bounded a2)(phi_bounded b); intros. assert ([|b|]>0) by (auto with zarith). generalize (Z_div_mod (phi2 a1 a2) [|b|] H4) (Z_div_pos (phi2 a1 a2) [|b|] H4). unfold Zdiv; destruct (Zdiv_eucl (phi2 a1 a2) [|b|]); simpl. @@ -1589,19 +1490,18 @@ Section Int31_Spec. Qed. Lemma spec_div : forall a b, 0 < [|b|] -> - let (q,r) := w_div a b in + let (q,r) := div31 a b in [|a|] = [|q|] * [|b|] + [|r|] /\ 0 <= [|r|] < [|b|]. Proof. - intros. - unfold w_div, znz_div; simpl; unfold div31. + unfold div31; intros. assert ([|b|]>0) by (auto with zarith). generalize (Z_div_mod [|a|] [|b|] H0) (Z_div_pos [|a|] [|b|] H0). unfold Zdiv; destruct (Zdiv_eucl [|a|] [|b|]); simpl. rewrite ?phi_phi_inv. destruct 1; intros. rewrite H1, Zmult_comm. - generalize (spec_to_Z a)(spec_to_Z b); intros. + generalize (phi_bounded a)(phi_bounded b); intros. replace (z0 mod wB) with z0 by (symmetry; apply Zmod_small; omega). replace (z mod wB) with z; auto with zarith. symmetry; apply Zmod_small. @@ -1612,61 +1512,118 @@ Section Int31_Spec. rewrite <- (Zmult_1_l z) at 1. apply Zmult_le_compat; auto with zarith. Qed. - Lemma spec_div_gt : forall a b, [|a|] > [|b|] -> 0 < [|b|] -> - let (q,r) := w_div_gt a b in - [|a|] = [|q|] * [|b|] + [|r|] /\ - 0 <= [|r|] < [|b|]. - Proof. - intros; apply spec_div; auto. - Qed. Lemma spec_mod : forall a b, 0 < [|b|] -> - [|w_mod a b|] = [|a|] mod [|b|]. + [|let (_,r) := (a/b)%int31 in r|] = [|a|] mod [|b|]. Proof. - intros. - unfold w_mod, znz_mod; simpl; unfold div31. + unfold div31; intros. assert ([|b|]>0) by (auto with zarith). unfold Zmod. generalize (Z_div_mod [|a|] [|b|] H0). destruct (Zdiv_eucl [|a|] [|b|]); simpl. rewrite ?phi_phi_inv. destruct 1; intros. - generalize (spec_to_Z b); intros. + generalize (phi_bounded b); intros. apply Zmod_small; omega. Qed. - Lemma spec_mod_gt : forall a b, [|a|] > [|b|] -> 0 < [|b|] -> - [|w_mod_gt a b|] = [|a|] mod [|b|]. - Proof. - intros; apply spec_mod; auto. - Qed. - Lemma spec_gcd : forall a b, Zis_gcd [|a|] [|b|] [|w_gcd a b|]. + Lemma spec_gcd : forall a b, Zis_gcd [|a|] [|b|] [|gcd31 a b|]. Proof. Admitted. (* TODO !! *) Opaque gcd31. - Lemma spec_gcd_gt : forall a b, [|a|] > [|b|] -> - Zis_gcd [|a|] [|b|] [|w_gcd_gt a b|]. - Proof. - intros; apply spec_gcd; auto. + + Lemma Zmod_eq_full : forall a b, b<>0 -> + a mod b = a - (a/b)*b. + Proof. + intros. + rewrite <- Zeq_plus_swap, Zplus_comm, Zmult_comm; symmetry. + apply Z_div_mod_eq_full; auto. + Qed. + + Lemma Zmod_eq : forall a b, b>0 -> + a mod b = a - (a/b)*b. + Proof. + intros. + rewrite <- Zeq_plus_swap, Zplus_comm, Zmult_comm; symmetry. + apply Z_div_mod_eq; auto. + Qed. + + Lemma shift_unshift_mod_2 : forall n p a, (0<=p<=n)%Z -> + ((a * 2 ^ (n - p)) mod (2^n) / 2 ^ (n - p)) mod (2^n) = + a mod 2 ^ p. + Proof. + intros. + rewrite Zmod_small. + rewrite Zmod_eq by (auto with zarith). + unfold Zminus at 1. + rewrite BigNumPrelude.Z_div_plus_l by (auto with zarith). + assert (2^n = 2^(n-p)*2^p). + rewrite <- Zpower_exp by (auto with zarith). + replace (n-p+p) with n; auto with zarith. + rewrite H0. + rewrite <- Zdiv_Zdiv, Z_div_mult by (auto with zarith). + rewrite (Zmult_comm (2^(n-p))), Zmult_assoc. + rewrite Zopp_mult_distr_l. + rewrite Z_div_mult by (auto with zarith). + symmetry; apply Zmod_eq; auto with zarith. + + remember (a * 2 ^ (n - p)) as b. + destruct (Z_mod_lt b (2^n)); auto with zarith. + split. + apply Z_div_pos; auto with zarith. + apply Zdiv_lt_upper_bound; auto with zarith. + apply Zlt_le_trans with (2^n); auto with zarith. + rewrite <- (Zmult_1_r (2^n)) at 1. + apply Zmult_le_compat; auto with zarith. + cut (0 < 2 ^ (n-p)); auto with zarith. Qed. Lemma spec_add_mul_div : forall x y p, [|p|] <= Zpos 31 -> - [| w_add_mul_div p x y |] = + [| addmuldiv31 p x y |] = ([|x|] * (2 ^ [|p|]) + [|y|] / (2 ^ ((Zpos 31) - [|p|]))) mod wB. Admitted. (* TODO !! *) + + Let w_pos_mod := int31_op.(znz_pos_mod). + Lemma spec_pos_mod : forall w p, [|w_pos_mod p w|] = [|w|] mod (2 ^ [|p|]). - Admitted. (* TODO !! *) + Proof. + unfold w_pos_mod, znz_pos_mod, int31_op, compare31. + change [|31|] with 31%Z. + assert (forall w p, 31<=p -> [|w|] = [|w|] mod 2^p). + intros. + generalize (phi_bounded w). + symmetry; apply Zmod_small. + split; auto with zarith. + apply Zlt_le_trans with wB; auto with zarith. + apply Zpow_facts.Zpower_le_monotone; auto with zarith. + intros. + case_eq ([|p|] ?= 31); intros; + [ apply H; rewrite (Zcompare_Eq_eq _ _ H0); auto with zarith | | + apply H; change ([|p|]>31)%Z in H0; auto with zarith ]. + change ([|p|]<31) in H0. + rewrite spec_add_mul_div by auto with zarith. + change [|0|] with 0%Z; rewrite Zmult_0_l, Zplus_0_l. + generalize (phi_bounded p)(phi_bounded w); intros. + assert (31-[|p|]<wB). + apply Zle_lt_trans with 31%Z; auto with zarith. + compute; auto. + assert ([|31-p|]=31-[|p|]). + unfold sub31; rewrite phi_phi_inv. + change [|31|] with 31%Z. + apply Zmod_small; auto with zarith. + rewrite spec_add_mul_div by (rewrite H4; auto with zarith). + change [|0|] with 0%Z; rewrite Zdiv_0_l, Zplus_0_r. + rewrite H4. + apply shift_unshift_mod_2; auto with zarith. + Qed. - (** Shift operations *) - Let w_head0 := int31_op.(znz_head0). - Let w_tail0 := int31_op.(znz_tail0). - + (** Shift operations *) - Lemma spec_head00: forall x, [|x|] = 0 -> [|w_head0 x|] = Zpos 31. + Lemma spec_head00: forall x, [|x|] = 0 -> [|head031 x|] = Zpos 31. Proof. intros. generalize (phi_inv_phi x). @@ -1675,9 +1632,9 @@ Section Int31_Spec. simpl; auto. Qed. Lemma spec_head0 : forall x, 0 < [|x|] -> - wB/ 2 <= 2 ^ ([|w_head0 x|]) * [|x|] < wB. + wB/ 2 <= 2 ^ ([|head031 x|]) * [|x|] < wB. Admitted. (* TODO !! *) - Lemma spec_tail00: forall x, [|x|] = 0 -> [|w_tail0 x|] = Zpos 31. + Lemma spec_tail00: forall x, [|x|] = 0 -> [|tail031 x|] = Zpos 31. Proof. intros. generalize (phi_inv_phi x). @@ -1686,23 +1643,69 @@ Section Int31_Spec. simpl; auto. Qed. Lemma spec_tail0 : forall x, 0 < [|x|] -> - exists y, 0 <= y /\ [|x|] = (2 * y + 1) * (2 ^ [|w_tail0 x|]). + exists y, 0 <= y /\ [|x|] = (2 * y + 1) * (2 ^ [|tail031 x|]). Admitted. (* TODO !! *) (* Sqrt *) - Let w_sqrt2 := int31_op.(znz_sqrt2). - Let w_sqrt := int31_op.(znz_sqrt). - Lemma spec_sqrt2 : forall x y, wB/ 4 <= [|x|] -> - let (s,r) := w_sqrt2 x y in + let (s,r) := sqrt312 x y in [||WW x y||] = [|s|] ^ 2 + [+|r|] /\ [+|r|] <= 2 * [|s|]. Admitted. (* TODO !! *) Lemma spec_sqrt : forall x, - [|w_sqrt x|] ^ 2 <= [|x|] < ([|w_sqrt x|] + 1) ^ 2. + [|sqrt31 x|] ^ 2 <= [|x|] < ([|sqrt31 x|] + 1) ^ 2. Admitted. (* TODO !! *) + + (** [iszero] *) + + Let w_eq0 := int31_op.(znz_eq0). + + Lemma spec_eq0 : forall x, w_eq0 x = true -> [|x|] = 0. + Proof. + clear; unfold w_eq0, znz_eq0; simpl. + unfold compare31; simpl; intros. + change [|0|] with 0 in H. + apply Zcompare_Eq_eq. + now destruct ([|x|] ?= 0). + Qed. + + (** [WW] and variants *) + + Let wWW := int31_op.(znz_WW). + Let w0W := int31_op.(znz_0W). + Let wW0 := int31_op.(znz_W0). + + Lemma spec_WW : forall h l, [||wWW h l||] = [|h|] * wB + [|l|]. + Proof. + clear; unfold wWW; simpl; intros. + unfold compare31 in *. + change [|0|] with 0. + case_eq ([|h|] ?= 0); simpl; auto. + case_eq ([|l|] ?= 0); simpl; auto. + intros. + rewrite (Zcompare_Eq_eq _ _ H); simpl. + rewrite (Zcompare_Eq_eq _ _ H0); simpl; auto. + Qed. + + Lemma spec_0W : forall l, [||w0W l||] = [|l|]. + Proof. + clear; unfold w0W; simpl; intros. + unfold compare31 in *. + change [|0|] with 0. + case_eq ([|l|] ?= 0); simpl; auto. + intros; symmetry; apply Zcompare_Eq_eq; auto. + Qed. + + Lemma spec_W0 : forall h, [||wW0 h||] = [|h|]*wB. + Proof. + clear; unfold wW0; simpl; intros. + unfold compare31 in *. + change [|0|] with 0. + case_eq ([|h|] ?= 0); simpl; auto with zarith. + intro H; rewrite (Zcompare_Eq_eq _ _ H); auto. + Qed. (* Even *) @@ -1711,8 +1714,21 @@ Section Int31_Spec. Lemma spec_is_even : forall x, if w_is_even x then [|x|] mod 2 = 0 else [|x|] mod 2 = 1. Proof. - clear; unfold w_is_even; simpl; intros. - Admitted. (* TODO !! *) + unfold w_is_even; simpl; intros. + generalize (spec_div x 2). + destruct (x/2)%int31 as (q,r); intros. + unfold compare31. + change [|2|] with 2 in H. + change [|0|] with 0. + destruct H; auto with zarith. + replace ([|x|] mod 2) with [|r|]. + destruct H; auto with zarith. + case_eq ([|r|] ?= 0)%Z; intros. + apply Zcompare_Eq_eq; auto. + change ([|r|] < 0)%Z in H; auto with zarith. + change ([|r|] > 0)%Z in H; auto with zarith. + apply Zmod_unique with [|q|]; auto with zarith. + Qed. (* The following definition is verrry slooow without the two Opaque (??) *) @@ -1721,64 +1737,64 @@ Section Int31_Spec. Definition int31_spec : znz_spec int31_op. split. - exact spec_to_Z. - exact positive_to_int31_spec. - exact spec_zdigits. - exact spec_more_than_1_digit. - - exact spec_0. - exact spec_1. - exact spec_Bm1. - exact spec_WW. - exact spec_0W. - exact spec_W0. - - exact spec_compare. - exact spec_eq0. - - exact spec_opp_c. - exact spec_opp. - exact spec_opp_carry. - - exact spec_succ_c. - exact spec_add_c. - exact spec_add_carry_c. - exact spec_succ. - exact spec_add. - exact spec_add_carry. - - exact spec_pred_c. - exact spec_sub_c. - exact spec_sub_carry_c. - exact spec_pred. - exact spec_sub. - exact spec_sub_carry. - - exact spec_mul_c. - exact spec_mul. - exact spec_square_c. - - exact spec_div21. - exact spec_div_gt. - exact spec_div. - - exact spec_mod_gt. - exact spec_mod. - - exact spec_gcd_gt. - exact spec_gcd. - - exact spec_head00. - exact spec_head0. - exact spec_tail00. - exact spec_tail0. - - exact spec_add_mul_div. - exact spec_pos_mod. - - exact spec_is_even. - exact spec_sqrt2. - exact spec_sqrt. + exact phi_bounded. + exact positive_to_int31_spec. + exact spec_zdigits. + exact spec_more_than_1_digit. + + exact spec_0. + exact spec_1. + exact spec_Bm1. + exact spec_WW. + exact spec_0W. + exact spec_W0. + + exact spec_compare. + exact spec_eq0. + + exact spec_opp_c. + exact spec_opp. + exact spec_opp_carry. + + exact spec_succ_c. + exact spec_add_c. + exact spec_add_carry_c. + exact spec_succ. + exact spec_add. + exact spec_add_carry. + + exact spec_pred_c. + exact spec_sub_c. + exact spec_sub_carry_c. + exact spec_pred. + exact spec_sub. + exact spec_sub_carry. + + exact spec_mul_c. + exact spec_mul. + exact spec_square_c. + + exact spec_div21. + intros; apply spec_div; auto. + exact spec_div. + + intros; unfold int31_op; simpl; apply spec_mod; auto. + exact spec_mod. + + intros; apply spec_gcd; auto. + exact spec_gcd. + + exact spec_head00. + exact spec_head0. + exact spec_tail00. + exact spec_tail0. + + exact spec_add_mul_div. + exact spec_pos_mod. + + exact spec_is_even. + exact spec_sqrt2. + exact spec_sqrt. Qed. Transparent gcd31. |