如何测试非常大的整数是不是只有 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 少几位,因此 ww 相乘加上大量进位可以适合 64 位或 128 位类型的一个字。

这种以 2 为底的表示是我见过的唯一一种在一般大整数包中使用的表示*。它使计算除以 X 的 2 的最大幂特别有效。如果您编写自己的代码,则可以选择其他基数进行存储,例如,您可以选择基数 5 或基数 7 或基数 2*3*7=42。

基数的选择还应考虑数据的输入方式,因为如果输入不是在底层包的基数中提供的,则将数据从输入源转换为大整数源可能会很昂贵。

* 还有一些大的十进制包可以将数据存储在以 10 为底而不是以 2 为底的数据中,方便确定 X 中 5 或 10 的幂。您必须检查大十进制实现的详细信息,以确定它是否实际上更快,此外您对 5 或 10 的幂不感兴趣。

【讨论】:

以上是关于如何测试非常大的整数是不是只有 2s、3s 和 7s 的质因数?的主要内容,如果未能解决你的问题,请参考以下文章

计算机S0S1S2S3S4S5状态

c语言程序,要求输入一个n数输出第n个丑数。丑数是素因子只有2.3.5.7。非常急,谢谢。

matlab 画拉普拉斯变换的零极点

java Future 阻塞

如何在 RNN TensorFlow 中使用非常大的数据集?

甲乙丙丁4人同时开始放鞭炮,甲每隔t1s放一次,乙每隔t2s放一次,丙每隔t3s放一次,丁每隔t4s放一次,没人各放n次。函数fun的功能是根据形参炸响,只算一次响声,第一次响声是在第0s。例如,t1