size_t distances_gcd(const Distances &distances) { if (distances.size() == 0) return 0; if (distances.size() == 1) return distances[0]; size_t prev = binary_gcd(distances[0], distances[1]); for (size_t x = 2; x < distances.size(); x++) prev = binary_gcd(prev, distances[x]); return prev; }
long gcd(long *arr, int size) { pthread_t threads[THREADS]; long id; long res; int status; n = size; a = (long*) malloc(size * sizeof(long)); memcpy(a, arr, size * sizeof(long)); for (id = 0; id < THREADS; id++) { status = pthread_create(&threads[id], NULL, gcd_worker, (void*) id); if (status) { fprintf(stderr, "error %d in pthread_create\n", status); } } for (id = 0; id < THREADS; id++) { pthread_join(threads[id], NULL); } res = a[0]; for (id = 1; id < THREADS; id++) { res = binary_gcd(res, a[id * n / THREADS]); } free(a); return res; }
long binary_gcd(long larger, long smaller) { if (larger < smaller) { // swap larger ^= smaller; smaller ^= larger; larger ^= smaller; } if (smaller == 0) { return larger; } return binary_gcd(smaller, larger % smaller); }
void *gcd_worker(void *thread_id) { long id; int i; int start; int end; id = (long) thread_id; start = id * n/THREADS; end = (id + 1) * n/THREADS; if (end > n) { end = n; } for (i = start; i < end; i++) { a[start] = binary_gcd(a[start], a[i]); } return NULL; }
int main() { std::cout << binary_gcd(1517, 1739) << std::endl; return 0; }