diff options
author | Jason Gross <jgross@mit.edu> | 2017-06-17 16:20:14 -0400 |
---|---|---|
committer | Jason Gross <jgross@mit.edu> | 2017-06-17 16:20:14 -0400 |
commit | 599922047d89a89afe6fca798cb52d5f6adc7615 (patch) | |
tree | 8bd7e09c0d2d881e68c82958e8ddb8edbec12971 /src/Util/ZUtil/MulSplit.v | |
parent | 16382f1e356cadfd8d50252ae397306d9f246ba9 (diff) |
Unfold Z.mul_split_at_bitwidth for reification
Also reimplement it with a shift and a mask
Diffstat (limited to 'src/Util/ZUtil/MulSplit.v')
-rw-r--r-- | src/Util/ZUtil/MulSplit.v | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/Util/ZUtil/MulSplit.v b/src/Util/ZUtil/MulSplit.v index 2f6805446..1cc6b7af0 100644 --- a/src/Util/ZUtil/MulSplit.v +++ b/src/Util/ZUtil/MulSplit.v @@ -1,4 +1,5 @@ Require Import Coq.ZArith.ZArith. +Require Import Coq.micromega.Lia. Require Import Crypto.Util.ZUtil.Definitions. Require Import Crypto.Util.ZUtil.Tactics.LtbToLt. Require Import Crypto.Util.Tactics.BreakMatch. @@ -6,9 +7,15 @@ Local Open Scope Z_scope. Module Z. Lemma mul_split_at_bitwidth_mod bw x y : fst (Z.mul_split_at_bitwidth bw x y) = (x * y) mod 2^bw. - Proof. reflexivity. Qed. + Proof. + unfold Z.mul_split_at_bitwidth, LetIn.Let_In; break_innermost_match; Z.ltb_to_lt; try reflexivity; + apply Z.land_ones; lia. + Qed. Lemma mul_split_at_bitwidth_div bw x y : snd (Z.mul_split_at_bitwidth bw x y) = (x * y) / 2^bw. - Proof. reflexivity. Qed. + Proof. + unfold Z.mul_split_at_bitwidth, LetIn.Let_In; break_innermost_match; Z.ltb_to_lt; try reflexivity; + apply Z.shiftr_div_pow2; lia. + Qed. Lemma mul_split_mod s x y : fst (Z.mul_split s x y) = (x * y) mod s. Proof. unfold Z.mul_split; break_match; Z.ltb_to_lt; |