我们需要将一组整数A
转换为另一组整数B
,以使B
元素的平方和等于某个给定值{{ 1}}。
由于可能存在多个这样的变换,我们需要找到M
和A
的相应元素之间差异的平方和最小的变换。
输入:
B
= {a 1 , 2 , 3 ... a n } A
输出:
M
= {b 1 ,b 2 ,b 3 ... b n },这样:
B
M
被最小化。 S
。答案 0 :(得分:4)
一点数学。
总和(a i - b i ) 2 = Sum ( a i 2 - 2 a i b i + b i 2 )= 总和 a i 2 - 2 Sum a i b i + Sum b i 2
第一个词是不变的;最后一个是M(也是常数),所以你正在寻求最大化
总和 a i b i
限制 Sum b i 2 = M.
换句话说,您需要一个垂直于矢量A = {a i }的超平面,与半球 sqrt (M)的超球面相切。这种超平面穿过法线与球体相交的点。这一点是 fA 与| fA | = sqrt (M):
f = sqrt (M)/ sqrt ( Sum a i 2 )
您的问题的解决方案是
b i = a i * sqrt (M)/ sqrt ( Sum a i 2 )
答案 1 :(得分:2)
编辑:到目前为止的答案,包括下面的答案,将A映射到一组实数而不是整数。据我所知,没有一般的解决方法,因为有许多M的值,没有满足约束的整数向量。例如:M = 2.没有整数向量,其平方和为2.即使M是平方和,它也是一定数量的平方和,所以即使M = 4也没有解,如果A有3个或更多非零组件。因此,没有一般的映射能够满足所述的问题。
这是允许B成为实数矢量的版本:
@ user58697的答案非常优雅。对于我们这些不太习惯用超几何思考的人来说,这可能是更直观的重述:
将A和B视为向量。然后以相同的方式开始:sum(a i - b i ) 2 = sum(a i 2 ) - 2sum(a i b i )+ sum(b i 2 )
第一项是矢量A的平方,正如最后一项是矢量B平方的幅度一样。两者都是不变的,所以只有中期可以改变。这意味着我们想要最大化总和(a i b i ),这正是A和B(https://en.wikipedia.org/wiki/Dot_product)的点积。当两个向量之间的角度为0时,两个向量的点积最大化,也就是说当它们是同向时(即它们指向相同的方向)。
这意味着A和B的单位矢量形式必须相同。那是: 一个<子> I 子> / | A | = b i / | B |。解决这个问题b i :b i = a i * | B | / | A |
但是| B |只是sqrt(M),A是sqrt(sum(a i 2 ))。所以,就像在user58697的版本中一样:
b i = a i * sqrt(M)/ sqrt(sum(a i 2 ) )