示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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);
}
示例#4
0
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;
}
示例#5
0
int main()
{
    std::cout << binary_gcd(1517, 1739) << std::endl;
    return 0;
}