/// <summary> /// Based on the Fixed-base comb method (Algorithm 17 from https://link.springer.com/content/pdf/10.1007/3-540-44499-8_1.pdf) /// </summary> /// <param name="scalar"></param> /// <returns></returns> private EccPoint FastMultiply(BigInteger scalar) { var width = 4; var degree = FieldSizeQ.ExactBitLength(); var d = degree.CeilingDivide(width); var scalarBits = new BitString(scalar, degree).Bits; var point = new EccPoint("infinity"); for (var i = d - 1; i >= 0; i--) { point = Double(point); var index = 0; for (var j = width - 1; j >= 0; j--) { index *= 2; if (i + d * j >= degree) { continue; } if (scalarBits[i + d * j]) { index++; } } if (index != 0) { point = Add(point, _precomputedMultiplication[index]); } } return(point); }
public bool PointExistsInField(EccPoint point) { var m = FieldSizeQ.ExactBitLength(); if (point.X.ExactBitLength() == m || point.Y.ExactBitLength() == m) { return(false); } return(true); }