Ottimizzazione ciclo

di il
2 risposte

Ottimizzazione ciclo

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!

2 Risposte

  • Re: Ottimizzazione ciclo

    Sicuramente potresti ottimizzare i metodi che richiami al interno del ciclo

    Inviato dal mio SM-G900F utilizzando Tapatalk
  • Re: Ottimizzazione ciclo

    E in che modo secondo te potrei ottimizzarli?
Devi accedere o registrarti per scrivere nel forum
2 risposte