Это будет совсем небольшая публикация, на которую меня вдохновила эта статья. Нет, я не собираюсь соревноваться с предложенным там решением (разве что в краткости), но, может быть, как демонстрация возможностей Swift, она будет интересна хабрасообществу.
Решение абсолютно повторяет описанный в Википедии алгоритм, безо всяких модификаций.
Желающие могут поиграться с этим в этой песочнице. Максимум, который мне удалось выжать там — в районе 8 500 000, поиск выполняется около 6 секунд. К сожалению, запуск этого кода в плэйграунде на моем Mac Mini Late 2014 (Core i5, 8 ГБ) уже с параметром max = 1 000 000 приводит к диким тормозам, так что будьте осторожны. По приведенной выше ссылке все крутится значительно шустрее.
Решение абсолютно повторяет описанный в Википедии алгоритм, безо всяких модификаций.
import Foundation // квадрат числа extension Int { func powerOf2() -> Int { return self * self } } // до скольки считаем? let max = 8_500_000 // первое простое число var testValue = 2 let startTime = Date() // заполняем массив var data = (2...max).map{$0} let allocationTime = Date() // вычисления while (testValue.powerOf2() <= max) { data.removeAll(where: {$0 >= testValue.powerOf2() && $0.isMultiple(of: testValue)}) testValue = data.first(where: {$0 > testValue})! } let overallTime = Date() // выводим результаты print("Всего \(data.count) простых чисел: ", data) print() print("Выделение массива: \(String(format: "%.2f",(allocationTime.timeIntervalSince(startTime)))) с. ") print("Вычисления: \(String(format: "%.2f",(overallTime.timeIntervalSince(allocationTime)))) с. ") print("Всего: \(String(format: "%.2f",(overallTime.timeIntervalSince(startTime)))) с. ")
Желающие могут поиграться с этим в этой песочнице. Максимум, который мне удалось выжать там — в районе 8 500 000, поиск выполняется около 6 секунд. К сожалению, запуск этого кода в плэйграунде на моем Mac Mini Late 2014 (Core i5, 8 ГБ) уже с параметром max = 1 000 000 приводит к диким тормозам, так что будьте осторожны. По приведенной выше ссылке все крутится значительно шустрее.
