我正在尝试创建一个返回给定数字的最小素数因子的函数:
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行?
答案 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,但会找到更多的步骤来找到所有因素)。