У меня есть новый алгоритм поиска множителей или простых чисел за линейное время - для этого нужна проверка

Я разработал алгоритм для поиска факторов заданного числа. Таким образом, это также помогает определить, является ли данное число простым числом. Я чувствую, что это самый быстрый алгоритм для поиска факторов или простых чисел.

Этот алгоритм определяет, является ли заданное число простым во временном интервале 5*N (где N — входное число). Поэтому я надеюсь, что смогу назвать это алгоритмом линейного времени.

Как я могу проверить, является ли это самым быстрым доступным алгоритмом? Кто-нибудь может помочь в этом вопросе? (быстрее, чем GNFS и другие известные)

Алгоритм приведен ниже

Input: A Number (whose factors is to be found)
Output: The two factor of the Number. If the one of the factor found is 1 then it can be concluded that the
Number is prime.

Integer N, mL, mR, r;
Integer temp1; // used for temporary data storage
mR = mL = square root of (N);
/*Check if perfect square*/
temp1 = mL * mR;
if temp1 equals N then
{
  r = 0; //answer is found
  End;
}
mR = N/mL; (have the value of mL less than mR)
r = N%mL;
while r not equals 0 do
{
  mL = mL-1;
  r = r+ mR;

  temp1 = r/mL;
  mR = mR + temp1;
  r = r%mL;
}
End; //mR and mL has answer

Пожалуйста, предоставьте свои комментарии .. не стесняйтесь обращаться ко мне для получения дополнительной информации.

Спасибо, Хариш http://randomoneness.blogspot.com/2011/09/algorithm-to-find-factors-or-primes-in.html


person harish    schedule 07.04.2011    source источник
comment
Что делать, если факторов больше 2?   -  person BlackBear    schedule 07.04.2011
comment
+1 за хороший вопрос и хорошее испытание. Я не могу поверить, что ваш вопрос был просмотрен 68 раз, что ответ получил +6 голосов и что НИКТО не проголосовал за вас. СО сломан. Легко и просто. Люди, задающие вопрос, должны получать репутацию каждый раз, когда за ответ проголосовали. Может быть, что-то вроде 1/10 балла за каждый ответ.   -  person SyntaxT3rr0r    schedule 07.04.2011
comment
@SyntaxT3rr0r: Что ж, предложите это на мета (хотя я думаю, что это будет отклонено в свете таких вопросов, как это)   -  person BlueRaja - Danny Pflughoeft    schedule 07.04.2011
comment
@BlueRaja - Дэнни Пфлугхофт: ну, это было бы легко решить, поставив шапку на каждый вопрос. Например, вы можете получить не более +10 очков репутации за ответ, поэтому за 400 + голосов он получит только +10 очков, и в целом он все равно получит отрицательную репутацию, поскольку он -40 за свой вопрос. Хорошая идея: я предложу это на мете на днях.   -  person SyntaxT3rr0r    schedule 07.04.2011


Ответы (3)


"Линейное время" означает время, пропорциональное длине входных данных: в данном случае количеству битов в числе, которое вы пытаетесь разложить на множители. Ваш алгоритм не работает за линейное время или что-то близкое к нему, и я боюсь, что он намного медленнее, чем многие существующие алгоритмы факторинга. (Включая, например, GNFS.)

person Gareth McCaughan    schedule 07.04.2011
comment
Спасибо за ответ. Если у вас есть время, я хотел бы понять больше. Мое понимание алгоритмического анализа действительно меньше. С помощью этого алгоритма я рассчитал количество шагов, чтобы определить, что число является простым, примерно равным 5*N (где N — входное число). И, взяв 1 единицу за время, я определил время алгоритма как 5*N. Здесь количество шагов включает только базовое сложение, вычитание, сравнение (на основе алгоритма, приведенного в моем блоге). Есть ли у вас ссылка на какой-либо ресурс, с помощью которого я могу узнать, как найти время, затраченное на основе размера ввода? Или вы можете сказать мне необходимые шаги? Благодарить - person harish; 07.04.2011
comment
Размер ввода будет около log_2(N); то есть N составляет около 2 ^ b, где b — размер ввода в битах. Таким образом, время работы вашего алгоритма пропорционально 2 ^ b ... за исключением того, что на самом деле это хуже, потому что для очень больших чисел такие операции, как сложение и умножение, не являются операциями с постоянным временем; сложение занимает время, пропорциональное b, а умножение и деление больше похоже на b log b. Таким образом, время выполнения вашего алгоритма примерно равно 2^b b log b. GNFS, с другой стороны, представляет собой что-то вроде exp((Ab)^1/3 (log b)^2/3), где A — константа, равная 64/9. - person Gareth McCaughan; 07.04.2011
comment
Например, если b = 100, то 2^b b log b — это число длиной около 33 цифр, тогда как exp((Ab)^1/3 (log b)^2/3) — это число длиной около 11 цифр. - person Gareth McCaughan; 07.04.2011
comment
Итак, если мы проигнорируем постоянные множители перед этими двумя оценками и просто предположим, что они являются подсчетами операций, и если мы предположим, что можем выполнять 10 ^ 9 операций в секунду, то GNFS может разложить 100-битное число примерно на 100. секунд, тогда как ваш алгоритм займет что-то вроде 10 ^ 16 лет. - person Gareth McCaughan; 07.04.2011

Размер входных данных в этом случае равен не n, а количеству битов в n, поэтому время работы вашего алгоритма экспоненциально зависит от размера входных данных. Это известно как псевдополиномиальное время.

person hammar    schedule 07.04.2011

Я не внимательно изучал ваш алгоритм, но проверка простых чисел обычно выполняется быстрее, чем O(n) (где n — входное число). Возьмем, к примеру, этот простой:

def isprime(n):
   for f in range(2,int(sqrt(n))):
      if n % f == 0:
         return "not prime"
   return "prime"

Здесь определяется за O(sqrt(n)), является ли n простым или нет, просто путем проверки всех возможных множителей до sqrt(n).

person sth    schedule 07.04.2011
comment
@hammar и @sth: пожалуйста, найдите мой ответ на ваши комментарии в качестве комментария под ответом Гарета МакКогана на мой вопрос. Спасибо, если кто-нибудь из вас может помочь мне в том, как рассчитать время, необходимое для этого алгоритма? - person harish; 07.04.2011