Created
July 31, 2018 23:42
-
-
Save hdevalence/300275c1ccac40db85d51948bb58cc00 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
impl<'a, 'b> Add<&'b CachedPoint> for &'a ExtendedPoint { | |
type Output = ExtendedPoint; | |
fn add(self, other: &'b CachedPoint) -> ExtendedPoint { | |
// The coefficients of an `ExtendedPoint` are reduced after | |
// every operation. If the `CachedPoint` was negated, its | |
// coefficients grow by one bit. So on input, `self` is | |
// bounded with `b < 0.007` and `other` is bounded with | |
// `b < 1.0`. | |
let mut tmp = self.0; | |
tmp = tmp.blend(tmp.diff_sum(), Lanes::AB); | |
// tmp = (Y1-X1 Y1+X1 Z1 T1) = (S0 S1 Z1 T1) with b < 1.6 | |
// (tmp, other) bounded with b < (1.6, 1.0) < (2.5, 1.75). | |
tmp = &tmp * &other.0; | |
// tmp = (S0*S2' S1*S3' Z1*Z2' T1*T2') = (S8 S9 S10 S11) | |
tmp = tmp.shuffle(Shuffle::ABDC); | |
// tmp = (S8 S9 S11 S10) | |
tmp = tmp.diff_sum(); | |
// tmp = (S9-S8 S9+S8 S10-S11 S10+S11) = (S12 S13 S14 S15) | |
let t0 = tmp.shuffle(Shuffle::ADDA); | |
// t0 = (S12 S15 S15 S12) | |
let t1 = tmp.shuffle(Shuffle::CBCB); | |
// t1 = (S14 S13 S14 S13) | |
// All coefficients of t0, t1 are bounded with b < 1.6. | |
// Return (S12*S14 S15*S13 S15*S14 S12*S13) = (X3 Y3 Z3 T3) | |
ExtendedPoint(&t0 * &t1) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment