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, a3
,b1, 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的所有整数分区,取其乘积,查找重复项,然后选择一对。