用Java生成数字对和GCD

时间:2014-05-30 09:56:58

标签: java prime-factoring greatest-common-divisor

问题:给定A,B打印对数(a,b),使得GCD(a,b)= 1且1 <= a <= A且1 <= b <1。 = B

解决方案(蛮力方法) 在下面的代码中,我使用了暴力方法,它工作正常。然而,如果A&amp; A的执行时间超过10秒。 B> 10 ^ 5

替代解决方案 根据我的研究,我发现找到A&amp;的主要因素。 B将大大缩短执行时间(<3秒),但我不确定如何应用它。

需要帮助: 任何人都可以帮助我用&lt; 3秒执行时间?

class GCD {
public static void main(String[] args) {
    int A = 0, B = 0, GCD = 0, count = 0;
    BigInteger B1, B2 = null;

    A = Integer.parseInt(args[0]);
    B = Integer.parseInt(args[1]);

    for (int a = 1; a <= A; a++) {
        for (int b = 1; b <= B; b++) {
            B1 = BigInteger.valueOf(a);
            B2 = BigInteger.valueOf(b);
            GCD = calculateGCD(B1, B2);
            if (GCD == 1) {
                count++;
            }
        }
    }
    System.out.println(count);
}

public static int calculateGCD(BigInteger number1, BigInteger number2) {
    return (number1.gcd(number2)).intValue();
}
}

1 个答案:

答案 0 :(得分:0)

我不想写一个完整的程序或其他东西,但我想给你一些加速程序的技巧:

  1. gcd(a,b) = gcd(b,a)所以只计算(a, b)a < bgcd(a,a) = 1仅适用于a = 1。所有gcd(1,b) = 1b,因此您可以从a = 2count = 1 + 2*(B-1)开始。
  2. 使用类似Sieve of Eratosthenes的内容,一次计算所有1 < a <= A的所有素数因子。例如。每个数字都包含primefactor 2,每三个都包含一个因子3。
  3. 您无需计算gcd。让a包含不同的基元pq。然后你知道:
    • 要测试B-a个数字。
    • 每个p - 数字也包含原始因子p,每个q - 首要数字也包含原始因子qfloor( (B-a)/p )个数字包含gcd >= pfloor( (B-a)/q )个数字包含gcd >= qfloor( (B-a)/(p*q) )个数字,您计算过两次。因此,您可以获得(a,b)a < b的对数 (B-a) - floor( (B-a)/p ) - floor( (B-a)/q ) + floor( (B-a)/(p*q) )
    • 如果你还需要它自己的对,你可以使用for循环并跳过i(for-loop counter)被a
    • 的任何一个幂因子除除的每一步
  4. 我认为这应该可以加快您的计划速度,只需要达到不到一秒钟。