Buongiorno a tutti, ho un problema con un ciclo for che richiede troppo tempo per essere eseguito. Il codice in questione è questo:
for(int i = 0; i<kin.length(); i++){
Q = doublePoint(Q, number, a);
if(kin.charAt(i) == '1')
Q = addPoint(Q, P, number, a);
}
Praticamente la variabile kin è in formato binario e la sua lunghezza si aggira spesso tra 70000 e 100000 cifre (infatti il numero che passo al metodo che contiene questa porzione di codice è molto grande). I metodi doublePoint ed addPoint invece contengono operazioni su BigInteger:
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;
}
Potrebbe essere che le performance dipendano dalle operazioni effettuate su BigInteger? Spero possiate aiutarmi. Grazie!