for (i = 2; i <= ceiling; i++) {
if (input % i == 0) {
factorFound = 1;
break;
}
}
Это первое улучшение, которое сделано и остается в рамках «того же» алгоритма.Для этого не требуется никакой математики.
Кроме того, как только вы увидите, что input
не делится на 2, нет необходимости проверять 4, 6, 8 и т. Д.Если любое четное число делится на input
, то, безусловно, будет 2, потому что оно делит все четные числа.
Если вы хотите немного выйти за пределы алгоритма, вы можете использовать цикл, подобныйчто Шелдон Л. Купер дает в своем ответе.(Это просто легче, чем заставить его исправить мой код из комментариев, хотя его усилия высоко ценятся)
это использует тот факт, что каждое простое число, кроме 2 и 3, имеет форму n*6 + 1
или n*6 - 1
для некоторого положительного целого числа n
.Чтобы увидеть это, просто обратите внимание, что если m = n*6 + 2
или m = n*6 + 4
, то n
делится на 2. Если m = n*6 + 3
, то он делится на 3.
На самом деле, мы можем принять это далее,Если p1, p2, .., pk
являются первыми k
простыми числами, то все целые числа, взаимно простые с их произведением, отмечают «слоты», в которые должны вписаться все остальные простые числа.
, чтобы увидеть это, просто позвольте k#
быть произведением всех простых чисел до pk
.тогда, если gcd(k#, m) = g
, g
делит n*k# + m
, и, таким образом, эта сумма тривиально сложна, если g != 1
.так что если вы хотите выполнить итерацию в терминах 5# = 30
, то ваши простые целые числа равны 1, 7, 11, 13, 17, 19, 23 и 29.
технически, я не доказалмоя последняя претензияЭто не намного сложнее
, если g = gcd(k#, m)
, то для любого целого числа n
, g
делит n*k# + m
, потому что оно делит k#
, поэтому оно также должно делить n*k#
.Но он также делит m
, поэтому он должен делить сумму.Выше я только доказал это для n = 1
.мой плохой.
Кроме того, я должен отметить, что ничто из этого не меняет фундаментальную сложность алгоритма, это все равно будет O (n ^ 1/2).Все, что он делает, это радикально , уменьшая коэффициент, который используется для расчета фактического ожидаемого времени выполнения.