SF (n) - это функция, которая вычисляет наименьший простой множитель для данного числа n.
Мы будем называть T (N) суммой каждого SF (n) с 2 <= n <= N.
T (1) = 0 (сумма превышает 0 слагаемых)
T (2) = 2 (2 - первое простое число)
Т (3) = 5 = 2 + 3
Т (4) = 7 = 2 + 3 + 2
Т (5) = 12 = 2 + 3 + 2 + 5
...
Т (10000) = 5786451
Победителем станет тот, кому удастся вычислить наибольшее значение T (N) за 60 секунд на моем собственном ноутбуке (Toshiba Satellite L845, Intel Core i5, 8 ГБ ОЗУ).
Current top score: Nicolás Siplis - 3.6e13 points - Nim
math
fastest-code
primes
division
Николас Сиплис
источник
источник
Ответы:
Nim, 3.6e13
Простое просеивание - не лучший ответ при попытке вычислить максимально возможное значение N, поскольку требования к памяти становятся слишком высокими. Вот другой подход (начатый с Nim пару дней назад и влюбленный в скорость и синтаксис, любые предложения, чтобы сделать его более быстрым или более читабельным, приветствуются!).
источник
return
вf
определении «S. Процедуры с одним выражением автоматически возвращаются.C, Prime Сито: 5e9
Результаты:
Программа:
Хотя это довольно простая программа, мне потребовалось некоторое время, чтобы понять, как правильно управлять памятью - у меня достаточно оперативной памяти только на 1 байт на число в диапазоне, поэтому я должен был быть осторожным. Это стандартное сито Erasthones.
источник
Perl, перебор факторинг
Я могу получить до 9e7 в течение 25 секунд на моей машине Linux. Это может быть быстрее, если копаться в коде C, как говорится после проверки на 2/3/5, полностью учитывать число.
Есть гораздо более умные способы сделать это с помощью просеивания. Я думал, что простой перебор путь будет началом. Это в основном Проект Эйлера проблемы 521, кстати.
источник
Go, 21e9
Делает ли сито для нахождения минимального множителя для каждого числа <= N. порождает подпрограммы для подсчета разделов числового пространства.
Запуск с "идти работать prime.go -P 4 -N 21000000000".
Обратите внимание, что ответ для N = 21e9 находится между 2 ^ 63 и 2 ^ 64, поэтому мне пришлось использовать 64-разрядные целые числа без знака для правильного подсчета ...
источник
C ++, 1 << 34 ~ 1.7e10
источник
Java 8:
1.8e82.4e8Эта запись не сравнится с несколькими другими, которые уже есть, но я хотел опубликовать свой ответ, так как мне было весело работать над этим.
Основные оптимизации моего подхода заключаются в следующем:
T(N)
когдаN % 2 == 1
, вы это знаетеT(N + 1) == T(N) + 2
. Это позволяет мне начать отсчет с трех и увеличивать по итерации по два.Collection
типе. Это более чем вдвое больше, чемN
я могу достичь.Вот и все, что нужно сделать. Мой код перебирает с 3 по двойками до тех пор, пока не обнаружит, что он ударил или превысил лимит времени, и в этот момент он выплевывает ответ.
Работа в другой системе (Windows 8.1, Intel Core i7 @ 2,5 ГГц, 8 ГБ ОЗУ) с последней версией Java 8 заметно улучшила результаты без изменений кода:
источник
mayContinue()
вfor loop condition
только с условием простого, можно добиться более высокого результата. И мне нравится твой способ предварительного вычисления четной суммы, а затем увеличения на два.startTime
на an,endTime
чтобы исключить вычитания ~ 2e7, но это стоило мне 3e7 из моего счета!System.nanoTime() - startTime < TIME_LIMIT
, потому что это немного закрепляет ваш код для меня. Это не слишком быстро, учитывая тот факт, что это условие проверяется миллионы раз, оно будет немного быстрым. Одна вещь, которую я узнал из вашего кода, заключается в том, что не помещайтеfor
внутрь afor
.. После переходаfor
к другому методу в моем коде моя скорость кода увеличивается на 40%, спасибо .. Одна вещь, которую я до сих пор выясняю, состоит в том, делали ли массивы намного эффективнее, чем ArrayList, если учитывать тот факт, что он выбирается миллионы раз ..x2
результата, если бы вы реализовалиMultiThreading
. Но необходимо выполнить предварительный расчет всего массива перед запуском вычисления Prime.mayContinue()
метода в цикл for будет стоить мне 8e6 из моего счета. Это может быть проблемой локальной оптимизации. Я экспериментировал с несколькими типами данных для хранения простых чисел при разработке этого решения. Я смог достичь только 8.8e7 сArrayList
, но я ударил 1.8e8 (теперь 2.4e8), используя массив. С поиском могут быть некоторые повышения производительности, но есть определенные повышения для выделения памяти. Я думал о многопоточности алгоритма, но столкнулся с проблемами.R 2,5e7
Простое сито из Эратосфена, максимально векторизованное. R на самом деле не предназначен для такого рода проблем, и я уверен, что это можно сделать быстрее.
источник
sum(vec)
приводит к переполнению целого числа и возвращает NA.sum(as.numeric(vec))
Питон, ~ 7e8
Использование добавочного сита из эратостенов. Необходимо позаботиться о том, чтобы помеченное значение было отмечено его самым низким делителем, но в остальном реализация довольно проста.
Время было взято с PyPy 2.6.0, ввод принимается как аргумент командной строки.
Образец использования
источник
Юлия, 5е7
Конечно, Юля может сделать лучше, но это то, что у меня есть сейчас. Это делает 5e7 примерно за 60 секунд на JuliaBox, но я пока не могу проверить локально. Надеюсь, к тому времени я подумаю о более умном подходе.
Здесь мы создаем функцию,
lpf
которая перебирает последовательные простые числа и проверяет входные данные на делимость для каждого. Функция возвращает первый встреченный делитель, тем самым получая наименьший простой множитель.Основная функция вычисляет
lpf
целые числа от 2 до входных данных параллельно и уменьшает результат путем суммирования.источник
Common Lisp, 1e7
Я решил сначала создать список простых чисел от 2 до
(sqrt input)
, а затем проверить каждое значение с помощью простых чисел, тогда как ранее я проверял каждое число до(sqrt input)
, что было бы бессмысленно (например, если число делится на 4, оно также делится на 2, поэтому оно уже учтено.)Слава Богу за побочные эффекты, пока я в этом. Команда remove-if уменьшает размер списка и подсчитывает, сколько элементов было удалено, поэтому мне просто нужно умножить это значение на любое значение цикла и добавить его в промежуточный итог.
(Интересный факт:
delete
деструктивный эквивалентremove
, но по какой-то причине онdelete
намного медленнее, чемremove
в этом случае.)источник
Ржавчина 1.5е9
Очень наивное сито Эратосфена, но я чувствовал, что Руст не получил здесь никакой любви!
источник
Java 2.14e9
Чистое Сито Эратосфена с преимуществом BitSet
Я вычислил сумму наименьшего
Integer.MAX_VALUE - 1
простого множителя до33.89 s
. Но я не могу продолжать дальше, потому что это приведет к переполнению целочисленного размера. Поэтому я работаю над созданием другого набора битов для следующего набора диапазонов. До тех пор, это самый быстрый, который я могу генерировать.источник