МАТЛ, 29 байт
a=>a.map(x=>r.map((n,i)=>(r[i]-=x*a,a=n),++j,r.push(a=0)),r=[j=1])&&r.map(n=>n+`x^`+--j).join`+`
Входные данные — массив с корнями.
РЕДАКТИРОВАНИЕ:
- (20 мая 2016 г.):
f = Expand@Product[x-k,{k,#}]&
f@{3, 14, 15, 92}
x^4 - 124 x^3 + 3241 x^2 - 27954 x + 57960
function has been removed, as Expand@Product[x-k,{k,#}]&
включает в себя его функциональность. Итак, в приведенном выше коде замените (x-x_n) for x_n in roots
by lambda N:prod(x-t for t in N).expand()
.
- (29 сентября 2017 г.): в связи с изменениями в
concat
function, >f [1,1]
"0+1x^0+-2x^1+1x^2"
в приведенном выше коде следует удалить.
Следующая ссылка включает эти изменения.
Попробуйте онлайн!
Объяснение
При этом применяется повторная свертка с членами вида 0+
where l%r=zipWith(-)(0:l)$map(r*)l++[0]
f e='0':do(c,i)<-zip(foldl(%)[1]e)[0..];'+':show c++"x^"++show i
является корнем.
import functools
import operator
print([('+'.join(["x^"+str(len(R))]+[str(q)+"x^"+str(r)if r>0else"{0:g}".format(q)for r,q in enumerate([sum(functools.reduce(operator.mul,(-int(R[n])for n,m in enumerate(j)if int(m)==1),1)for j in[(len(R)-len(bin(i)[2:]))*'0'+bin(i)[2:]for i in range(1,2**len(R))]if sum(1-int(k) for k in j)==p)for p in range(len(R))]) ][::-1]))for R in[input().split()]][0])
||answer||
Желе, 15 байт
->x{j=-1
x.map{|r|[-r,1]}.reduce{|a,b|q=a.map{|c|b=[0]+b
b.map{|e|e*c}[1..-1]}
q.pop.zip(*q).map{|e|(e-[p]).reduce(:+)}}.map{|e|"#{e}x^#{j+=1}"}.join('+')}
Это использует "2x^0+-3x^1+1x^2"
to construct the coefficients of a monic polynomial with given roots. Попробуйте онлайн!
Как это работает
f
Альтернативная версия, 24 байта
f[[1,2]]
При этом не используются встроенные функции, связанные с полиномами. Попробуйте онлайн!
Как это работает
1WW;ð0;_×µ/‘Ė’Uj€“x^”j”+ Main link. Argument: A (list of roots)
1WW Yield [[1]].
; Concatenate with A.
ð µ/ Reduce [[1]] + A by the following, dyadic chain:
0; Prepend a zero to the left argument (initially [1]).
This multiplies the left argument by "x".
× Take the product of both, unaltered arguments.
This multiplies the left argument by "r", where r is
the root specified in the right argument.
_ Subtract.
This computes the left argument multiplied by "x-r".
‘Ė’Uj€“x^”j”+ As before.
||answer||
Рубин, 155 байт
Анонимная функция, на входе массив корней.
Сначала печатает с минимальной мощностью, поэтому звоню 1WW;ð0;_×µ/‘Ė’Uj€“x^”j”+
(assuming you assigned the function to Æṛ‘Ė’Uj€“x^”j”+ Main link. Argument: A (list of roots)
Æṛ Yield the coefficients of a monic polynomial with roots A.
‘ Increment each root by 1.
Ė Enumerate the roots, yielding
[[1, coeff. of x^0 + 1], ... [n + 1, coeff. of x^n + 1]].
’ Decrement all involved integers, yielding
[[0, coeff. of x^0], ... [n, coeff. of x^n]].
U Upend to yield [[coeff. of x^0, 0], ... [coeff. of x^n, n]].
j€“x^” Join each pair, separating by 'x^'.
j”+ Join the pairs, separating by '+'.
) возвращает строку Æṛ
.
Æṛ‘Ė’Uj€“x^”j”+
||answer||
Python 3, 453 байта (пробелы удалены и т. д.) -> 392 байта
l % push number 1
jU % take input string. Convert to number array
" % for each root r
1 % push number 1
@_ % push -r
h % concatenate horizontally
X+ % convolve. This gradually builds array of coefficients
] % end for each
tn:Pq % produce array [n-1,n-2,...,0], where n is the number of roots
v % concatenate vertically with array of coefficients
'+%gx^%g' % format string, sprintf-style
w % swap
YD % sprintf. Implicitly display
Проверять Эта ссылка, Поможет понять причину этих двух импортов.