C++ 中的普罗伊佐洛夫恒等式

2025 年 5 月 22 日 | 阅读 7 分钟

Proizvolov's Identity 是组合数学中一个杰出的概念,它结合了置换和数字的算术签名。这是一种纯理论上的并列,尽管经常为了获得更多关于求和、置换以及两者之间关系的见解而被讨论。它的恒等式源于同一集合或同一数字的任意两个置换的剪刀之和。它们提供了简化和分析此类差异的方法,尤其是在两个置换是反对顺序的情况下。

为了更好地理解这一点,假设有一个数字集合 {1, 2, …n}。当取该集合的两个置换,一个按升序排列,另一个按降序排列时,成对差值的总和就成为分析的焦点。例如,当 n = 3 时,置换 'a' 是 [1, 2, 3],'b' 是 [3, 2, 1]。Proizvolov's Identity 表明,当比较这两个置换的元素并相减然后求和时,结果是零,这取决于 n。在某些方面,这个结果出乎意料,但同时,一旦考虑到数字的结构以及它们如何自然地从一个有趣的数学问题中简化出来,它也是完全合乎逻辑的。

总之,Proizvolov's Identity 不仅是最后一步,也是展示求和和置换的一些编程方面以及计算思维的绝佳材料。在这篇博客中,您将了解此恒等式背后的数学原理,并学习如何在 C++ 语言中实现它。顺便说一句,最后,您将知道如何通过 编程语言 检查数学公式,以及为什么 Proizvolov's Identity 不仅有趣而且意义重大。

数学洞察

为了充分理解 Proizvolov's Identity,有必要定义要解决的问题。该恒等式建立在两个基本思想之上:组合和算术中数字的能力。置换是集合中元素的排列,在这种情况下,我们处理的是集合 {1, 2, ..., n}。使用两个指定的置换——一个按升序,另一个按降序——会导致元素之间的差异产生对称性。

为了便于理解,让我们举一个 n 等于 3 的例子。集合是 {1, 2, 3}。第一个振幅 a 是一个可能的置换 [1, 2, 3],第二个振幅 b 是第二个置换 [3, 2, 1]。将这些元素配对,我们计算差异

  • 将这些差异相加,我们得到 -2 + 0 + 2 = 0。这不是偶然发生的,而是由于两个置换 a1 b1 和 a2 b2 中的对称性。结果看起来很巧妙;如果一个置换是另一个的倒数,那么每一对差值都会相互抵消,总和为零。
  • 特别是,对于任意 n,存在等式,因为在对元素和等量进行差值运算时,它们与集合的中点是等距的。在数学上,差值之和可以表示为
  • 其中 a[i] & b[i] 是来自两个置换的元素。代入置换 (1, 2, … n) 和 (n, n-1, … 1),我们可以证明此公式中的差值之和为零。
  • 对称性出现是因为任何项 a[i] 都与一个互补项 b[i] 相关联,以使两个项的索引匹配。例如,a 的最小元素 (1) 与 b 的最大元素 (3) 配对,第二个最小元素与第二个最大元素配对,依此类推。它表明求和开始时的负差值将被后面的正差值抵消。
  • 也可以使用严格的数学算法和公式快捷方式来解析 Proizvolov's Identity。与其直接减去解释,不如通过涉及的数字的进展来得出结果。升序置换代表数字 {1, 2, ..., n},它们的和由前 n 个自然数之和的公式给出

因此,构成与原始顺序相同的集合的降序置换的总和也相等。因此,如果我们逐个元素地相减,则两个置换以及结果的总和,它必须总是零。

这个恒等式在数学上是优美的,同时也代表了对称数字和图形的美好方面。它展示了如何精确地定位和重新排列元素,以及简单的计算可以揭示关于各种数系的哪些信息。然而,将此恒等式转化为 C++ 意味着我们可以更详细地审视该恒等式,并查看我们更详细的编程结构是否真的完全等同于该恒等式。这将是从理论到实践的一个很好的举措,将加强我们对 Proizvolov's Identity 的理解和欣赏。

C++ 实现

以编程方式调用 Proizvolov's Identity 的能力使我们能够检查论文中给出的恒等式的正确性并研究给定方案的细微差别。开始该过程,集合 {1, 2, …, n} 的一个置换按非递减和非递增顺序形成。随后,要向上移动一步,计算这些置换的元素之间的绝对差值,然后对绝对差值求和。

第一个置换很简单:它描述了从 1 到 n 的透镜或序列范围。第二个置换反转了这个顺序,这意味着它从 n 开始,以 1 结束。然后将这两个 数组 与一个数组的元素与第二个数组的元素进行比较。该操作纯粹意味着对于每个索引 i,都会比较两个元素,并将这两个元素之间的差值加到某个运行总数中。

这里的直觉,这是关键的实现,是两个置换是对称的。两个数组的元素之间的关系的一个特征是,当一个数组的元素上升时,另一个数组的元素下降。这种对称性保证了早期序列中的负差值会被稍后的正差值所抵消。例如,当 n = 3 且差值为 -2、0、2 时,由于序列的对称性,总和为零。这与 n 的值无关,无论 n 是大还是小。

通过使用数学 函数(包括库例程)来避免数组初始化和求和代数,可以进一步优化实现以提高性能。这些优化使实现更容易,并有助于确保一旦实现完成,即可实现可扩展性。此外,检查不同 n 值的恒等性可以为恒等性增加更多可靠性,并使人们对提出的不等式恒等性充满信心。

输入

输出

Ascending order: 1 2 3 4 5 
Descending order: 5 4 3 2 1 
Differences: -4 -2 0 2 4 
The sum of differences is: 0
Proizvolov's Identity holds true for n = 5.   

结论

Proizvolov's Identity 更像是数学,其中数字的组织形式产生了一个正确的结果。该恒等式指出,对于任何正整数 n,序列 {1, 2, ..., n} 的两个互补置换(一个升序,另一个降序)的成对差值之和始终为零。在数学上,这可以表示为

其中 a_i 表示升序序列的第 i 个元素,b_i 表示降序序列的第 i 个元素。因此,它保证了序列开头处的负差值总是伴随着结尾处的相同正差值。

通过计算实现,可以有效地在 C++ 中验证此恒等式,其中直接的逻辑构建创建了置换并计算了差值。它们还表明,对于任何 n 值,给定的结果都有效,证明该表达式是不变的。

我发现 Proizvolov's Identity 维护了数学优雅的最佳传统,它在理论和实践之间建立了结构化、逻辑的联系。它的研究有助于理解对称性和平衡等概念及其在组合、算法等方面的作用;因此,它是数学中永恒的原理。


下一个主题Max-element-in-cpp-stl