Учитывая два многочлена f,g
произвольной степени по целым числам, ваша программа / функция должна вычислять первый многочлен во втором многочлене. f(g(x))
(он же композиция (fog)(x)
двух полиномов)
Детали
Встроенные разрешены. Вы можете принять любое разумное форматирование в качестве ввода / вывода, но формат ввода и вывода должен совпадать. Например, форматирование в виде строки
x^2+3x+5
или как список коэффициентов:
[1,3,5] or alternatively [5,3,1]
Кроме того, можно предположить, что входные полиномы полностью расширены, а выходные данные также должны быть полностью расширены.
Примеры
A(x) = x^2 + 3x + 5, B(y) = y+1
A(B(y)) = (y+1)^2 + 3(y+1) + 5 = y^2 + 5y + 9
A(x) = x^6 + x^2 + 1, B(y) = y^2 - y
A(B(y))= y^12 - 6y^11 + 15y^10 - 20y^9 + 15y^8 - 6y^7 + y^6 + y^4 - 2 y^3 + y^2 + 1
A(x) = 24x^3 - 144x^2 + 288x - 192, B(y) = y + 2
A(B(y)) = 24y^3
A(x) = 3x^4 - 36x^3 + 138x^2 - 180x + 27, B(y) = 2y + 3
A(B(y)) = 48y^4 - 96y^2
(.)
является ответом в Haskell. Вы, вероятно, имеете в виду некоторое представление списка коэффициентов.Ответы:
Haskell,
8672 байтаОпределяет функцию
o
, котораяo g f
вычисляет композицию f ∘ g. Полиномы представлены непустым списком коэффициентов, начиная с постоянного члена.демонстрация
Как это работает
Нет встроенных полиномов встроенных или библиотек. Соблюдайте подобные повторения
f (x) = a + f₁ (x) x ⇒ f (x) g (x) = ag (x) + f₁ (x) g (x) x,
f (x) = a + f₁ (x) x ⇒ f (g (x)) = a + f₁ (g (x)) g (x),
для полиномиального умножения и композиции соответственно. Они оба принимают форму
f (x) = a + f₁ (x) x ⇒ W (f) (x) = C (a) (x) + U (W (f₁)) (x).
Оператор
!
решает повторение этой формы для W, заданного U и C, используяzipWith(+).(++[0,0..])
полиномиальное сложение (при условии, что второй аргумент длиннее - для наших целей, он всегда будет). Затем,(0:)
умножает аргумент полинома на x (добавляя нулевой коэффициент);(<$>g).(*)
умножает скалярный аргумент на многочленg
;(0:)!((<$>g).(*))
умножает аргумент полинома на полиномg
;pure
поднимает скалярный аргумент до постоянного многочлена (одноэлементный список);(0:)!((<$>g).(*))!pure
составляет полиномиальный аргумент с полиномомg
.источник
Mathematica, 17 байт
Пример использования:
источник
TI-Basic 68k, 12 байтов
Использование простое, например, для первого примера:
Который возвращается
источник
→
ли быть 1 байтом в TI-BASIC?Python 2, 138
156 162байтаПредполагается, что входными данными будут целочисленные списки с наименьшими полномочиями.
Ungolfed:
В этом вычислении коэффициенты полинома рассматриваются как цифры (которые могут быть отрицательными) числа в очень большом основании. После того, как многочлены в этом формате, умножение или сложение представляет собой одну целочисленную операцию. Пока база достаточно велика, не будет никаких переносов, которые перетекают в соседние цифры.
-18 от улучшения связанного,
B
как предложено @xnor.источник
B
будет10**len(`a+b`)
достаточно?Python + SymPy,
5935 байтСпасибо @asmeurer за то, что вы играете в гольф на 24 байта!
Тестовый забег
источник
compose()
функцию.from module import*;function
был действительным представлением. Несмотря на это , это более новая политика, которая разрешает импорт и вспомогательные функции с безымянными лямбдами.Sage, 24 байта
Начиная с Sage 6.9 (версия, которая работает на http://sagecell.sagemath.org ), вызовы функций без явного присвоения аргумента (
f(2) rather than f(x=2)
) приводят к тому, что на STDERR выводится раздражающее и бесполезное сообщение. Поскольку STDERR можно игнорировать по умолчанию в коде гольф, это все еще действует.Это очень похоже на ответ Денниса на SymPy, потому что Sage a) построен на Python и b) использует Maxima , систему компьютерной алгебры, очень похожую на SymPy во многих отношениях. Тем не менее, Sage намного мощнее, чем Python с SymPy, и, следовательно, является достаточно другим языком, поэтому заслуживает своего собственного ответа.
Проверьте все тестовые примеры онлайн
источник
PARI / GP , 19 байт
что позволяет вам делать
получить
источник
MATLAB с набором символов, 28 байтов
Это анонимная функция. Чтобы вызвать его, назначьте его переменной или используйте
ans
. Входные данные - это строки в формате (пробелы необязательны)Пример выполнения:
источник
Python 2,
239232223 байта«Правильная» реализация, которая не злоупотребляет основами. Наименее значимый коэффициент в первую очередь.
a
является полиномиальным сложением,m
является полиномиальным умножением иo
является композицией.источник
m([c],e(m,[[1]]+[g]*k))
не так же, какe(m,[[c]]+[g]*k)
?a=lambda*l:map(lambda x,y:(x or 0)+(y or 0),*l)
( or 0)
в этой версии.JavaScript (ES6),
150103 байтаПринимает и возвращает полиномы в виде массива a = [a 0 , a 1 , a 2 , ...], который представляет 0 + a 1 * x + a 2 * x 2 ...
Изменить: 47 байтов сохранены путем переключения с рекурсивного на итеративное полиномиальное умножение, что позволило мне объединить два
map
вызова.Объяснение: r - это результат, который начинается с нуля, представленный пустым массивом, а p - это g h , который начинается с единицы. p умножается на каждый f h по очереди, а результат накапливается в r . p также умножается на g одновременно.
источник
Pyth,
5134 байтаТестовый пакет .
источник
Рубин 2.4 + полином , 41 + 12 = 53 байта
Использует флаг
-rpolynomial
. Ввод двухPolynomial
объектов.Если кто-то превзойдет меня в ванильном Ruby (без полиномиальной внешней библиотеки), я буду очень впечатлен.
источник