【问题标题】:What happens behind MATLAB's factor() function?MATLAB 的 factor() 函数背后发生了什么?
【发布时间】:2015-10-21 05:33:04
【问题描述】:

主要是,为什么它这么快(对于大数字)?该文档仅告诉我如何使用它。例如,它最多需要一秒钟来找到最大的素因数 1234567890987654,在我看来,这似乎很疯狂。

>>max(factor(1234567890987654))

ans =

    69444443

【问题讨论】:

  • 该功能通过简单的筛法实现。如果您输入“编辑因素”,您可以查看实现细节。
  • @gregswiss 就是这样!非常感谢。

标签: matlab primes factorization


【解决方案1】:

要尝试的最大因子是 sqrt(N),在本例中为 35136418。此外,即使是最基本的优化也会跳过所有大于 2 的偶数,只剩下 17568209 个候选者需要测试。一旦找到候选 17777778(以及它的辅因子 69444443),该算法将足够明智地停止。

通过改进的筛子跳过多个小素数 2,3,5[,7],可以稍微轻松地进一步改进。

基本上,即使是 sqrt(N) 优化也足以达到上述性能,除非您使用的是非常旧的 CPU (8086)。

【讨论】:

  • 你知道“进入”底层 Matlab 脚本的可能性吗?
  • help factor 在 Octave 中导致“/usr/share/octave/3.2.4/m/specfun/factor.m”——这种算法效率相当低。
  • Octave中factor.m的问题基本上是它提前生成了所有的素数(sqrt(n))。在最坏的情况下,这是好的,但大多数数字都有小因素,这些因素会很快导致生成更小的候选集。
【解决方案2】:

看看factorprimes函数的源代码很有意思。

factor(N) essentiallty 调用primes 以找出直到sqrt(N) 的所有素数。一旦它们被识别出来,它就会一一测试它们是否划分N

primes(n) 使用Eratosthenes' sieve:对于每个已识别的素数,删除其所有倍数,exploiting sqrt again 以降低复杂性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-02
    • 2014-04-04
    • 1970-01-01
    • 2016-06-28
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    相关资源
    最近更新 更多