Ich habe zwei Gleichungen: x * x - D * y * y = 1
und x = sqrt(1 + D * y * y)
. Beide sind algebraische Manipulationen der anderen.Arithmetische Probleme mit Java-Longs
Gegeben D, muss ich für den kleinsten ganzzahligen Wert von x lösen, so dass y auch eine ganze Zahl ist. Ich durchlaufe mögliche y-Werte, stecke sie in die zweite Gleichung und teste, ob x eine ganze Zahl ist. Wenn es ist, gebe ich x zurück.
Das Problem, das ich habe, ist, wenn x, y und D in die erste Gleichung eingesetzt werden, ist es gleich nicht 1.
Dies sind einige problematische Werte:
1. x=335159612 y=42912791 D=61
2. x=372326272 y=35662389 D=109
Meine Intuition ist, dass Javas Math.sqrt
Methode berechnet solch eine kleine Dezimalzahl nicht, aber BigDecimal
hat keine Quadratwurzelmethode.
Ist meine Mathematik einfach falsch? Wenn nicht, was kann ich tun, um x und y genau zu berechnen?
Edit: Hier ist die Wurzel des Problems zusammen mit der Methode, die testet, ob ein Double eine natürliche Zahl ist.
public static void main(String[] args){
long x = 335159612, D = 61, y = 42912791;
System.out.println(Math.sqrt(D * y * y + 2)); // 3.35159612E8
System.out.println(x * x - D * y * y); // 3
}
public static boolean isNatural(double d){
return d == (int)d;
}
Zeigen Sie uns den Code, den Sie für eine ganze Zahl zu testen, verwenden. –
Zum einen, 'sqrt (61 * 42912791 * 42912791)' [ist keine ganze Zahl] (http://www.wolframalpha.com/input/?i=sqrt (61 + * + 42912791 + * + 42912791)) . Wenn Sie das Ergebnis des sqrt in einem long speichern, sieht es natürlich wie eine ganze Zahl aus. –
In der Tat zeigen Sie uns den Code, alles oder so viel wie notwendig ist, um das Problem zu zeigen. Wenn Sie beispielsweise versuchen, '42912791 * 42912791' in Ganzzahlen zu berechnen, wird das Ergebnis überlaufen. – EJP