【问题标题】:Matematical way to compare a pair of 3 variables比较一对 3 个变量的数学方法
【发布时间】:2019-11-18 21:07:17
【问题描述】:

我被分配在 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,但我总是发现一对不同的情况并且陈述是正确的。

有什么想法吗?

编辑:

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

【问题讨论】:

  • 我投票结束这个问题我认为回答这个问题有助于发帖人作弊。如果老师说有答案,肯定会及时揭晓的。这不是干涉的地方
  • @ControlAltDel 这不是作弊,因为我已经发送了作业......我是出于好奇而询问
  • 我们什么时候不帮别人做作业了?
  • 您能否添加那些这对不同且陈述正确的案例
  • @ControlAltDel 这不是题外话,因为 OP 清楚地表明他们尝试了哪些代码以及解决它的困难。没有明确禁止关于家庭作业的问题。请参阅on-topic guide 中的第 3 点。

标签: java math compare


【解决方案1】:

TL;DR

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

细枝末节

根据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 次相等性检查。

检查总数 = 5;运行总数 = 5

第二次检查:Product、Sum 和 Compare。这需要 6 次乘法、4 次加法和 1 次相等性检查。

检查总数 = 11;运行总数 = 16

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

检查总数 = 5;运行总数 = 21

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

23 次二元运算

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

35 次二元运算

所以,严格来说,答案是肯定的,“生成多项式方法的系数”确实更有效。然而,正如@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

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

【讨论】:

  • 我希望我们可以使用 LaTeX
  • 但是在你的 FTA 方法中,所有的测试都必须完成。在蛮力方法中,一些比较将被短路。所以它并没有看起来那么糟糕。
  • @WJS,同意。您可以对这种方法说同样的话,只是没有达到暴力方法所能达到的程度。事实上,我敢打赌,由于短路,大多数情况下的蛮力方法会一样快或更快。 TBH,如果我要编写代码,我可能会使用蛮力方法,因为它更容易理解。
【解决方案2】:

如果允许您进行排序(a1

【讨论】:

  • 你能解释一下这个答案吗?
  • 如果允许排序,那么您只需比较 a1 == b1 and a2 = b2 and a3 == b3。
  • @Bruno 我确信我老师的意思是要有一个if 声明,并在那个if 中写出比较它们的数学方法,而不是排序。
  • 如何使用可能有分数的双精度值的素数。
猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多