aboutsummaryrefslogtreecommitdiff
path: root/src/Util/ZUtil/MulSplit.v
diff options
context:
space:
mode:
authorGravatar Jason Gross <jgross@mit.edu>2017-06-17 16:20:14 -0400
committerGravatar Jason Gross <jgross@mit.edu>2017-06-17 16:20:14 -0400
commit599922047d89a89afe6fca798cb52d5f6adc7615 (patch)
tree8bd7e09c0d2d881e68c82958e8ddb8edbec12971 /src/Util/ZUtil/MulSplit.v
parent16382f1e356cadfd8d50252ae397306d9f246ba9 (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.v11
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;