Ogni volta che utilizzo il metodo Euclid per verificare se due numeri sono co-prime. Ma c'è una soluzione che ha usato questo codice per verificare la presenza di co-primeness, e il tempo impiegato per questo è stato molto più veloce rispetto al metodo di Euclide: (source)Spiegare come funziona il controllo coprime
private static boolean isCoprime(long u, long v) {
if (((u | v) & 1) == 0)
return false;
while ((u & 1) == 0)
u >>= 1;
if (u == 1)
return true;
do {
while ((v & 1) == 0)
v >>= 1;
if (v == 1)
return true;
if (u > v) {
long t = v;
v = u;
u = t;
}
v -= u;
} while (v != 0);
return false;
}
non riesco a capire come questo lavoro. (Capisco operazioni bit per bit). Per esempio, che cosa significano queste righe ...
if (((u | v) & 1) == 0)
return false;
Perché semplicemente restituire falso? Inoltre ci sono altre linee che non sono in grado di capire cosa sta succedendo. Se qualcuno di voi potrebbe semplicemente darmi qualche consiglio, sarà di grande aiuto.
Potrebbe spiegarmi l'altra parte di questo codice .. se possibile? – user4890159
@ user4890159 Quale altra parte? – JNYRanger
@ user4890159 In ogni iterazione, dividi 'u' e' v' fino a che entrambi sono dispari (o '0', cioè, cosa fa la magia di bitshifting) e poi aggiorni' u' e 'v'. Si potrebbe voler dare un'occhiata a [operazioni bit a bit] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html) – Turing85