Biến đổi Laplace đa thức

Dec 26 2020

Đây là bản đăng lại của thử thách này , nhằm mục đích cải tiến nó cho các định dạng I / O lỏng lẻo hơn và các quy tắc cập nhật

Bạn phải viết một chương trình nhận một đa thức số nguyên trong \$t\$như đầu vào và đầu ra của phép biến đổi Laplace của đa thức này. Một số định nghĩa và tính chất:

  • Biến đổi Laplace của một hàm đã cho \$f(t)\$

$$\mathcal{L}\{f(t)\} = F(s) = \int_0^\infty f(t)e^{-st}dt$$

  • Biến đổi Laplace của \$f(t) = t^n, \, n = 0, 1, 2, ...\$

$$\mathcal{L}\{t^n\} = \frac{n!}{s^{n+1}}$$

  • Phép biến đổi Laplace phân phối trên phép cộng:

$$\mathcal{L}\{f(t)+g(t)\} = \mathcal{L}\{f(t)\} + \mathcal{L}\{g(t)\}$$

  • Biến đổi Laplace của một hằng số nhân với một hàm bằng hằng số nhân với biến đổi:

$$\mathcal{L}\{af(t)\} = a\mathcal{L}\{f(t)\}$$

  • Đa thức nguyên là đa thức trong đó mỗi số hạng có hệ số nguyên và bậc không âm

Một ví dụ hoạt động:

$$\begin{align} \mathcal{L}\{3t^4+2t^2+t-4\} & = \mathcal{L}\{3t^4\}+\mathcal{L}\{2t^2\}+\mathcal{L}\{t\}-\mathcal{L}\{4\} \\ & = 3\mathcal{L}\{t^4\}+2\mathcal{L}\{t^2\}+\mathcal{L}\{t\}-4\mathcal{L}\{1\} \\ & = 3\left(\frac{4!}{s^5}\right)+2\left(\frac{2!}{s^3}\right)+\left(\frac{1!}{s^2}\right)-4\left(\frac{0!}{s}\right) \\ & = \frac{72}{s^5}+\frac{4}{s^3}+\frac{1}{s^2}-\frac{4}{s} \end{align}$$


Bạn có thể lấy đầu vào trong một biểu diễn tiêu chuẩn của một đa thức. Một số ví dụ (cho \$3x^4+2x^2+x-4\$ như một ví dụ) là:

  • Một danh sách các hệ số. [-4, 1, 2, 0, 3]hoặc là[3, 0, 2, 1, -4]
  • Các cặp hệ số và lũy thừa. [[3, 4], [2, 2], [1, 1], [-4, 0]]và nhiều thử thách khác nhau
  • Một chuỗi, sử dụng bất kỳ biến nào bạn thích. 3x^4+2x^2+x-4

Tương tự, vì đầu ra sẽ là một đa thức với thứ tự âm, bạn có thể xuất ở các định dạng tương tự, chẳng hạn như (sử dụng \$\mathcal{L}\{3x^4+2x^2+x-4\} = \frac{72}{s^5}+\frac4{s^3}+\frac1{s^2}-\frac4s\$):

  • Một danh sách các hệ số. [72, 0, 4, 1, -4]hoặc là[-4, 1, 4, 0, 72]
  • Các cặp hệ số và lũy thừa. [[72, -5], [4, -3], [1, -2], [-4, -1]]và nhiều thử thách khác nhau (hoặc các phiên bản tích cực của quyền hạn)
  • Một chuỗi, sử dụng bất kỳ biến nào bạn thích. 72s^-5+4s^-3+s^-2-4s^-1

Nếu bạn không chắc chắn về phương pháp I / O thay thế nào, vui lòng bình luận bên dưới để hỏi.

Đây là mã-gôn nên mã ngắn nhất tính bằng byte sẽ thắng.

Trả lời

7 xnor Dec 26 2020 at 08:42

Haskell , 25 byte

zipWith(*)$scanl(*)1[1..]

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

Khá đơn giản: Tạo danh sách thừa số [1,1,2,6,...]với a scanl, sau đó zipWith(*)nhân từng phần tử của đầu vào với giá trị tương ứng.

32 byte

foldr(\(i,x)r->x:map((i+1)*)r)[]

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

Một giải pháp dựa trên gấp khá tốt. Sử dụng đầu vào dưới dạng (exponent, coefficient)cặp.

6 xash Dec 26 2020 at 06:50

truyền tải , 15 byte

v"*<
0+1"
 1{*}

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

Hai cột bên trái sao chép "1, 2, 3,… vào trên cùng *. Giá trị ở trên cùng bên phải được nhân với mỗi vòng, vì vậy chúng tôi nhận được (bắt đầu với thêm 1 = 0!) 1 !, 2 !, 3 !,… được sao chép vào dưới cùng *. {đọc đầu vào, nhân nó với các giai thừa và xuất ra chúng }.

5 GioD Dec 26 2020 at 12:34

Thạch , 4 byte

J’!×

Nhận đầu vào dưới dạng danh sách các hệ số.

Giải trình

J’!×

J   | Returns an array of elements from 1 to length of input array
 ’  | Subtracts 1 from each
  ! | Factorial each
   ×| Multiply each item in the original array by the created array

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

5 Bubbler Dec 28 2020 at 13:02

APL (Dyalog Unicode) , 3 byte

×∘!

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

Đưa I / O tự do đến cực điểm: lấy đa thức \$ 3x^4 + 2x^2+x-4 \$dưới dạng hai đối số, các hệ số ở bên trái và lũy thừa ở bên phải theo thứ tự giảm dần và bao gồm các số hạng bằng không, như trong 3 0 2 1 ¯4 f 4 3 2 1 0. Trả về đa thức dưới dạng véc tơ hệ số.

4 ZaelinGoodman Dec 28 2020 at 22:48

PowerShell , 28 byte

Nhập dưới dạng danh sách các hệ số

$p++;$args|%{$p*$_;$p*=++$i}

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

3 Razetime Dec 26 2020 at 12:56

APL (Dyalog Unicode) , 7 byte

⊢×!∘⍳∘≢

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

Sử dụng ⎕IO←0(0-indexing)

Đầu vào dưới dạng danh sách các hệ số.

3 att Dec 26 2020 at 09:44

Ngôn ngữ Wolfram (Mathematica) , 10 byte

#2!#&@@@#&

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

Nhập danh sách các cặp hệ số / công suất, bao gồm các hệ số bằng không, được sắp xếp theo công suất và xuất ra danh sách các hệ số tương ứng.


Tích hợp dài hơn: 23 byte

LaplaceTransform[#,t,]&

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

Nhập một đa thức về tvà xuất ra một theo Null.

2 Neil Dec 26 2020 at 06:40

Retina , 30 byte

L$`.+ $&$:&* +`\d+_ $.(*$(_$%'

Hãy thử nó trực tuyến! I / O là một danh sách các hệ số được phân tách bằng dòng mới từ mức thấp nhất đến cao nhất. Giải trình:

L$`.+ $&$:&*

Đối với mỗi hệ số, thêm một số dấu gạch dưới tương ứng với mức độ của nó.

+`\d+_
$.(*$(_$%'

Cho đến khi không còn dấu gạch dưới, hãy nhân mỗi hệ số với số dấu gạch dưới sau đây, xóa một hệ số trong quá trình này.

2 user Dec 26 2020 at 06:36

Scala 3, 52 48 byte

p=>p.indices.scanLeft(1)(_*_.+(1))zip p map(_*_)

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

Đầu vào và đầu ra dưới dạng danh sách các số nguyên, từ mức thấp nhất đến cao nhất.

p.indicescung cấp cho chúng tôi một phạm vi từ 0 đến p.size - 1. Việc quét bên trái với phép nhân sẽ cung cấp giai thừa ở mỗi chỉ số, nhưng vì phần tử đầu tiên là 0 nên chúng ta cần thêm 1 (do đó _.+(1)). Sau đó, tất cả các thừa số được nén với các hệ số và nhân với nhau.

2 xnor Dec 26 2020 at 08:27

Python 2 , 39 byte

p=i=1
while 1:print p*input();p*=i;i+=1

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

Đầu vào và đầu ra là các hệ số, một trên mỗi dòng, bắt đầu bằng độ nhỏ nhất (số 0 gần nhất).

Nhận (coefficient, exponent)theo cặp hóa ra hơi lâu hơn.

p=1
while 1:x,i=input();print p*x;p*=i+1

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

2 Sean Dec 26 2020 at 13:16

Raku , 15 byte

*Z*1,|[\*] 1..*

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

[\*] 1..*là dãy vô hạn của các thừa số bắt đầu bằng 1!. Một bổ sung 1(cho 0!) được dán vào phía trước, sau đó toàn bộ điều được nén với phép nhân ( Z*) với chuỗi đầu vào duy nhất *.

2 Shaggy Dec 26 2020 at 17:00

Japt -m , 3 byte

*Vl

Hãy thử nó ở đây

2 pajonk Dec 26 2020 at 16:59

R , 34 28 25 byte

(x=scan())*gamma(seq(!x))

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

Khá đơn giản.
R thiếu một hàm giai thừa được đặt tên ngắn gọn, nhưng có gamma.
Tạo chuỗi xbằng cách sử dụng thủ thuật từ @Giuseppe .

2 Arnauld Dec 26 2020 at 06:15

JavaScript (ES6),  31  29 byte

I / O: danh sách các hệ số, từ cấp độ thấp nhất đến cao nhất.

a=>a.map((v,i)=>v*=p=i?p*i:1)

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

Đã nhận xét

a =>              // a[] = polynomial coefficients
  a.map((v, i) => // for each coefficient v at position i in a[]:
    v *=          //   multiply v by:
      p =         //     the updated factorial p, which is:
        i ?       //       if i > 0:
          p * i   //         multiplied by i
        :         //       else:
          1       //         initialized to 1
  )               // end of map()
2 Noodle9 Dec 26 2020 at 08:11

SageMath , 27 23 byte

Đã lưu 4 byte nhờ ovs !!!

lambda f:f.laplace(x,x)

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

Có một chức năng của \$x\$làm đầu vào và trả về biến đổi Laplace dưới dạng một hàm của \$x\$.

1 Neil Dec 26 2020 at 23:46

Than củi , 12 byte

IEA×ιΠ⊞Oυ∨κ¹

Hãy thử nó trực tuyến! Liên kết là phiên bản dài của mã. I / O là danh sách các hệ số từ mức độ thấp nhất đến cao nhất. Giải trình:

  A             Input array
 E              Map over elements
    ι           Current element
   ×            Multiplied by
     Π          Product of
        υ       Predefined empty list
      ⊞O        After pushing
         ∨      Logical Or of
          κ     Current index
           ¹    Literal 1
I               Cast to string
                Implicitly print
1 KevinCruijssen Jan 07 2021 at 14:57

05AB1E , 4 byte

εN!*

Hãy thử nó trực tuyến.

Hay cách khác:

ā<!*

Hãy thử nó trực tuyến.

Cả hai đều lấy danh sách các hệ số làm đầu vào.

Giải trình:

ε     # Map over each value of the (implicit) input-list
 N    #  Push the 0-based map-index
  !   #  Pop and take it's faculty
   *  #  Multiply it by the current value
      # (after the map, the resulting list is output implicitly)

ā     # Push a list in the range [1,length] based on the (implicit) input-list
 <    # Decrease each by 1 to make the range [0,length)
  !   # Take the faculty of each
   *  # And multiply it to the values at the same positions in the (implicit) input-list
      # (after which the result is output implicitly)