无法在 Java 42L + -37L * X == 17206538691L 中找到 X 的值
Cannot find the value of X in Java 42L + -37L * X == 17206538691L
Long AAA = 42L;
Long BBB = -37L;
Long TTT = 17206538691L;
问题是不知道 X 应该是等式的值:
AAA + BBB * X == TTT
这应该会找到 X 的值,但它已关闭
Long X = TTT / BBB - AAA;
这一直返回 false
Boolean Matched = AAA + BBB * X == TTT;
Long Result = AAA + BBB * X;
System.out.println(X.toString()+" Matched "+Matched.toString()+" Result "+Result.toString());
还不完全清楚你在找什么,但请注意 java 长算术有效完成 mod 264。您可以自己研究 modular 逆和扩展欧几里得算法,以及 java 如何处理整数溢出。 BigInteger class 使这些实验相对容易,如本例所示。
public class Main {
static long AAA = 42L;
static long BBB = -37L;
static long TTT = 17206538691L;
private static long solve() {
// compute x = inverse(BBB, 1<<64) * (TTT - AAA)
BigInteger two_64 = BigInteger.ONE.shiftLeft(64);
BigInteger BBB_inverse = BigInteger.valueOf(BBB).modInverse(two_64);
return BBB_inverse.multiply(BigInteger.valueOf(TTT - AAA)).longValue();
}
public static void main(String[] args) {
System.out.println(solve());
}
}
这表明答案是-5982727808154625893L。
这仅在 BBB
为奇数时有效。
Long AAA = 42L;
Long BBB = -37L;
Long TTT = 17206538691L;
问题是不知道 X 应该是等式的值:
AAA + BBB * X == TTT
这应该会找到 X 的值,但它已关闭
Long X = TTT / BBB - AAA;
这一直返回 false
Boolean Matched = AAA + BBB * X == TTT;
Long Result = AAA + BBB * X;
System.out.println(X.toString()+" Matched "+Matched.toString()+" Result "+Result.toString());
还不完全清楚你在找什么,但请注意 java 长算术有效完成 mod 264。您可以自己研究 modular 逆和扩展欧几里得算法,以及 java 如何处理整数溢出。 BigInteger class 使这些实验相对容易,如本例所示。
public class Main {
static long AAA = 42L;
static long BBB = -37L;
static long TTT = 17206538691L;
private static long solve() {
// compute x = inverse(BBB, 1<<64) * (TTT - AAA)
BigInteger two_64 = BigInteger.ONE.shiftLeft(64);
BigInteger BBB_inverse = BigInteger.valueOf(BBB).modInverse(two_64);
return BBB_inverse.multiply(BigInteger.valueOf(TTT - AAA)).longValue();
}
public static void main(String[] args) {
System.out.println(solve());
}
}
这表明答案是-5982727808154625893L。
这仅在 BBB
为奇数时有效。