Простые полиномы


21

По заданному многочлену определите, является ли оно простым.

Полином - это то ax^n + bx^(n-1) + ... + dx^3 + ex^2 + fx + g, где каждый член представляет собой постоянное число (коэффициент), умноженное на целую неотрицательную степень x. Наивысшая мощность с ненулевым коэффициентом называется степенью. Для этой задачи мы рассмотрим только полиномы как минимум степени 1. То есть каждый полином содержит несколько x. Кроме того, мы используем только полиномы с целыми коэффициентами.

Полиномы могут быть умножены. Например, (x+3)(2x^2-2x+3)равно 2x^3+4x^2-3x+9. Таким образом, 2x^3+4x^2-3x+9может быть учтено x+3и 2x^2-2x+3, так что это составное.

Другие полиномы не могут быть учтены. Например, 2x^2-2x+3не является произведением любых двух полиномов (игнорирование постоянных полиномов или полиномов с нецелыми коэффициентами). Следовательно, он прост (также известен как неприводимый).

правила

  • Ввод и вывод может быть любым стандартным способом.
  • Входные данные могут быть в виде строки 2x^2-2x+3, списка коэффициентов {2,-2,3}или любых аналогичных средств.
  • Вывод - это либо истинное значение, если оно простое, либо значение false, если оно сложное. Вы должны дать одинаковое истинное значение для всех простых чисел и одинаковое значение Ложного для всех составных многочленов.
  • Вход будет иметь по крайней мере степень 1 и максимум степень 10.
  • Вы не можете использовать встроенные инструменты для факторизации (целых чисел или выражений) или решения уравнений.

Примеры

Правда - премьер

x+3
-2x
x^2+x+1
x^3-3x-1
-2x^6-3x^4+2
3x^9-8x^8-3x^7+2x^3-10

Ложь - композит

x^2
x^2+2x+1
x^4+2x^3+3x^2+2x+1
-3x^7+5x^6-2x
x^9-8x^8+7x^7+19x^6-10x^5-35x^4-14x^3+36x^2+16x-12

11
Из-за быстрого поиска в Google это сложная проблема, независимо от игры в гольф.
orlp

5
Правильно ли я считаю, что под праймом вы подразумеваете неприводимое ? Если это так, то это в основном вариант в этом вопросе о факторизации полиномов , и я подозреваю, что он не привлечет ответов, которые не учитывают.
Питер Тейлор

1
Согласно этой недавней статье : « Нас интересует вопрос о том, является ли данный многочлен неприводимым или нет. Следовательно, желателен простой тест или критерий, который дал бы эту информацию. К сожалению, нет такого критерия, который будет применяться ко всем классы полиномов еще не разработаны ".
Питер Тейлор

2
@AlexA., Есть много тестов «если», которые работают для некоторых полиномов, но вопрос заключается в том, чтобы выполнить тест «если и только если», который работает для всех полиномов.
Питер Тейлор

1
Это хорошая проблема! Обратите внимание, что обычно полиномы являются простыми только относительно базового кольца (или поля). В частности, если поле является комплексным числом, то ни один многочлен степени больше 2 не является простым. Поэтому я хотел бы указать, хотите ли вы Rational (возможно, самое простое) целое число (это также будет включать в себя некоторое целочисленное деление) или по модулю некоторое число m. Если m простое число, то существуют довольно простые алгоритмы. В противном случае все немного сложнее ... (но возможно)
Коди

Ответы:


3

Mathematica, 224 байта

f@p_:=(e=p~Exponent~x;r=Range[⌈e/-4⌉,(e+2)/4];e<2||FreeQ[PolynomialRemainder[p,Thread@{r,#}~InterpolatingPolynomial~x,x]&/@Tuples[#~Join~-#&[Join@@Position[#/Range@Abs@#,_Integer]]&/@#]~DeleteCases~{(a_)..},0|{}]&[p/.x->r])

Пояснение :

Метод Кронекера используется здесь. Этот метод генерирует некоторые полиномы более низкой степени и проверяет, существует ли фактор исходного полинома.

Тестовые случаи :

f/@{x+3, -2x, x^2+x+1, x^3-3x-1, -2x^6-3x^4+2, 3x^9-8x^8-3x^7+2x^3-10}
(* {True, True, True, True, True, True} *)

f/@{x^2, x^2+2x+1, x^4+2x^3+3x^2+2x+1, -3x^7+5x^6-2x, x^9-8x^8+7x^7+19x^6-10x^5-35x^4-14x^3+36x^2+16x-12}
(* {True, True, True, True, True} *)

На моем ноутбуке нужно 14 секунд, чтобы понять, что 3x^9-8x^8-3x^7+2x^3-10это главное.


1

PARI / GP, 16 байт, чертовски дешево

По какой-то причине это не было запрещено (учитывая, что команда не учитывает и не решает уравнения):

polisirreducible

Прецедент

%(x^2+x+1)

возвращает 1(правда). Другие примеры работают аналогично.

Но чтобы показать, что это трудно решить, вот полное решение.

Менее дешево, но sloooooooooow

В этом нет никакого смысла играть в гольф.

Beauzamy(P)=
{
  my(d=poldegree(P),s,c);
  s=sum(i=0,d,polcoeff(P,i)^2/binomial(d,i));
  c = 3^(3/2 + d);
  c *= s / (4*d*Pi);
  abs(c * pollead(P))
}
factorpol(P)=
{
  my(B=Beauzamy(P)\1, t=B*2+1, d=poldegree(P)\2, Q);
  for(i=0,t^(d+1)-1,
    Q=Pol(apply(n->n-B, digits(i,t)));
    if(Q && poldegree(Q) && P%Q==0, return(Q))
  );
  0
}
irr(P)=
{
  factorpol(P)==0
}

Редактировать: Комментаторы указали, что первый метод может быть запрещен хорошим вкусом, духом правил, Женевской конвенцией, стандартными лазейками и т. Д. Я не согласен, но в любом случае я разместил вторую версию вместе с первое и, конечно, кажется приемлемым.


1
Хммм ... Я уверен , что эта команда делает фактор и / или решения уравнений под капотом. (Кроме того, если вызов запрещает определенные встроенные функции, подразумевается, что встроенный модуль, который просто решает проблему, также не соответствует духу задачи.)
Мартин Эндер,

@ MartinBüttner: я думаю, что первый ответ соответствует букве, но не духу правил конкурса. Вот почему я написал вторую версию, которая является законным решением. Он может проверить, что x^4+1(что является классно приводимым мод при любом простом числе) неприводимо за 86 миллисекунд. Если ничто иное, другие не могут приспособиться и сыграть в эту версию.
Чарльз

1
Первый ответ попадает в лазейку, которая по умолчанию запрещена: для выполнения работы используются встроенные функции . Пожалуйста, удалите его из своего ответа или, по крайней мере, укажите, что это недопустимое решение.
Исаак

5
@isaacg В настоящее время это недопустимая стандартная лазейка (из-за разбивки голосов + 44 / -29). Чарльз, если вы согласны с тем, что только второй ответ является действительно законным, вам следует вместо этого включить его количество байтов.
Мартин Эндер

@ MartinBüttner: я не ... я думаю, что оба законны по правилам этого вопроса и общей нити лазейки. Но я добавил комментарий, чтобы указать на проблему.
Чарльз
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.