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


26

Chebyshev-Polynome sind eine Familie von orthogonalen Polynomen, die an vielen Stellen in der Mathematik auftauchen und viele interessante Eigenschaften haben. Eine Charakterisierung von ihnen ist, dass sie die einzigartigen Polynome sind, die befriedigen .Tn(cos(x)) = cos(n*x)

Herausforderung

Bei einer nichtnegativen Ganzzahl nsollten Sie das n-te Chebyshev-Polynom ausgeben . .Tn(x)

Definition

Das n-te Chebyshev-Polynom ergibt sich aus der folgenden dreifachen Rekursion:

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

Einzelheiten

Wenn Ihre Sprache einen nativen Polynomtyp hat, können Sie diesen als Ausgabe verwenden, andernfalls sollten Sie eine Liste von Koeffizienten in aufsteigender oder absteigender Reihenfolge oder als Zeichenfolge für ein Polynom ausgeben.

Beispiele

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

Im absteigenden Gradlistenformat würden wir und im aufsteigenden Gradformat würden wir erhaltenT3(x) = [4,0,-3,0]T3(x) = [0,-3,0,4]


Kann ich eine Liste ausgeben 0 1(dh 0*x+1) für T_0?
Luis Mendo

Solange die Reihenfolge der Monome konsistent ist, ist das in Ordnung!
Fehler

@flawr ist 2*x*(2*x**2 - 1) - xok als Ausgabe für 3 für polynomunterstützende Sprache, oder brauchen wir die Darstellung als desc-Koeffizienten?
Uriel


2
Sind Gleitkommaungenauigkeiten akzeptabel? dhT_5(n) = [0, 5, 3.55271e-15, -20, 0, 16]
Meilen

Antworten:


15

Mathematica, 15 Bytes

#~ChebyshevT~x&

Natürlich hat Mathematica eine eingebaute.

Wenn ein alternatives Eingabeformular zulässig ist (10 Byte):

ChebyshevT

nimmt eine ganze Zahl nund eine Variable.


3
Ich hätte es nicht erraten können. : P
HyperNeutrino

14

Oktave , 39 Bytes

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

Probieren Sie es online!

Erläuterung

cos((.5:n)/n*pi)Bildet einen Vektor mit den Wurzeln des Polynoms , gegeben durch

Bildbeschreibung hier eingeben

polygibt das monische Polynom mit diesen Wurzeln. Das Multiplizieren mit 2^n/2skaliert die Koeffizienten nach Bedarf. roundstellt sicher, dass die Ergebnisse trotz numerischer Genauigkeit ganzzahlig sind.


1
Clever wie immer :)
Fehler


10

Haskell , 62 Bytes

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

Probieren Sie es online!

flawr hat ein Byte gespeichert.


Das ist sehr elegant! (Ich vergesse immer wieder zipWithfür Vektoroperationen.)
Fehler

1
Ich denke, Sie können sogar ein weiteres Byte sparen, indem Sie Wachen verwenden: Auf t n|n<2=1:[0|n>0]|x<-(*2)<$>t(n-1)++[0]=zipWith(-)x$0:t(n-2)diese Weise können Sie das mittlere Klammernpaar in der letzten Zeile entfernen :)
Fehler

Ich denke, Sie müssen zu - OP wechseln 0:, 0:0:um diese Art des Überspringens der Nullen zu verhindern.
Ørjan Johansen

7

CJam (21 Bytes)

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

Dies ist ein vollständiges Programm: Das Äquivalent zu einem anonymen Block hat die gleiche Länge:

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

Online-Demo




5

MATL , 17 Bytes

lFTi:"0yhEbFFh-]x

Die Koeffizienten werden in aufsteigender Reihenfolge ausgegeben.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

Für die Eingabe von n wendet der Code die rekursive Beziehung n- mal an. Die zwei neuesten Polynome werden immer auf dem Stapel gehalten. Wenn ein neues Polynom berechnet wird, wird das älteste entfernt.

Am Ende wird das vorletzte Polynom angezeigt (das letzte Polynom wird gelöscht), da wir eine zu viele Iterationen durchgeführt haben.

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 Bytes

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

Probieren Sie es online!

Gibt eine Liste der Koeffizienten in aufsteigender Reihenfolge zurück.

Es gibt eine andere Lösung für 17 Bytes mit Gleitkommaungenauigkeiten.

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

Probieren Sie es online!

Erläuterung

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 + Polynom , 59 58 + 13 = 72 71 Bytes

Verwendet die -rpolynomialFlagge.

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



2

Axiom, 40 Bytes

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

Ergebnisse

(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

Es ist möglich, ein Substitutionsgesetz für die Formel in Axiom zu definieren, das über der Funktion f () zur Erweiterung von cos (n * x) verwendet wird, wobei n eine ganze Zahl ist

(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();

Die Byteanzahl umfasst auch:

using System.Linq;

Probieren Sie es online!

Die Funktion gibt ein Polynom als ein Array von Koeffizienten in aufsteigender Reihenfolge (von x^0bis x^n) zurück.

Erläuterung:

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]

Ineffizient für große n. Interessant aber leider auch ineffizient:

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

Sehr effizient für 68 Bytes:

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

Gibt ein Array von Koeffizienten in aufsteigender Reihenfolge zurück.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.