Mở rộng rễ thành đa thức


8

Thử thách

Cho các gốc của một đa thức được phân tách bằng khoảng trắng làm đầu vào, xuất ra dạng mở rộng của đa thức.

Ví dụ: đầu vào

1 2

đại diện cho phương trình này:

(x-1)(x-2)

Và nên xuất ra:

x^2-3x+2

Định dạng chính xác của đầu ra không quan trọng, nó có thể là:

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

hoặc là:

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

hoặc là:

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

Chấm điểm / nội quy

  • eval và thích là không được phép.
  • Bạn có thể sử dụng bất kỳ phiên bản Python nào hoặc bất kỳ ngôn ngữ nào khác .

Những gì được xây dựng như thế numpy.polynào?
Dennis

Tôi nghĩ @Dennis numpy không được tích hợp sẵn!
aliqandil

Các câu trả lời của Python + NumPy thường được chấp nhận, nhưng đó là điểm chính. Tôi có thể sử dụng hàm biến rễ thành hệ số đa thức không? Tôi đang hỏi vì bạn đã cấm eval và điều đó mạnh hơn đáng kể so với eval.
Dennis

@Dennis Điều đó khá nhiều toàn bộ suy nghĩ! Nhưng hãy tiếp tục! Vì cùng một chức năng được tích hợp trong hầu hết các ngôn ngữ.
aliqandil

chúng ta có thể giả sử các gốc là số nguyên? chúng ta có thể cho rằng chúng là số nguyên không âm?
tự hào

Câu trả lời:


3

Thạch, 15 byte

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

Điều này sử dụng Æṛđể xây dựng các hệ số của một đa thức monic với các gốc đã cho. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Phiên bản thay thế, 24 byte

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

Điều này sử dụng không có tích hợp liên quan đến đa thức. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Đầu vào là một mảng với các gốc.

CHỈNH SỬA:

  • (Ngày 20 tháng 5 năm 2016): X+chức năng đã bị xóa, Y+bao gồm chức năng của nó. Vì vậy, trong các mã trên thay thế X+bằng Y+.
  • (29 tháng 9 năm 2017): do thay đổi YDchức năng, wtrong đoạn mã trên cần được xóa.

Các liên kết sau đây bao gồm những thay đổi.

Hãy thử trực tuyến!

Giải trình

Điều này áp dụng chập lặp đi lặp lại với các điều khoản của các hình thức [1, -r]nơi rlà cội rễ.

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

Chức năng ẩn danh, đầu vào là một mảng của rễ.

Trước tiên, in từ công suất thấp nhất, do đó, việc gọi f[[1,2]](giả sử bạn đã gán hàm cho f) trả về chuỗi "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 (Đã xóa không gian và hơn thế nữa) -> 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])

Kiểm tra liên kết này , Sẽ giúp hiểu lý do đằng sau hai lần nhập khẩu đó.


Bạn có thể thoát khỏi rất nhiều khoảng trắng thêm
tự hào

@proudhaskeller Bạn nói đúng! Tôi đã thay đổi các quy tắc và quên thay đổi câu trả lời của riêng tôi.
aliqandil

1
from operator import*, from functools import*lưu một vài byte
shooqie

import functools,operator
Máy

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

in các quyền hạn thấp hơn trước, với một bổ sung 0+khi bắt đầu. ví dụ:

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

Hàm tính toán các hệ số bằng cách tăng dần các gốc, như các kết quả, nhưng không có nội dung.

Sau đó, chúng tôi sử dụng danh sách đơn nguyên để ngầm concattất cả các đơn thức khác nhau.


0

Sage, 38 byte

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

Dùng thử trực tuyến

Điều này định nghĩa một lambda chưa được đặt tên lấy một gốc lặp làm đầu vào và tính toán sản phẩm (x-x_n) for x_n in roots, sau đó mở rộng nó.


0

Toán học, 26 byte

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

Mathematica có các tích phân đa thức mạnh mẽ.

Sử dụng

  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`+`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.