Potrebbe essere che le performance dipendano dalle operazioni effettuate su BigInteger? Non ho potuto usare tipi di dati primitivi tipo int o long per via della dimensione dei numeri. questo è il codice di doublePoint ed addPoint:
codice:
public static ECPoint addPoint(ECPoint r, ECPoint s, BigInteger number, BigInteger a) {
BigInteger temp_m = new BigInteger("0");
BigInteger def_m = new BigInteger("0");
//BigInteger newPoint[] = new BigInteger[2];
BigInteger x = new BigInteger("0");
BigInteger y = new BigInteger("0");
if (r.equals(s))
return doublePoint(r,number,a);
else if (r.equals(ECPoint.POINT_INFINITY))
return s;
else if (s.equals(ECPoint.POINT_INFINITY))
return r;
temp_m = (s.getAffineY().subtract(r.getAffineY())).multiply(ECMUtility.inverseNumber((s.getAffineX().subtract(r.getAffineX())), number));
def_m = temp_m.mod(number);
x = (def_m.pow(2)).subtract(r.getAffineX()).subtract(s.getAffineX()).mod(number);
y = (r.getAffineY().add((def_m.multiply((x.subtract(r.getAffineX())))))).negate().mod(number);
BigInteger Xout = x.mod(number);
BigInteger Yout = y.mod(number);
ECPoint out = new ECPoint(Xout, Yout);
return out;
}
public static ECPoint doublePoint(ECPoint r, BigInteger number, BigInteger a) {
BigInteger temp_m = new BigInteger("0");
BigInteger def_m = new BigInteger("0");
//BigInteger newPoint[] = new BigInteger[2];
BigInteger x = new BigInteger("0");
BigInteger y = new BigInteger("0");
if (r.equals(ECPoint.POINT_INFINITY))
return r;
temp_m = ((THREE.multiply(r.getAffineX().pow(2))).add(a)).multiply(ECMUtility.inverseNumber((TWO.multiply(r.getAffineY())), number));
def_m = temp_m.mod(number);
x = (def_m.pow(2)).subtract((TWO.multiply(r.getAffineX()))).mod(number);
y = (r.getAffineY().add((def_m.multiply((x.subtract(r.getAffineX())))))).negate().mod(number);
BigInteger Xout = x.mod(number);
BigInteger Yout = y.mod(number);
ECPoint out = new ECPoint(Xout, Yout);
return out;
}