主要是,为什么这么快(对于大数字)?该文档仅告诉我如何使用它。例如,它需要最多一秒才能找到最大的素数因子1234567890987654,对我来说,这似乎是疯了。
>>max(factor(1234567890987654))
ans =
69444443
答案 0 :(得分:5)
要尝试的最大因素是sqrt(N),或者在这种情况下为35136418。即使是最基本的优化也会跳过所有偶数> 2,只留下17568209名候选人进行测试。一旦找到候选人17777778(以及它的辅助因子69444443),该算法将足够明智地停止。
这可以通过改进的筛子进一步轻易地改进,以跳过多个小质数2,3,5 [,7]。
基本上即使sqrt(N)优化对于所提到的性能也足够了,除非你正在使用一个特别老的CPU(8086)。
答案 1 :(得分:2)
查看factor
和primes
函数的源代码很有意思。
factor(N)
essentiallty调用primes
查找所有素数sqrt(N)
。一旦确定它们,它会逐一测试它们,看它们是否划分N
。
primes(n)
使用Eratosthenes' sieve:对于每个已识别的素数,删除其所有倍数exploiting sqrt
again以降低复杂度。