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;
}
}