public Projective EcMult(BigInt d, Projective s) { var size = s.x.Length; if (d.IsZero() || s.z.IsZero()) { return new Projective() { x = new BigInt(1, size), y = new BigInt(1, size), z = new BigInt(0, size) }; } if (d.IsOne()) { return s.Clone(); } if (!s.z.IsOne()) { var affine = EcAffinify(s); s = EcProjectify(affine); affine.Clear(); } else { s = s.Clone(); } var r = s.Clone(); var h = d.Mul3(); for (var i = h.BitCount() - 2; i >= 1; i--) { var rTmp = r; r = EcDouble(r); rTmp.Clear(); if (h.BitAt(i) && !d.BitAt(i)) { var u = EcFullAdd(r, s); r.Clear(); r = u; } else if (!h.BitAt(i) && d.BitAt(i)) { var u = EcFullSub(r, s); r.Clear(); r = u; } } h.Clear(); return r; }