2016-03-07 2 views
2

Моя задача - вернуть простые множители целого числа (n). Мой вопрос: как выразить это в математическом выражении для кодирования? Я знаю, что простые числа - это числа, которые делятся только на 1 и сами, но не знают, как это сделать в коде.Способ выражения простых коэффициентов числа

Я тем не менее найти эту кодировку, которая работает, но я не знаю, почему:

def primes(n): 

    primfac = [] 
    d = 2 
    while d*d <= n: 
     while (n % d) == 0: 
      primfac.append(d) 
      n //= d 
     d += 1 
    if n > 1: 
     primfac.append(n) 
    return primfac 

Может кто-нибудь объяснить мне, почему это кодирование работает? Почему d выбран как 2, чтобы начать вместо 1? Также почему он равен d и проверяет, равен ли он или меньше n? и так далее.

+4

'1' не является простым числом. –

+1

Он просто пытается все числа, начиная с 2, удаляя факторы по мере их нахождения (и добавляя их в список). Они всегда будут главными, потому что перед тем, как попробовать какое-либо составное число, его факторы уже будут удалены из вашего номера. –

+1

О, и, начиная с 1, нет смысла. Мало того, что это не простое, но вы просто получите бесконечный список из 1s в качестве факторов. Думаю об этом. –

ответ

3

d Начинается с 2, потому что вы получите бесконечный список из 1s в качестве факторов, как Tom Karzes. Причина в том, что он квадрат d и проверяет, равен ли он n, потому что вам нужно только проверить квадратный корень из числа его коэффициентов, а math.sqrt() является более вычислительно дорогим, чем квадрат. Что он делает, так это проверяет, d us в n до d достигает квадратного корня n. Затем он добавляет d, потому что он был проверен как фактор.

Есть ли что-нибудь еще, что вы не поняли о коде?

+0

Я хотел поместить это в комментарии, так как я не думаю, что это заслуживает полного ответа, но у меня недостаточно репутации ...: D К сожалению, это мой второй ответ на SO :) –

+0

это спасибо, все о коде, спасибо! Последний вопрос, хотя, это единственный способ выразить/проверить основные факторы? Это задание, и хотя я понимаю, как работает код сейчас, я не решаюсь просто скопировать это кодирование, если есть множество других способов сделать это. – Jessica

+0

Есть еще несколько сложных алгоритмов, которые касаются простой факторизации и chekcing, являются ли цифры первыми и т. Д. Насколько мне известно, это самый быстрый способ получить полный список простых факторов 'n'. Эти алгоритмы называются [испытаниями primality] (https://en.wikipedia.org/wiki/Primality_test), но они только проверяют, является ли число простым или нет. Вы могли бы изменить один или два, чтобы перечислить основные факторы 'n', но, опять же, насколько мне известно, это самый простой и эффективный способ получения основных факторов' n'. –

Смежные вопросы