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 .

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.

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

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('+')}

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.


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.


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.


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

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`+`
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.