Codegolf — Разложить Корни В Многочлен

  • Автор темы MoNeX
  • Обновлено
  • 23, Oct 2024
  • #1

Испытание

Учитывая корни многочлена, разделенные пробелами в качестве входных данных, выведите расширенную форму многочлена.

Например, ввод

 
 
 
 
 
 eval 

представляет это уравнение:

3 14 15 92 1x^4+-124x^3+3241x^2+-27954x^1+57960

И должно вывести:

0 0 0 1x^3+0x^2+0x^1+0

Точный формат вывода не важен, это может быть:

1x^2+-3x^1+2x^0

или:

x^2-3x+2

или:

(x-1)(x-2)

Подсчет очков/Правила

  • 1 2 and likes are disallowed.
  • Вы можете использовать любую версию Python или любой другой язык.

#код-гольф #полиномы

MoNeX


Рег
21 Nov, 2006

Тем
62

Постов
193

Баллов
533
  • 26, Oct 2024
  • #2

МАТЛ, 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

Проверять Эта ссылка, Поможет понять причину этих двух импортов.

 

Alexasp


Рег
03 Oct, 2007

Тем
75

Постов
211

Баллов
646
  • 26, Oct 2024
  • #3

Хаскелл, 99

r

сначала печатает меньшие степени с дополнительным [1, -r] at the start. for example:

w

Функция вычисляет коэффициенты, постепенно добавляя новые корни, например свертки, но без встроенной функции.

Затем мы используем монаду списка, чтобы неявно YD all of the different monomials.

 

OALexey


Рег
22 Mar, 2006

Тем
75

Постов
175

Баллов
550
  • 26, Oct 2024
  • #4

Шалфей, 38 байт

Y+

Попробуйте онлайн

Это определяет безымянную лямбду, которая принимает итерацию корней в качестве входных данных и вычисляет произведение X+ , then expands it.

 

Weaponmenucom weaponmenu


Рег
22 Oct, 2020

Тем
83

Постов
208

Баллов
633
  • 26, Oct 2024
  • #5

Математика, 26 байт

Y+

Mathematica имеет мощные встроенные полиномиальные возможности.

Использование

X+ ||answer||

JavaScript (ES6), 96 байт

ljU"1@_hX+]tn:Pqv'+%gx^%g'wYD
 

Dedalas


Рег
13 Aug, 2014

Тем
66

Постов
225

Баллов
605
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно