计算适当分数的数量

时间:2016-11-08 15:42:11

标签: primes fractions greatest-common-divisor

如果p / q
bool prime_pairs(int x, int y) {
    int t = 0;
    while (y != 0) {
        t = y;
        y = x % y;
        x = t;
    }
    return (x == 1);
}

void proer_fractions(int n) {
    int num = n % 2 == 0 ? n / 2 - 1 : n / 2, den = 0, count = 0;
    for (; num > 0; --num) {
        den = n - num;
        if (prime_pairs(num, den))
            ++count;
    }
    printf("%d", count);
}

我想知道我是否做得对。无论如何加速算法?当N = 50 000 000时,我的笔记本电脑(i7-4700mq)以2.97秒的速度运行,处于释放模式。

非常感谢。

1 个答案:

答案 0 :(得分:1)

关键的事实是,如果p + q = ngcd(p, q) = k则k必须除以n。相反,如果p与n互质,则q = n - p必须与p互译。

因此,计算总和为n的互质对(p,q)的问题有效地减少到计算与n(Euler's totient,又名为phi)相互作用的数字并将该数除以2。

有很多代码可以在网上计算一个数字的总数,就像GeeksForGeeks的文章Euler's Totient Function一样。它基本上归结为对数字进行分解,这应该比您当前的算法快得多(大约5个数量级)。玩得开心!