Это фактор многочлена?

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
источник
Будет ли входной поток строкой с такой точной формой, то есть символом равенства вокруг кандидата на делитель, запятой с нулем или одним пробелом и символом равенства вокруг многочлена?
Алекс А.
Определенно не дубликат этого.
intboolstring
@intrepidcoder Это не дубликат, потому что вопрос не в том, чтобы разложить полином. Нужно посмотреть, можно ли разделить многочлен на линейный множитель.
intboolstring
Полиномиальные коэффициенты всегда будут целыми числами?
Цифровая травма

Ответы:

5

Pyth - 39 байт

Это чудовищное сочетание регулярного выражения и eval. Мне нравится подход, но я постараюсь улучшить реализацию.

Он использует теорему о полиномиальных остатках .

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

Не работает в сети из-за использования eval.

Maltysen
источник
3

Casio Basic, 19 байтов

judge(mod(b,a)=0

Как выясняется, fx-CP400 может работать modс алгебраическими выражениями!

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

numbermaniac
источник
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либо a в 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
RosLuP
источник