比较三个变量的数学方法


14

在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这不是作弊,因为我已经发送了作业...我出于好奇而问
AceVentuRa

2
从什么时候开始我们不帮助人们做家庭作业?
WJS

您可以添加两个对不同且陈述正确的案例吗?
厄立特里亚

2
@ControlAltDel这不是题外话,因为OP明确指出了他们尝试了什么代码以及解决它们的困难。作业上没有绝对禁止的问题。请参阅主题指南中的第3点。
EJoshuaS-恢复莫妮卡

Answers:


12

TL; DR

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

坚韧不拔

根据代数基本定理,对于阶数为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

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

检查总数= 11; 跑步总数= 16

第三项检查:乘积和比较。这需要4次总乘法和1次相等检查。

检查总数= 5;跑步总数= 21

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

23个二进制运算

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

35个二元运算

因此,严格来说,答案是肯定的,“所生成的多项式方法的系数”确实更有效。但是,正如@WJS指出的那样,蛮力方法有更多的短路机会,因此比数学方法执行效率更高。

彻底彻底

我们不能跳过检查每个三元组所有可能组合的乘积之和。如果我们忽略这一点,那么有很多例子会失败。考虑(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 的整数M的所有整数分区,取其乘积,查找重复项,然后选择一对。


1
我希望我们可以使用LaTeX
Joseph Wood,

1
但是在您的FTA方法中,必须完成所有测试。在蛮力方法中,某些比较将被短路。因此,它并没有看起来那么糟糕。
WJS

2
@WJS,同意。您可以对这种方法说同样的话,只是不能达到蛮力方法所能达到的程度。实际上,我敢打赌,由于短路,在大多数情况下,蛮力方法会或快或快。TBH,如果要对此进行编码,我可能会使用蛮力方法,因为它容易理解很多次。
约瑟夫·伍德

-1

如果允许排序(a1 <= b1 <= c1和a2 <= b2 <= c2),则尝试比较2 ^ a1 * 3 ^ b1 * 5 ^ c1与2 ^ a2 * 3 ^ b2 * 5 ^ c2 (以2、3、5的质数为基础)


你能解释这个答案吗?
AceVentuRa

1
如果允许排序,那么您要做的就是比较a1 == b1和a2 = b2和a3 == b3。
JB Nizet

我知道有人要求用数学方式...
Bruno

@Bruno我敢肯定,我的老师的意思是if发表一个声明,并if写出一种数学方法来比较它们,而不进行排序。
AceVentuRa

如何使用具有双精度值(可能会有分数)的素数。
WJS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.