这种寻找 n 个质数的朴素方法的时间复杂度是多少?
What would be the time complexity for this naive method finding n prime numbers?
class Primes
def initialize
@primes = []
end
def prime_iterative(n)
i = 2
while @primes.size < n do
@primes << i if is_prime?(i)
i += 1
end
@primes
end
def is_prime?(n)
@primes.each { |prime| return false if n % prime == 0 }
true
end
end
primes = Primes. new
puts primes.prime_iterative 10
它找到 n 个素数,但并非所有小于 n 的素数。我无法确定上限
所以这是试除素数,效率低于埃拉托色尼筛法。
它检查每对素数的整除性,所以它肯定是 Ω(n²)。
它也是 O(n² log n),因为第 n 个素数是 (1 + o(1)) n log n,悲观地说,我们将第 n 个素数之前的每个数字除以前 n 个素数素数。
我们可以通过观察每个复合 c 都有一个素数因子 ≤ √c 来将此分析收紧到 O(n²)(因此是 Θ(n²)),因此如上所述,素数需要 O(n²) 时间,并且复合材料仅采用 O(n log n √(n/log n)),因为每个复合材料都有一个素因子 ≤ O(√(n log n)),这意味着我们检查 O(√(n log n)/ log √(n log n)) = O(√(n/log n)) 个素数。
class Primes
def initialize
@primes = []
end
def prime_iterative(n)
i = 2
while @primes.size < n do
@primes << i if is_prime?(i)
i += 1
end
@primes
end
def is_prime?(n)
@primes.each { |prime| return false if n % prime == 0 }
true
end
end
primes = Primes. new
puts primes.prime_iterative 10
它找到 n 个素数,但并非所有小于 n 的素数。我无法确定上限
所以这是试除素数,效率低于埃拉托色尼筛法。
它检查每对素数的整除性,所以它肯定是 Ω(n²)。
它也是 O(n² log n),因为第 n 个素数是 (1 + o(1)) n log n,悲观地说,我们将第 n 个素数之前的每个数字除以前 n 个素数素数。
我们可以通过观察每个复合 c 都有一个素数因子 ≤ √c 来将此分析收紧到 O(n²)(因此是 Θ(n²)),因此如上所述,素数需要 O(n²) 时间,并且复合材料仅采用 O(n log n √(n/log n)),因为每个复合材料都有一个素因子 ≤ O(√(n log n)),这意味着我们检查 O(√(n log n)/ log √(n log n)) = O(√(n/log n)) 个素数。