Есть ли быстрый способ найти if (n-1)! делится на n?

Я знаю обычный способ итеративного поиска n-1 факториала с последующей проверкой. Но это имеет сложность O(n) и требует слишком много времени для больших n. Есть ли альтернатива?


person batman    schedule 21.10.2012    source источник


Ответы (1)


Да, есть: если n — простое число, очевидно, (n-1)! не делится на n.

Если n не является простым числом и может быть записано как n = a * b с a != b, то (n-1)! делится на n, потому что оно содержит a и b.

Если n = 4, (n-1)! не делится на n, но если n = a * a с a простым числом > 2, (n-1)! делится на n, потому что мы находим a и 2a в (n-1)! (спасибо Юхане в комментариях).

person alestanis    schedule 21.10.2012
comment
чтобы найти, что n простое, не придется ли мне перебирать от 1 до n? - person batman; 21.10.2012
comment
Наивным методом было бы проверить числа от 1 до sqrt(n) (а не n), чтобы увидеть, являются ли они делителями n, но это другой вопрос (stackoverflow.com/questions/2586596/). - person alestanis; 21.10.2012
comment
Как насчет идеальных квадратов? 4 не простое число, а 3! / 4 = 1.5. - person JJJ; 21.10.2012
comment
@Юхана ой! ты поймал меня! Отредактировал мой ответ. - person alestanis; 21.10.2012
comment
Это все еще не совсем правильно; 9 = 3 * 3 и 8! / 9 = 4480 (потому что 8! делится на 3*6, что равно 3*3*2). - person JJJ; 21.10.2012
comment
Хм... Будет ли 4 исключением? Все остальные совершенные квадраты дают (n-1)! делится на (n), то - person alestanis; 21.10.2012
comment
если n=a*a, (n-1)! разделить на a^2 будет (a-1)!*(a+1)*(a+2)*...*(n-1) разделить на a. Итак, либо a делит (a-1)!, что является рекурсивным экземпляром исходной задачи, либо, если нет, нам нужно проверить, делит ли a верхнюю половину произведения (n-1)!/a! . В общем случае среди множимых будет 2*a, если a>2, потому что n=a*a. Например. для 8!/9 = (2)*(4*5*6*7*8) / 3 3*2 находится среди старших множителей произведения, поэтому 3 действительно делит его еще раз. Так что да, 4 является исключением. Это работает независимо от того, является ли a простым числом или нет: 4*4=16, 4*2=8, 16|(15!) === 4|(1*2*3)*(5*6*7*8*..*15) === true. - person Will Ness; 22.10.2012
comment
Да, n=4 (полный квадрат) является исключением: для всех n › 5 верно, что n является составным числом тогда и только тогда, когда (n=1)! mod n = 0, другими словами: (n-1)! делится на n тогда и только тогда, когда n не является простым числом. Различны ли факторы в n, не имеет значения. См., например, en.wikipedia.org/wiki/Factorial. - person Bert te Velde; 25.10.2012
comment
@alestanis: У тебя невероятно глубокий интеллектуальный ум.... :0 Великолепно и вдохновляюще :) - person Jasmine; 26.02.2013