寻找最小的素因子

时间:2015-06-28 03:34:56

标签: ruby primes

我正在尝试创建一个返回给定数字的最小素数因子的函数:

model.addAttribute("poll1Yes", resultMap.get("yes").toString());

require 'prime' def findSmallestPrimeFactor(number) return 2 if number.even? return number if Prime.prime? number arrayOfFactors = (1..number).collect { |n| n if number % n == 0 }.compact arrayOfFactors.each { |n| arrayOfFactors.pop(n) unless Prime.prime? n } return arrayOfFactors[0] end 应该返回findSmallestPrimeFactor(13333),而是返回67,这应该不会发生,因为在第7行期间1应该从1移除,因为{ {1}}返回arrayOfFactors

它有时不会返回任何内容:

Prime.prime? 1

只有在使用不均匀且不是素数的数字时才会出现此问题,即忽略第4行和第5行。

此外,当这个结束时,我将通过它传递一些非常大的数字。是否有更短或更有效的方法为更大的数字做第6-8行?

2 个答案:

答案 0 :(得分:3)

由于您使用的是prime库,因此它采用prime_division方法:

require 'prime'

13335.prime_division
# => [[3, 1], [5, 1], [7, 1], [127, 1]]
13335.prime_division[0][0]
# => 3

答案 1 :(得分:1)

如果Prime.prime?对于1是假的,它将失败"如果"并继续前进。尝试使你的阵列从3..sqrt(数字)...排除1,你已经确定数字是奇数,所以也省去2,当然没有必要看任何高于平方根的东西; (因为因子总是成对出现a * b = n,其中a和b是因子;在平方根的情况下,a = b ......在所有其他情况下,一个小于,而另一个大于,平方根)。

此外,不是收集整个集合,而是考虑一个常规循环,它会在找到一个主要因素的瞬间短路:为什么找到所有因素,如果你想要的只是最小的; (例如对于3333,您可以快速找出最小的素数因子是3,但会找到更多的步骤来找到所有因素)。