Perbanyak akar menjadi polinomial

8

Tantangan

Mengingat akar polinomial dipisahkan oleh spasi sebagai input, output bentuk polinomial diperluas.

Misalnya input

1 2

mewakili persamaan ini:

(x-1)(x-2)

Dan haruskah output:

x^2-3x+2

Format output yang tepat tidak penting, bisa berupa:

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

atau:

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

atau:

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

Penilaian / Aturan

  • eval dan suka tidak diizinkan.
  • Anda dapat menggunakan versi Python atau bahasa apa pun lainnya .
aliqandil
sumber
Bagaimana dengan built-in numpy.poly?
Dennis
@ Dennis numpy tidak built-in kurasa!
aliqandil
Jawaban Python + NumPy diterima secara umum, tapi itu intinya. Bisakah saya menggunakan fungsi yang mengubah akar menjadi koefisien polinomial? Saya bertanya sejak Anda melarang eval, dan itu jauh lebih kuat daripada eval.
Dennis
@ Dennis Itu hampir seluruh berpikir! Tapi silakan! Karena fungsi yang sama sudah ada di sebagian besar bahasa.
aliqandil
dapatkah kita menganggap bahwa akar adalah bilangan bulat? dapatkah kita menganggap bahwa itu bilangan bulat bukan negatif?
haskeller bangga

Jawaban:

3

Jelly, 15 byte

Æṛ‘Ė’Uj€“x^”j”+

Ini digunakan Æṛuntuk membuat koefisien polinomial monik dengan akar yang diberikan. Cobalah online!

Bagaimana itu bekerja

Æṛ‘Ė’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 '+'.

Versi alternatif, 24 byte

1WW;ð0;_×µ/‘Ė’Uj€“x^”j”+

Ini tidak menggunakan built-in yang terkait dengan polinomial. Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
4

MATL , 29 byte

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

Input adalah array dengan root.

EDIT:

  • (20 Mei 2016): X+fungsi telah dihapus, Y+termasuk fungsinya. Jadi dalam kode di atas digantikan X+oleh Y+.
  • (29 September 2017): karena perubahan YDfungsi, wdalam kode di atas harus dihapus.

Tautan berikut mencakup perubahan-perubahan itu.

Cobalah online!

Penjelasan

Ini berlaku konvolusi berulang dengan syarat bentuk di [1, -r]mana rroot.

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
Luis Mendo
sumber
2

Ruby, 155 byte

Fungsi anonim, input adalah array dari root.

Mencetak dari daya terendah terlebih dahulu, jadi memanggil f[[1,2]](dengan asumsi Anda menetapkan fungsi untuk f) mengembalikan string "2x^0+-3x^1+1x^2".

->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('+')}
Nilai Tinta
sumber
1

Python 3, 453 byte (Spasi dihapus dan banyak lagi) -> 392 byte

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])

Periksa tautan ini , Akan membantu memahami alasan di balik kedua impor itu.

aliqandil
sumber
Anda bisa menyingkirkan banyak ruang putih ekstra
haskeller bangga
@proudhaskeller Anda benar! Saya mengubah aturan agak lupa mengubah jawaban saya sendiri.
aliqandil
1
from operator import*, from functools import*simpan beberapa byte
shooqie
import functools,operator
CalculatorFeline
0

Haskell, 99

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

mencetak kekuatan yang lebih rendah terlebih dahulu, dengan tambahan 0+di awal. sebagai contoh:

>f [1,1]
"0+1x^0+-2x^1+1x^2"

Fungsi menghitung koefisien dengan semakin menambahkan lebih banyak root, seperti konvolusi, tetapi tanpa builtin.

Kemudian kita menggunakan daftar monad untuk secara implisit concatsemua monomial yang berbeda.

haskeller bangga
sumber
0

Sage, 38 byte

lambda N:prod(x-t for t in N).expand()

Cobalah online

Ini mendefinisikan lambda tanpa nama yang mengambil iterable dari root sebagai input dan menghitung produk (x-x_n) for x_n in roots, kemudian memperluasnya.

Mego
sumber
0

Mathematica, 26 byte

Expand@Product[x-k,{k,#}]&

Mathematica memiliki polinomial yang kuat.

Pemakaian

  f = Expand@Product[x-k,{k,#}]&
  f@{3, 14, 15, 92}
x^4 - 124 x^3 + 3241 x^2 - 27954 x + 57960
mil
sumber
0

JavaScript (ES6), 96 byte

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`+`
Neil
sumber