Кажется, есть несколько полезных алгоритмов на http://en.wikipedia.org/wiki/Least_common_multiple
В частности http://en.wikipedia.org/wiki/Least_common_multiple#A_method_using_a_table
кажется уместным.
Он выворачивает вложенные циклы "наизнанку" и работает со всеми числами одновременно, по одному простому за раз.
Поскольку он использует одно простое число за раз, вы можете найти следующее простое число по мере необходимости, избегая генерации 10 ^ 6 простых чисел перед началом. Поскольку каждое число уменьшается на свои основные факторы, максимальное простое число, необходимое для проверки чисел, может быть уменьшено, поэтому ему требуется еще меньше работы.
Изменить: Это также делает завершение однозначным и легко проверить, потому что число уменьшается до единицы, когда все его факторы были найдены. Фактически, когда все числа сводятся к одному, оно может завершаться, хотя я не использовал это свойство в своем коде.
Редактировать: Я прочитал проблему, алгоритм на http://en.wikipedia.org/wiki/Least_common_multiple#A_method_using_a_table решает ее напрямую.
SWAG:
Есть 78 498 простых чисел ниже 10 ^ 6 (http://primes.utm.edu/howmany.shtml#table)
В худшем случае, есть 100 чисел, которые необходимо проверить на 78 498 простых чисел,
= 7,849,800 «мод» операций
Ни одно число не может быть успешно учтено простым числом (один мод и одно деление) больше, чем log2 (10 ^ 12) = 43 мода и деления, поэтому 4300 делений и 4300 мод, в которых преобладают простые тесты.
Для простоты назовем это 8 000 000 целочисленных делителей и модов.
Он должен генерировать простые числа, но, как уже сказал Дэниел Фишер, это быстро.
Остальное - бухгалтерский учет.
Итак, на современном процессоре я бы выиграл около 1 000 000 000 делений или модов в секунду, поэтому время работы около 10 мс х 2?
Edit:
Я использовал алгоритм на http://en.wikipedia.org/wiki/Least_common_multiple#A_method_using_a_table
Смарта нет, именно так, как там объяснено.
Я сильно ошибся в оценке, примерно в 10 раз, но все еще только 20% от максимально допустимого времени выполнения.
Производительность (с печатью для подтверждения результатов)
real 0m0.074s
user 0m0.062s
sys 0m0.004s
на 100 номеров:
999979, 999983, 999979, 999983, 999979, 999983, 999979, 999983, 999979, 999983,
10 раз,
чтобы убедиться, что почти все простые числа должны быть проверены, так как это кажется основным вычислением.
, а также с тем же объемом печати, но значением почти 10 ^ 12
real 0m0.207s
user 0m0.196s
sys 0m0.005s
на 100 999962000357L, // ((long)999979L)*((long)999983L)
gcc - версия
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc., сборка 5666) (точка 3)
Copyright (C) 2007 Free Software Foundation, Inc.
Это бесплатное программное обеспечение; см. источник для условий копирования. Здесь нет
гарантия; даже не для ИЗДЕЛИИ или ФИТНЕСА ДЛЯ ОСОБЕННОЙ ЦЕЛИ.
Название модели: MacBook Pro
Название процессора: Intel Core 2 Duo
Скорость процессора: 2,16 ГГц
Резюме: он четко работает, и время выполнения составляет около 20% от допустимого максимума на относительно старом процессоре, что сопоставимо с реализацией Даниэля Фишера.
Вопрос: Я новый участник, поэтому мне кажется немного резким -2 мой ответ, когда:
а. кажется точным, полным и удовлетворяющим всем критериям, и
б. Я написал код, проверил его и предоставил результаты
Что я сделал не так? Как получить обратную связь, чтобы я мог улучшить?