Многочлены Чебышёва (Chebyshev Polynomials)


26

Chebyshev Polynomials adalah keluarga polinomial ortogonal yang muncul di semua jenis tempat dalam matematika, dan mereka memiliki banyak sifat yang cukup menarik. Salah satu karakterisasi dari mereka adalah bahwa mereka adalah polinomial unik yang memuaskan .Tn(cos(x)) = cos(n*x)

Tantangan

Diberikan bilangan bulat negatif n, Anda harus menampilkan nPolinomial-Chebyshev. .Tn(x)

Definisi

The n-th Chebyshev Polinomial diberikan dengan mengikuti tiga istilah rekursi:

T0(x) = 1
T1(x) = x
Tn+1(x) = 2*x*Tn(x) - Tn-1(x)

Detail

Jika bahasa Anda memiliki tipe polinomial asli, Anda dapat menggunakannya sebagai output, jika tidak, Anda harus menampilkan daftar koefisien dalam urutan naik atau turun, atau sebagai string yang mewakili polinomial.

Contohnya

T0(x) = 1
T1(x) = x 
T2(x) = 2x^2 - 1
T3(x) = 4x^3 - 3 x
T4(x) = 8x^4 - 8x^2 + 1
T5(x) = 16x^5 - 20x^3 + 5x
T10(x) = 512x^10 - 1280x^8 + 1120x^6 - 400x^4 + 50x^2 - 1

Dalam format daftar derajat menurun kita akan mendapatkan dan dalam format derajat naik kita akan mendapatkanT3(x) = [4,0,-3,0]T3(x) = [0,-3,0,4]


Jika saya mengeluarkan daftar, dapatkah saya mengeluarkan 0 1(yaitu 0*x+1) untuk T_0?
Luis Mendo

Selama urutan monomial konsisten itu ok!
flawr

@ flawr tidak 2*x*(2*x**2 - 1) - xapa-apa sebagai output untuk 3 untuk bahasa dukungan polynom, atau apakah kita memerlukan representasi sebagai desc coeffs?
Uriel


2
Apakah ketidaktepatan titik apung dapat diterima? yaituT_5(n) = [0, 5, 3.55271e-15, -20, 0, 16]
mil

Jawaban:


15

Mathematica, 15 byte

#~ChebyshevT~x&

Tentu saja, Mathematica memiliki builtin.

Jika formulir input alternatif diizinkan (10 byte):

ChebyshevT

mengambil bilangan bulat ndan variabel.


3
Tidak bisa menebak, ya. : P
HyperNeutrino

14

Oktaf , 39 byte

@(n)round(2^n/2*poly(cos((.5:n)/n*pi)))

Cobalah online!

Penjelasan

cos((.5:n)/n*pi)membangun vektor dengan akar polinomial , yang diberikan oleh

masukkan deskripsi gambar di sini

polymemberikan polinomial monik dengan akar tersebut. Mengalikan dengan 2^n/2skala koefisien sesuai kebutuhan. roundmemastikan bahwa hasilnya bilangan bulat meskipun presisi numerik.


1
Pintar seperti biasa :)
flawr


10

Haskell , 62 byte

t n|n<2=1:[0|n>0]|x<-(*2)<$>t(n-1)++[0]=zipWith(-)x$0:0:t(n-2)

Cobalah online!

flawr menyimpan satu byte.


Ini sangat elegan! (Saya selalu lupa tentang zipWithoperasi vektor.)
flawr

1
Saya pikir Anda bahkan dapat menyimpan satu byte lagi dengan menggunakan penjaga t n|n<2=1:[0|n>0]|x<-(*2)<$>t(n-1)++[0]=zipWith(-)x$0:t(n-2)
:, dengan

Saya pikir Anda harus berubah 0:menjadi 0:0:- OP hanya melarang semacam ini nol.
Ørjan Johansen

7

CJam (21 byte)

1a2,qi{0X$+2f*@.-}*;`

Ini adalah program lengkap: ekuivalen dengan blok anonim sama panjangnya:

{1a2,@{0X$+2f*@.-}*;}

Demo online




5

MATL , 17 byte

lFTi:"0yhEbFFh-]x

Koefisien adalah output dalam urutan peningkatan derajat.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Untuk input n , kode ini menerapkan relasi rekursif n kali. Dua polinomial terbaru selalu disimpan di tumpukan. Ketika polinomial baru dihitung, yang tertua dihapus.

Pada akhirnya, polinomial kedua terakhir ditampilkan (polinomial terakhir dihapus), karena kami telah melakukan satu iterasi yang terlalu banyak.

l        % Push 1
FT       % Push [0 1]. These are the first two polynomials
i:"      % Input n. Do the following n times
  0      %   Push 0
  y      %   Duplicate most recent polynomial
  h      %   Concatenate: prepends 0 to that polynomial
  E      %   Multiply coefficients by 2
  b      %   Bubble up. This moves second-most recent polynomial to top
  FF     %   Push [0 0]
  h      %   Concatenate: appends [0 0] to that polynomial
  -      %   Subtract coefficients
]        % End
x        % Delete. Implicitly display

4

Jelly , 18 byte

Cr1µ’ßḤ0;_’’$ß$µỊ?

Cobalah online!

Mengembalikan daftar koefisien dalam urutan menaik.

Ada solusi lain untuk 17 byte dengan ketidakakuratan floating-point.

RḤ’÷Ḥ-*ḞÆṛæ«’µ1Ṡ?

Cobalah online!

Penjelasan

Cr1µ’ßḤ0;_’’$ß$µỊ?  Input: integer n
                Ị   Insignificant - abs(n) <= 1
                    If true, n = 0 or n = 1
   µ                  Monadic chain
C                       Complement, 1-x
 r1                     Range to 1
                    Else
               µ      Monadic chain
    ’                   Decrement
     ß                  Call itself recursively
      Ḥ                 Double
       0;               Prepend 0
         _              Subtract with
            $             Monadic chain
          ’’                Decrement twice
              $           Monadic chain
             ß              Call itself recursively


2

Ruby + polinomial , 59 58 + 13 = 72 71 byte

Menggunakan -rpolynomialbendera.

f=->n{x=Polynomial.new 0,1;n<2?[1,x][n]:2*x*f[n-1]-f[n-2]}

2

J , 33 byte

(0>.<:)2&*1:p.@;9:o._1^+:%~1+2*i.

Cobalah online!

Diasumsikan bahwa ketidakakuratan titik mengambang dapat diterima dan menciptakan emoji (0>.<:)

Untuk 41 byte , ada solusi lain yang menghindari mengapung.

(0&,1:)`(-&2((-,&0 0)~2*0&,)&$:<:)@.(>&1)

Cobalah online!



2

Aksioma, 40 byte

f(n,x)==(n<2=>x^n;2*x*f(n-1,x)-f(n-2,x))

hasil

(9) -> for i in [0,1,2,3,4,5,10] repeat output ["f(y)",i,"=", f(i,y)]
   ["f(y)",0,"=",1]
   ["f(y)",1,"=",y]
                   2
   ["f(y)",2,"=",2y  - 1]
                   3
   ["f(y)",3,"=",4y  - 3y]
                   4     2
   ["f(y)",4,"=",8y  - 8y  + 1]
                    5      3
   ["f(y)",5,"=",16y  - 20y  + 5y]
                      10        8        6       4      2
   ["f(y)",10,"=",512y   - 1280y  + 1120y  - 400y  + 50y  - 1]
                                                               Type: Void

dimungkinkan mendefinisikan satu hukum substitusi untuk rumus dalam Aksioma penggunaan fungsi f () untuk ekspansi cos (n * x) di mana n adalah satu bilangan bulat

(9) -> o:=rule cos(n*%y)==f(n,cos(%y))
   (9)  cos(%y n) == 'f(n,cos(%y))
                    Type: RewriteRule(Integer,Integer,Expression Integer)
                                                              Time: 0 sec
(10) -> b:=o cos(20*x)
   (10)
                 20                18                16                14
     524288cos(x)   - 2621440cos(x)   + 5570560cos(x)   - 6553600cos(x)
   +
                  12                10               8              6
     4659200cos(x)   - 2050048cos(x)   + 549120cos(x)  - 84480cos(x)
   +
               4            2
     6600cos(x)  - 200cos(x)  + 1
                                                 Type: Expression Integer
                       Time: 0.48 (EV) + 0.02 (OT) + 0.10 (GC) = 0.60 sec

1

C # (.NET Core) , 126 byte

f=n=>n==0?new[]{1}:n==1?new[]{0,1}:new[]{0}.Concat(f(n-1)).Select((a,i)=>2*a-(i<n-1?f(n-2)[i]:0)).ToArray();

Hitungan byte juga mencakup:

using System.Linq;

Cobalah online!

Fungsi mengembalikan polinomial sebagai array koefisien dalam urutan menaik (dari x^0ke x^n)

Penjelasan:

f = n =>                          // Create a function taking one parameter (int)
    n == 0 ? new[] { 1 } :        // If it's 0, return collection [1]
    n == 1 ? new[] { 0, 1 } :     // If it's 1, return collection [0,1] (so x + 0)
    new[] { 0 }                   // Else create new collection, starting with 0
        .Concat(f(n - 1))         // Concatenate with f(n-1), effectively multiplying polynomial by x
        .Select((a, i) => 2 * a - (i < n - 1 ? f(n - 2)[i] : 0))
                                  // Multiply everything by 2 and if possible, subtract f(n-2)
        .ToArray();               // Change collection to array so we have a nice short [] operator
                                  // Actually omitting this and using .ElementAt(i) is the same length, but this is my personal preference

1

JavaScript (ES6), 65 byte

f=n=>n?n>1?[0,...f(n-1)].map((e,i)=>e+e-(f(n-2)[i]||0)):[0,1]:[1]

Tidak efisien untuk ukuran besar n. Menarik tapi sayangnya juga tidak efisien:

n=>[...Array(n+1)].map(g=(m=n,i)=>i<0|i>m?0:m<2?i^m^1:g(m-1,i-1)*2-g(m-2,i))

Sangat efisien untuk 68 byte:

f=(n,a=[1],b=[0,1])=>n?f(n-1,b,[0,...b].map((e,i)=>e+e-(a[i]||0))):a

Mengembalikan array koefisien dalam urutan menaik.

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.