Существует алгоритм утра называется Sieve of Eratosthenes для нахождения простого числа ДО n
числа. Асимптотическая сложность - O (nlog (logn)).
код Псевдо что-то вроде:
- Создать массив из 0..MAX
- начиная с 2, удалить все кратные 2 из массива.
- Затем вернитесь в начало и удалите все несколько из них.
- Повторите это, начиная со следующего доступного числа в начале массива.
- Сделайте это, пока квадрат числа, который вы проверяете, больше вашего максимального числа.
- И, наконец, компактный исходный массив.
Этот массив будет содержать только простые числа до вашего максимального числа. Вы обнаружите, что это действительно, очень эффективно. Настолько эффективно, что вы можете использовать его как вспомогательный метод, чтобы определить, является ли число простым. Хотите узнать, является ли число 105557 простым? Выполняется всего 66 шагов.
рубин Код:
def sieve(max)
# Set up an array with all the numbers from 0 to the max
primes = (0..max).to_a
# Set both the first and second positions (i.e., 0 and 1) to nil, as they
# aren't prime.
primes[0] = primes[1] = nil
# Iterate through primes array
counter = 0
primes.each do |p|
# Skip if nil
next unless p
# Break if we are past the square root of the max value
break if p*p > max
counter += 1
# Start at the square of the current number, and step through.
# Go up to the max value, by multiples of the current number, and replace
# that value with nil in the primes array
(p*p).step(max,p) { |m| primes[m] = nil }
end
# Finally, return the compacted array.
puts "Solved for #{max} in #{counter} steps."
primes.compact
end
Чтобы проверить, является ли число простым или нет:
def prime?(num)
sieve(num).include?(num)
end
См. Http://stackoverflow.com/questions/1801391/what-is-the-best-algorithm-for-checking-if-a-number-is-prime?rq=1 – mba12