static PyObject * int_abs(PyIntObject *v) { if (v->ob_ival >= 0) return int_pos(v); else return int_neg(v); }
void int_gcd(BIGINT *u, BIGINT *v, BIGINT *w) { INDEX k, i, flag; ELEMENT check, carry_bit; BIGINT t, U, V; int_copy( u, &U); int_copy( v, &V); /* find common powers of 2 and eliminate them */ k = 0; /* check that both u and v are even */ while ( !(U.hw[INTMAX] & 1 || V.hw[INTMAX] & 1)) { /* increment power of 2 and divide both u and v by 2 */ k++; int_div2( &U); int_div2( &V); } /* Now both u and v have been divided by 2^k. If u is odd, set t = v and flag, otherwise t = u and clear flag */ if (U.hw[INTMAX] & 1) { int_copy( &V, &t); flag = -1; } else { int_copy( &U, &t); flag = 1; } check = 0; INTLOOP (i) check |= t.hw[i]; while (check) { /* while t is even, divide by 2 */ while ( !(t.hw[INTMAX] & 1)) int_div2( &t); /* reset u or v to t depending on sign of flag */ if (flag > 0) int_copy( &t, &U); else int_copy( &t, &V); /* t = u - v; core reduction step, gcd remains unchanged */ int_sub( &U, &V, &t); if (t.hw[0] & MSB_HW) { flag = -1; int_neg( &t); } else flag = 1; check = 0; INTLOOP (i) check |= t.hw[i]; } /* reapply common powers of 2. First do words, then do bits.*/ int_copy( &U, w); while ( k > HALFSIZE ) { for (i=0; i<INTMAX; i++) w->hw[i] = w->hw[i+1]; k -= HALFSIZE; w->hw[INTMAX] = 0; } carry_bit = 0; while ( k > 0 ) { INTLOOP (i) { w->hw[i] = (w->hw[i] << 1) | carry_bit; carry_bit = w->hw[i] & CARRY ? 1 : 0; w->hw[i] &= LOMASK; } k--; } }