AlgoPlus v0.1.0
Loading...
Searching...
No Matches
gcd.h
1#ifndef GCD_H
2#define GCD_H
3
4#ifdef __cplusplus
5#include <cstdint>
6#include <iostream>
7#endif
8
16int64_t binary_gcd(const int64_t a, const int64_t b) {
17 if (a == b) {
18 return a;
19 }
20 if (a == 0) {
21 return b;
22 }
23 if (b == 0) {
24 return a;
25 }
26
27 if (~a & 1) {
28 if (~b & 1) {
29 return binary_gcd(a >> 1, b >> 1) << 1;
30 } else {
31 return binary_gcd(a >> 1, b);
32 }
33 }
34 if (~b & 1) {
35 return binary_gcd(a, b >> 1);
36 }
37
38 if (a > b) {
39 return binary_gcd((a - b) >> 1, b);
40 }
41 return binary_gcd((b - a) >> 1, a);
42}
43
51int64_t euclidean_gcd(int64_t a, int64_t b) {
52 while (a > 0 && b > 0) {
53 if (a > b) {
54 a = a - b;
55 } else {
56 b = b - a;
57 }
58 }
59 return (a + b);
60}
61
62#endif