Как стать автором
Обновить

Swift: решето Эратосфена

Время на прочтение1 мин
Количество просмотров4.9K
Это будет совсем небольшая публикация, на которую меня вдохновила эта статья. Нет, я не собираюсь соревноваться с предложенным там решением (разве что в краткости), но, может быть, как демонстрация возможностей Swift, она будет интересна хабрасообществу.

Решение абсолютно повторяет описанный в Википедии алгоритм, безо всяких модификаций.

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 приводит к диким тормозам, так что будьте осторожны. По приведенной выше ссылке все крутится значительно шустрее.
Теги:
Хабы:
Всего голосов 18: ↑6 и ↓12-6
Комментарии10

Публикации

Истории

Работа

iOS разработчик
17 вакансий
Swift разработчик
26 вакансий

Ближайшие события

12 – 13 июля
Геймтон DatsDefense
Онлайн