Прості многочлени


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}або будь-який подібний засіб.
  • Вихід - або триєдине значення, якщо воно є простим, або значення фальси, якщо воно складене. Ви повинні отримати однакове значення триути для всіх прайменів і те саме значення фальси для всіх складених многочленів.
  • Вхід буде щонайменше 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
Від швидкого гуглінгу це складна проблема незалежно від гольфу.
orlp

5
Чи я маю рацію, думаючи, що під простим словом ви маєте на увазі невідводимість ? Якщо так, то це в основному варіант цього питання щодо факторингу поліномів , і я підозрюю, що це не притягне жодних відповідей, які не враховують факторів.
Пітер Тейлор

1
Згідно з цією недавньою роботою , " нас цікавить питання про те, чи є даний поліном невідмінним чи ні. Отже, простий тест чи критерій, який би дав цю інформацію, бажаний. На жаль, не існує такого критерію, який би стосувався всіх класи многочленів ще розроблені ".
Пітер Тейлор

2
@AlexA., Існує безліч тестів "if", які працюють для деяких поліномів, але питання полягає у тесті "якщо і тільки якщо", який працює для всіх многочленів.
Пітер Тейлор

1
Це приємна проблема! Зауважте, що зазвичай многочлени є простими відносно базового кільця (або поля). Зокрема, якщо поле є складними числами, то жоден многочлен ступеня більше 2 не є простим. Тож я б зазначив, чи хочете ви Раціональний (мабуть, найпростіший) цілий чисел (це також буде включати деякий цілочисельний факторинг), або модульно деяке число m. Якщо m просте, то існують досить легкі алгоритми. Інакше все дещо складніше ... (але можливо)
коді

Відповіді:


3

Математика, 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
Перша відповідь потрапляє у лазівку, яка заборонена за замовчуванням: Використання вбудованих функцій для виконання роботи . Будь ласка, видаліть його зі своєї відповіді або принаймні вкажіть, що це неправдиве рішення.
isaacg

5
@isaacg Наразі це не є дійсною стандартною лазівкою (через розрив голосів + 44 / -29). Чарльз, якщо ви згодні з тим, що лише друга відповідь справді законна, тоді вам слід включити її кількість байтів.
Мартін Ендер

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