如何测试非常大的整数是不是只有 2s、3s 和 7s 的质因数?
Posted
技术标签:
【中文标题】如何测试非常大的整数是不是只有 2s、3s 和 7s 的质因数?【英文标题】:How do I test whether VERY large integers have prime factors that are only 2s, 3s, and 7s?如何测试非常大的整数是否只有 2s、3s 和 7s 的质因数? 【发布时间】:2019-11-25 16:56:40 【问题描述】:我正在处理非常大的整数,大约 30000 个以 10 为底的数字。大多数数字是 1,但少数(少于 20 位)不是 1。
我只关心这些数字,如果它们的素因数分解仅由 2s、3s 和 7s 组成。我确定这个数字不能被 5 整除,因为它不能以 0 或 5 结尾,所以我不需要检查。
我希望能够取这个非常大的整数,如果它可以被 2 整除,我将它反复除以 2,直到结果不再能被 2 整除。然后,如果结果可以被 3 整除,我将它除反复除以 3 直到该结果不再能被 3 整除原数的质因数只有 2s、3s 和 7s,这是我正在寻找的属性。
我的问题:
这是测试一个大数是否只有 2s、3s 和 7s 的质因数的好方法吗?如果没有,有没有更有效的方法来测试这个? 存储这些非常大(约 30000 位)整数的成本最低的方法是什么?我只关心测试这些大整数是否具有除 2、3、7 以外的质因数。我愿意使用 Java、Python、C++、C,这些常用语言中的任何一种都会给我最有效的搜索。
我通过搜索找到的东西:
许多语言都有“BigInteger”类型,它可能仅受可用内存的限制。这听起来不错,但我认为以 10 为底的约 30000 位数字对应于该整数的大量内存。我不确定是否有更聪明的方法来处理这个问题。
数学家将我正在测试的属性称为“7-smoothness”。如果一个正整数没有大于 7 的素因数,则它是 7 平滑的。我已经知道我要测试的数字不能被 5 整除,所以我真的只寻找 2、3 和 7。
我更多的是数学家而不是计算机科学家,所以我对这种计算优化很陌生。
任何帮助表示赞赏:)
【问题讨论】:
【参考方案1】:有趣的问题。让我们拨打问题 X 的号码。
这是测试大数是否具有质因数的好方法吗 只有2s、3s和7s?
您概述的方法似乎是最好的,既快速又易于理解。另一种方法是计算 X 和 2*3*7 的最小公倍数。如果结果是 X,那么 X 完全由 2、3、7 的幂组成。但是,我相信 LCM 方法的计算复杂度低于您的方法。
存储这些非常大(约 30000 位)的成本最低的方法是什么 整数。
30000 位比密码学中通常使用的数字大,但在我所知道的任何系统上都不是例外。在 base-2 中它只需要大约 13k 字节的存储空间,几乎不值得考虑。
不幸的是,存储整数的“最佳”方式稍微复杂一些,因为它取决于数据的来源和去向。大整数通常以二进制格式存储,并且还取决于您如何定义成本。这种格式可以称为 base 2,但更准确地说,它通常存储为 base 2w“单词”或“肢体”的序列,其中 w 是进行基本算术运算的方便大小。例如,w 通常是 32 或 64。有时它比 32 或 64 少几位,因此 w 与 w 相乘加上大量进位可以适合 64 位或 128 位类型的一个字。
这种以 2 为底的表示是我见过的唯一一种在一般大整数包中使用的表示*。它使计算除以 X 的 2 的最大幂特别有效。如果您编写自己的代码,则可以选择其他基数进行存储,例如,您可以选择基数 5 或基数 7 或基数 2*3*7=42。
基数的选择还应考虑数据的输入方式,因为如果输入不是在底层包的基数中提供的,则将数据从输入源转换为大整数源可能会很昂贵。
* 还有一些大的十进制包可以将数据存储在以 10 为底而不是以 2 为底的数据中,方便确定 X 中 5 或 10 的幂。您必须检查大十进制实现的详细信息,以确定它是否实际上更快,此外您对 5 或 10 的幂不感兴趣。
【讨论】:
以上是关于如何测试非常大的整数是不是只有 2s、3s 和 7s 的质因数?的主要内容,如果未能解决你的问题,请参考以下文章
c语言程序,要求输入一个n数输出第n个丑数。丑数是素因子只有2.3.5.7。非常急,谢谢。
如何在 RNN TensorFlow 中使用非常大的数据集?
甲乙丙丁4人同时开始放鞭炮,甲每隔t1s放一次,乙每隔t2s放一次,丙每隔t3s放一次,丁每隔t4s放一次,没人各放n次。函数fun的功能是根据形参炸响,只算一次响声,第一次响声是在第0s。例如,t1