Первое, на что нужно обратить внимание, - это нахождение всех основных факторов.Получив эти данные, легко найти количество полных делителей: для каждого простого числа прибавьте 1 к числу появлений и умножьте их вместе.Таким образом, для 12 = 2 * 2 * 3 у вас есть (2 + 1) * (1 + 1) = 3 * 2 = 6 факторов.
Из первого следует следующее: когда вы найдете фактор,разделите его так, чтобы полученное число было меньше.Когда вы комбинируете это с фактом, что вам нужно только проверить квадратный корень текущего числа, это огромное улучшение.Например, рассмотрите N = 10714293844487412. Наивно это сделало бы N шагов.Проверка до его квадратного корня занимает sqrt (N) или около 100 миллионов шагов.Но так как факторы 2, 2, 3 и 953 обнаружены на ранней стадии, вам нужно проверить только один миллион - улучшение в 100 раз!
Еще одно улучшение: вам не нужно проверять каждое число, чтобыпосмотрите, делит ли он ваше число, только простые числа.Если вам удобнее, вы можете использовать 2 и нечетные числа, или 2, 3, и числа 6n-1 и 6n + 1 (базовое сито для колес).
Вот еще одно приятное улучшение.Если вы можете быстро определить, является ли число простым, вы можете еще больше сократить потребность в делении.Предположим, что после удаления небольших факторов у вас есть 120528291333090808192969. Даже проверка его квадратного корня займет много времени - 300 миллиардов шагов.Но тест Миллера-Рабина (очень быстрый - возможно, от 10 до 20 наносекунд ) покажет, что это число является составным.Как это помогает?Это означает, что если вы проверите его корень куба и не найдете факторов, то останется ровно два простых числа.Если число является квадратом, его факторы простые;если число не является квадратом, числа являются различными простыми числами.Это означает, что вы можете умножить свой «промежуточный итог» на 3 или 4 соответственно, чтобы получить окончательный ответ - даже не зная факторов!Это может иметь большее значение, чем вы думаете: количество необходимых шагов упало с 300 миллиардов до всего лишь 50 миллионов, улучшение в 6000 раз!
Единственная проблема с вышесказанным - Миллер-Рабинможно только доказать, что числа составные;если ему дано простое число, оно не может доказать, что число простое.В этом случае вы, возможно, захотите написать функцию доказательства простоты, чтобы избавить себя от усилий по разложению до квадратного корня из числа.(В качестве альтернативы, вы могли бы просто сделать еще несколько тестов Миллера-Рабина, если бы вы были уверены с высокой уверенностью, что ваш ответ верен, а не является доказательством того, что это так. Если число проходит 15 тестов, то оно составное с вероятностью менее 1в миллиард.)