Binary GCD algorithm

Binary GCD algorithm

Implementation

← Previous revision Revision as of 20:34, 19 April 2026
Line 38: Line 38:
uint64_t gcd(uint64_t u, uint64_t v) {
uint64_t gcd(uint64_t u, uint64_t v) {
if (!u || !v) return u | v; // Identity #1
if (!u || !v) return u | v; // Identity #1

int shift = ctz(u | v);
int shift = ctz(u | v);
u >>= ctz(u);
u >>= ctz(u);

uint64_t min, max;
uint64_t min, max;
while (v) {
while (v) {
v >>= ctz(v); // Identity #3
v >>= ctz(v); // Identity #3
min = (u < v) ? u : v;
min = (u < v) ? u : v; // Identity #4
max = (u > v) ? u : v;
max = (u > v) ? u : v;
u = min; // Identity #4
u = min;
v = max - min;
v = max - min;
}
}