丢番图倒数III找到输出?

时间:2014-01-22 08:23:40

标签: java algorithm math

Diophantine reciprocals III

在下面的等式中,x,y和n是正整数。

1 / x + 1 / y = 1 / n

对于极限L,我们将F(L)定义为满足x

我们可以验证F(15)= 4和F(1000)= 1069。 找到F(10 ^ 12)。


  

等式等于z = xy /(x + y)。设d = gcd(x,y)。然后

     

x = dm,y = dn,gcd(m,n)= 1。

     

以下是gcd(mn,m + n)= 1所以

     

z = dmn /(m + n),

     

暗示(m + n)| d,即d = k(m + n),k是正整数。

     

因此我们获得了解决方案:

     

x = km(m + n),y = kn(m + n),z = kmn,

     

其中三个参数k,m,n是正整数。


对于I / p = 15,我得到了o / p = 4&对于I / p = 1000,我在18秒内得到o / p = 1069,但是对于I / p = 10 ^ 12,没有显示o / p。如何处理如此巨大的I / P?

public class testClient {

    public static void main(String[] args) {
        System.out.println(diophantineReciprocals(1000.0));
    }

    private static double diophantineReciprocals(double L) {
        double noOfSolutions = 0;
        double d = 1;
        double m = 1;
        double n = 1;
        double z = 0;

        for (double x = 1; x < L; x++) {
            for (double y = x + 1; y <= L; y++) {
                d = gcd(x, y);
                m = x / d;
                n = y / d;
                x = d * m;
                y = d * n;
                z = m * n * d / (m + n);

                if (/* z == (x * y) / (x + y) && */Math.round(z) != 0
                        && (z - Math.round(z)) == 0) {
                    noOfSolutions++;
                }
            }
        }

        return noOfSolutions;
    }

    private static double gcd(double x, double y) {
        double gcd = 1;
        for (double i = 2; i <= x; i++) {
            if (x % i == 0 && y % i == 0) {
                if (i > gcd) {
                    gcd = i;
                }
            }
        }
        return gcd;
    }

}

0 个答案:

没有答案