java - 比较一对 3 个变量的数学方法

标签 java math compare

我被赋予了在 Java 中比较一对 3 个正双变量的任务,同时忽略它们的顺序。
我做了以下事情:

if ((a1 == a2 && b1 == b2 && c1 == c2) ||
    (a1 == a2 && b1 == c2 && c1 == b2) ||
    (a1 == b2 && b1 == a2 && c1 == c2) ||
    (a1 == b2 && b1 == c2 && c1 == a2) ||
    (a1 == c2 && b1 == a2 && c1 == b2) ||
    (a1 == c2 && b1 == b2 && c1 == a2))
    // if true

我从老师那里听说,有一种数学方法可以比较这对 3 个数字。

到目前为止,我已经尝试比较它们的加法、减法、它们乘以 2 的幂的总和,但我总是发现这样一种情况,其中对是不同的并且陈述是正确的。

有任何想法吗?

编辑:

我已经发了作业,老师说我的回答是真的。我是出于好奇而问的。

最佳答案

TL; 博士

比较每个三元组的总和、每个三元组的乘积以及每个三元组所有可能组合的乘积总和。

坚韧不拔

Fundamental Theorem of Algebra ,对于 N 次多项式,我们必须有 N 个根。

使用这个事实,我们让我们的零为 a1, a2, and a3 .现在,我们找到这个多项式的系数。

(x - a1) * (x - a2) * (x - a3)
(x^2 - (a1 + a2) * x + a1a2) * (x - a3) 
x^3 - (a1 + a2) * x^2 + (a1a2) * x - a3 * x^2 + (a1a3 + a2a3) * x - a1a2a3

x^3 + (-1 * (a1 + a2 + a3)) * x^2 + (a1a2 + a1a3 + a2a3) * x + (-1 * a1a2a3)

如果两个多项式是等价的,则它们必须具有相同的根(同样由 FTA)。因此,我们需要做的就是比较生成的多项式的系数。

因此,如果,
(-1 * (a1 + a2 + a3) == (-1 * (b1 + b2 + b3))
      ---equivalently---
a1 + a2 + a3 == b1 + b2 + b3


(a1a2 + a1a3 + a2a3) == (b1b2 + b1b3 + b2b3)


-1 * a1a2a3 == -1 * b1b2b3
      ---equivalently---
a1a2a3 == b1b2b3

那么我们可以得出三元组a1, a2, a3b1, b2, b3是等价的。

这值得么?

从实际的角度来看,让我们看看这是否确实比 OP 所示的蛮力检查更有效。

首先检查:求和比较。这需要总共 4 次添加和 1 次相等性检查。

Check total = 5; Running total = 5



第二个检查:乘积、总和和比较。这需要 6 次总乘法、4 次总加法和 1 次相等性检查。

Check total = 11; Running total = 16



第三个检查:产品和比较。这需要 4 次总乘法和 1 次相等性检查。

Check total = 5; Running total = 21



加上两个逻辑与运算,“生成多项式方法的系数”的二元运算总数只需要:

23 binary operations



蛮力检查需要 18 次总相等性检查、12 次逻辑 AND 比较和 5 次逻辑 OR 比较,总共:

35 binary operations



所以,严格来说,答案是肯定的,“生成多项式方法的系数”确实更有效。然而,正如@WJS 所指出的,蛮力方法为 short circuiting 提供了更多机会。从而与数学方法一样/更有效地执行。

为了完全彻底

我们不能跳过检查每个三元组所有可能组合的乘积总和。如果我们忽略这一点,就会有无数失败的例子。考虑 (23, 32, 45)(24, 30, 46) *:
23 + 32 + 45 = 100
24 + 30 + 46 = 100

23 * 32 * 45 = 33120
24 * 30 * 46 = 33120

它们不等价,但给出相同的总和和乘积。然而,它们不会给出所有可能组合的乘积之和:
23 * 32 + 23 * 45 + 32 * 45 = 3211
24 * 30 + 24 * 46 + 30 * 46 = 3204

*如果有人好奇如何推导出与上述类似的示例,首先生成整数 的所有整数分区。男 长度为 3,取他们的产品,找到重复项,然后选择一对。

关于java - 比较一对 3 个变量的数学方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58922912/

相关文章:

javascript - 数学.floor() | 0

arrays - Powershell 比较 2 个具有不同属性的数组

c - C 中是否有类似于 SQL 中的 LIKE 的函数来比较 2 个字符串?

Java:将文件保存到两个不同的文件中 - 请解释一下解决方案

sql-server - SQL Server 是舍入还是截断?

c++ - 确定基于四元数调整方向所需的角速度

java - 比较方法违反了它的一般契约!在java中对图像轮廓进行排序时

java - 堆转储如何收集数据

java - 关于线程安全的困惑 - SimpleDateFormat 示例

java - android studio,哪个导入语句使用外部库?