Skip to content

Commit 4c7fc09

Browse files
committed
Optimise GCD implementation.
1 parent 65eb4c5 commit 4c7fc09

File tree

1 file changed

+24
-17
lines changed

1 file changed

+24
-17
lines changed

src/lib.rs

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ extern crate std;
2323
extern crate num_traits as traits;
2424

2525
use core::ops::Add;
26-
use core::mem;
2726

2827
use traits::{Num, Signed};
2928

@@ -275,16 +274,20 @@ macro_rules! impl_integer_for_isize {
275274
n = n.abs();
276275

277276
// divide n and m by 2 until odd
278-
// m inside loop
279277
n >>= n.trailing_zeros();
280-
281-
while m != 0 {
282-
m >>= m.trailing_zeros();
283-
if n > m { mem::swap(&mut n, &mut m) }
284-
m -= n;
278+
m >>= m.trailing_zeros();
279+
280+
loop {
281+
if m > n {
282+
m -= n;
283+
if m == 0 { return n << shift; }
284+
m >>= m.trailing_zeros();
285+
} else {
286+
n -= m;
287+
if n == 0 { return m << shift; }
288+
n >>= n.trailing_zeros();
289+
}
285290
}
286-
287-
n << shift
288291
}
289292

290293
/// Calculates the Lowest Common Multiple (LCM) of the number and
@@ -537,16 +540,20 @@ macro_rules! impl_integer_for_usize {
537540
let shift = (m | n).trailing_zeros();
538541

539542
// divide n and m by 2 until odd
540-
// m inside loop
541543
n >>= n.trailing_zeros();
542-
543-
while m != 0 {
544-
m >>= m.trailing_zeros();
545-
if n > m { mem::swap(&mut n, &mut m) }
546-
m -= n;
544+
m >>= m.trailing_zeros();
545+
546+
loop {
547+
if m > n {
548+
m -= n;
549+
if m == 0 { return n << shift; }
550+
m >>= m.trailing_zeros();
551+
} else {
552+
n -= m;
553+
if n == 0 { return m << shift; }
554+
n >>= n.trailing_zeros();
555+
}
547556
}
548-
549-
n << shift
550557
}
551558

552559
/// Calculates the Lowest Common Multiple (LCM) of the number and `other`.

0 commit comments

Comments
 (0)