C++ 中的怪数

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

在本文中,我们将讨论怪数,包括其历史、性质、算法、示例、优点、缺点和应用。

什么是怪数?

怪数是指一个整数,如果它是四个质数的乘积。如果一个数满足两个条件,则称其为怪数:

  • 它是过剩数(abundant number):其真约数的总和(所有能整除该数但不是该数本身的数的总和)大于该数本身。
  • 它不是半完美数(semiperfect number):它的真约数中,没有一个子集能够加起来等于该数本身。

例如,第一个怪数是 70。它的真约数是 1、2、5、7、10、14 和 35,这些约数的总和为 74;因此 70 是一个过剩数。但是,这些约数的任何子集都无法加起来等于 70。这些数字很少见,并且在定义上(作为过剩数和完美数之间的界限)具有计算上的趣味性。

怪数的历史

根据本文的分析,怪数是在数论中定义的数字,用于研究整数的除完美数、亏数和过剩数之外的另一方面。过剩数已被充分研究,但那些部分过剩且非半完美的数字(即怪数)仍然引起数学界的浓厚兴趣。研究人员很快意识到,就像 y 轴一样,怪数的数量会变得越来越难以捉摸,越来越稀少,并且在数学上更难找到。

怪数的性质

C++ 中怪数的几个性质如下:

  • 真约数(Proper divisors):根据定义,一个数的真约数是指能够整除该数且结果为整数,但本身不等于该数的数字。
  • 过剩(Abundance):如果一个整数的所有真约数之和大于该整数本身,则称该整数为过剩数。
  • 非半完美(Non-semi-perfect):如果它的真约数没有一个子集可以相加等于该数,则该数不是半完美数。
  • 稀有性(Rarity):怪数出现的频率非常低,并且随着数字的增大,其出现频率也随之降低。
  • 奇偶性(Odd and even):几乎所有已知的怪数都是偶数,尽管存在一些构造允许奇数怪数的可能性。

检查怪数的算法

要判断一个数是否为怪数:

步骤 1:找出它的所有真约数。

步骤 2:如果一个数等于其所有真约数的总和,则该数是过剩数。

步骤 3:为了检查约数,我们可以再次使用子集和算法。如果找不到这样的子集,则该数为怪数。

示例

让我们举一个例子来说明 C++ 中的怪数

输出

Enter a number: 65
The given num 65 is not a weird number.   

说明

  • 该程序用 C++ 编写,其功能是通过检查两个条件来确定特定数字是否为怪数:第一个条件是该数字必须是过剩数,第二个条件是它不应是半完美数。第一个函数名为getProperDivisors,它返回输入数字 num 的真约数。真约数是指那些能整除 num 且没有余数,但不包括 num 本身的整数。该函数从 1 循环到 num/2,因为除了 num 本身,没有大于其一半的约数。真约数存储在向量中,以便稍后处理。
  • 之后,函数isSubSum检查任何子集的总和是否等于该数。此检查对于确认一个数是否为真正的怪数至关重要。位操作用于查找约数的任何子集。子集的数量等于 2n,其中 n 是约数向量的大小。循环遍历每个位,该位等价于子集索引掩码,并检查掩码中的第 i 位是否被设置;这意味着与之对应的约数被包含在子集和中。如果存在等于输入数字的子集,则返回 true,表示该数是半完美数;否则返回 false。
  • 主函数将所有先前概念结合起来,以确定待检查数字的怪异性。它调用 getProperDivisors 函数来获取真约数,然后使用该函数计算所有约数的总和。如果约数的总和小于或等于输入数字,则它不可能是怪数,因此它不是过剩数。
  • 如果该数字通过了过剩测试,则函数会调用 isSubSum() 来确定约数的任何子集是否等于该数字本身。如果存在有效的子集和,则它是半完美数,因此不符合怪数的条件。函数将返回 true。因此,只要满足这两个条件,所讨论的数字就是真正的怪数。

怪数的优点

C++ 中怪数的几个优点如下:

  • 理论意义:对怪数的研究增加了关于整数分类以及过剩数和半完美数考虑的理论知识。
  • 算法挑战:仅探索这类数字就会带来许多计算障碍,例如子集和问题(subset-sum problem),这是一个 NP 完全问题。
  • 实际用途:研究怪数可以为学生提供在约数、集合论和位操作等领域学习的机会。
  • 密码学:怪数与子集和问题之间的关联使其在密码学领域尤为重要。

怪数的缺点

C++ 中怪数的几个缺点如下:

  • 稀有性:怪数非常稀少,这降低了它们在重要事务中的实际功能。
  • 计算量大:要确定一个数是否为怪数,计算量非常大,尤其是对于较大的数字,这需要计算其约数以及解决子集和问题。
  • 适用性有限:尽管它具有重要的理论意义,但怪数在工程和科学中的应用有限。

怪数的应用

C++ 中怪数的几个应用如下:

  • 研究怪数将数论引入整数的性质和分类中。
  • 它们可以作为一系列数学主题的教学工具,从约数到子集和递归。
  • 算法设计:怪数的子集和问题与计算机科学和密码学中使用的其他问题相关。

结论

总之,怪数是数论世界中的一个细分领域,结合了过剩且非半完美的奇特性质。如果一个数的真约数之和大于该数本身,并且这些约数的任何子集都无法相加等于该数(非半完美),则该数被归类为怪数。这类数字非常罕见;它们的研究极大地促进了数学领域以及解决算法挑战,特别是当我们考虑研究约数、子集和 NP 完全问题(如寻找子集和问题的解决方案)时。例如,作为第一个怪数的 70,就完美地体现了这两个性质。

对怪数的研究很有趣,并且可以更深入地了解如何根据约数对整数进行分类。同时,也存在密码学和计算问题。然而,由于怪数很少,并且即使对数学家来说,它们的计算也可能相当复杂,因此它们在很大程度上仍然是出于好奇和兴趣。尽管存在这些缺点,怪数在教授数学逻辑、递归和位操作等方面仍然具有很大的价值——将纯粹的数学与计算理论联系起来。随着研究的不断深入,它们被数学家和计算机科学家广泛应用,反映了数学结构的优美与复杂。


下一个主题Yaml-parsers-in-cpp