Це чинник многочлена?


11

Поліном ділиться на коефіцієнт, (x-n)якщо f(n)=0для функції f. Ваше завдання: визначити, чи функція полінома f(x)ділиться на (x-n).

Вхід

Вхід у вигляді (x-n), (Polynomial). Пам'ятайте, якщо n від'ємний, (x-n)буде у формі введення(x+n) . Для многочлена всі експоненти будуть розміщені як ^. Коефіцієнти будуть записані поруч зі змінною x. Прикладом може бути многочлен 2x^2 + x^1. Між чим-небудь не буде пробілів. Термін xбуде зараховано як x^1. Так що б «нормально» виглядати (x - 1)буде (x^1-1). Коефіцієнти і потужності завжди будуть цілими числами. Коефіцієнт один буде неявним, якщо він справедливий x. Тобто, xможна трактувати як1x

Вихід

Булева величина. Труті, або Фальсі.

Завдяки @AlexA За те, щоб допомогти мені прояснити це!

Приклади

Input:(x^1-1),(x^1-1)
Output: True

Input: (x^1+2),(2x^2+4x^1+2)
Output: False

Input: (x^1+7),(x^2-49)
Output: True

Правила

  • Це , тому найкоротший код у байтах виграє

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


Чи буде вхідним рядком з такою точною формою, тобто паренами навколо кандидата-дільника, комою з нулем або одним пробілом та парен навколо многочлена?
Олексій А.


Однозначно не дублікат цього.
intboolstring

@intrepidcoder Це не дублікат, тому що питання не стосується многочлена. Потрібно побачити, чи можна поліном поділити на лінійний множник.
intboolstring

Чи завжди коефіцієнти поліномів будуть цілими числами?
Цифрова травма

Відповіді:


5

Pyth - 39 байт

Це жахливе поєднання регулярного виразу та евалу. Мені подобається підхід, але спробую покращити реалізацію.

У ній використовується теорема полиномного залишку .

K_sPe:z"-|\+"3!v.ssXPtw,\^\x,"**""*K"\*

Не працює в Інтернеті через eval.


3

Casio Basic, 19 байт

judge(mod(b,a)=0

Як виявляється, fx-CP400 може робити modалгебраїчні вирази!

Поліном і множник слід вводити як вирази. 16 байт для коду, 3 байти для введення a,bу поле значення параметра.


1

MATLAB, 103 99 97 95 93 байт

Я пробую кілька різних речей, і я працював над тим, щоб зберегти пару байтів:

eval([regexprep(input(''),{'.+?1(.+)\),','(\d)x'},{'x=str2num(''$1'');disp(~','$1\*x'}) 41]);

Якщо я можу знизити це ще більше, я опублікую пояснення.


Старий код пояснення

t=sscanf(input(''),'(x^1%d),%s')';x=-t(1);disp(~eval(regexprep([t(2:end) ''],'(\d)x','$1\*x')))

Це також працює з Octave . Ви можете спробувати в Інтернеті . Я зберігаю програму як скрипт з назвою isFactor.m, тому ви можете просто ввести isFactorпідказку. [Примітка: у програмі Octave випускає попередження під час запуску - MATLAB не створює цього].

Вхід повинен бути у форматі '(x^1+7),(x^2-49)'відповідно до питання. Знаки лапок додаються, тому MATLAB / Octave знає, що це рядок.

Вихід є або a, 0або 1залежно від того, правдивий він чи хибний.


Отже, код працює наступним чином. Спочатку ми вимагаємо введення, а потім аналізуємо його. Рядок розбору витягує підписане число після першого (x^1в рядку - це наше значення n. Потім він продовжує витягувати рядок ( %s) після ),вводу на вході - це наш вираз.

t=sscanf(input(''),'(x^1%d),%s')';

Далі ми дістаємо значення nі встановлюємо xрівне йому - ми будемо оцінювати, чи вираз дорівнює нулю, коли n==x, тому ми зберігаємо значення у x. Також ми заперечуємо вилучене число, через знак мінус при розборі.

x=-t(1);

Потім ми покажемо вихід, який є булевим

disp(

Вихід є в основному логічним запереченням оцінюваного рівняння. Якщо f(x)дорівнює нулю, це поверне 1, інакше це призведе до нуля.

     ~eval(

Ми оцінюємо вхідний вираз, але для цього нам потрібно його трохи переформатувати, щоб MATLAB міг зрозуміти. Коли ми читаємо рядок, це насправді масив doubleтипу, тому нам потрібно перетворити його в масив символів. Перед перетворенням ми також позбавляємося від першого елемента, оскільки саме для цього ми використовували n. Потім нам потрібно замінити будь-яке виникнення, xякому передує число (наприклад 4x) тим самим, але *знаком множення ( ) між ними, щоб MATLAB міг обчислити його.

           regexprep(char([t(2:end) ''],'(\d)x','$1\*x')
     )
)

1

VBScript, 118 116 байт

a=inputbox(""):for i=0 to 9:a=replace(a,i&"x",i&"*x"):next:b=split(a,","):x=-eval(b(0)):msgbox not cbool(eval(b(1)))

Оскільки ми знаємо, що перша частина вводу є лінійним многочленом, нам потрібно лише перевірити, чи відповідає його корінь тому другому многочлену; і нам потрібно підготувати термін eval, вставляючи по *мірі необхідності.


1

Аксіома 77 180 байт

f(a:UP(x,INT),b:UP(x,INT)):Boolean==(ground?(a)or ground?(b)=>false;p:=b;r:=a;if degree(a::POLY INT,x)>degree(b::POLY INT,x)then(p:=a;r:=b);(p rem r)$UP(x,FRAC INT)~=0=>false;true)

попереднє рішення

v(a,b)==(ground?(a) or ground?(b) or (b rem a)$UP(x,FRAC INT)~=0=>false;true)

помилявся, оскільки припустив, що ступінь (b)> = ступінь (а) одна помилка, яку я написав ... тест та результати

(3) -> f(x^1-1,x^1-1)
   (3)  true
                                                            Type: Boolean
(4) -> f(x^1+1,2*x^2+4*x^1+2)
   (4)  true
                                                            Type: Boolean
(5) -> f(x^1+2,2*x^2+4*x^1+2)
   (5)  false
                                                            Type: Boolean
(6) -> f(x^1+7,x^2-49)
   (6)  true
                                                            Type: Boolean
(7) -> f(1, 1)
   (7)  false
                                                            Type: Boolean
(8) -> f(1, x^2+1)
   (8)  false
                                                            Type: Boolean
(9) -> f(x^8-1, x^2-1)
   (9)  true
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.