Многочлены Чебышёва (체비 쇼프 다항식)


26

체비 쇼프 다항식 은 모든 종류의 수학에서 나타나는 직교 다항식의 패밀리이며 매우 흥미로운 특성을 가지고 있습니다. 그것들의 한 특징은 그것들이 만족하는 유일한 다항식이라는 것이다.Tn(cos(x)) = cos(n*x)

도전

음수가 아닌 정수가 주어지면 -th Chebyshev Polynomial을 n출력해야합니다 n. .Tn(x)

정의

-세 n번째 Chebyshev 다항식은 다음과 같은 세 가지 용어 재귀에 의해 제공됩니다.

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

세부

언어에 고유 다항식 유형이있는 경우 해당 언어를 출력으로 사용할 수 있습니다. 그렇지 않으면 계수 목록을 오름차순 또는 내림차순으로 또는 다항식을 나타내는 문자열로 출력해야합니다.

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

내림차순 학위 목록 형식 으로, 오름차순 학위 형식으로,T3(x) = [4,0,-3,0]T3(x) = [0,-3,0,4]


목록을 출력하면에 대해 0 1(즉 0*x+1) 출력 할 수 T_0있습니까?
루이스 멘도

단식의 순서가 일정하다면 괜찮습니다!
flawr

@flawr은 2*x*(2*x**2 - 1) - x다항식 지원 언어에 대해 3의 출력으로 정상입니까, 아니면 desc coeffs로 표시해야합니까?
Uriel


2
부동 소수점 부정확성이 허용됩니까? 즉T_5(n) = [0, 5, 3.55271e-15, -20, 0, 16]
마일

답변:


15

Mathematica, 15 바이트

#~ChebyshevT~x&

물론 Mathematica는 내장되어 있습니다.

대체 입력 양식이 허용되는 경우 (10 바이트) :

ChebyshevT

정수 n와 변수를받습니다.


3
추측 할 수 없었습니다. : P
HyperNeutrino



10

하스켈 , 62 바이트

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

온라인으로 사용해보십시오!

flawr는 바이트를 저장했습니다.


이것은 매우 우아합니다! (나는 zipWith벡터 연산을 잊어
버린다

1
난 한 번 더 바이트 저장 가드를 사용하여 당신이 할 수있는 생각한다 t n|n<2=1:[0|n>0]|x<-(*2)<$>t(n-1)++[0]=zipWith(-)x$0:t(n-2), 방법이 : 마지막 줄에 괄호의 중간 쌍을 제거 할 수 있습니다
flawr

난 당신이 변화에 생각 0:0:0:그냥 제로를 건너 뛰는 이런 종류의 허용 OP -.
Ørjan Johansen

7

CJam (21 바이트)

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

이것은 전체 프로그램입니다 : 익명 블록과 같은 길이는 같습니다 :

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

온라인 데모




5

MATL , 17 바이트

lFTi:"0yhEbFFh-]x

계수는 차수에 따라 출력됩니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오. .

설명

입력 n의 경우, 코드는 재귀 관계 n을 적용합니다 번 . 가장 최근의 두 개의 다항식은 항상 스택에 유지됩니다. 새로운 다항식이 계산되면 가장 오래된 것이 제거됩니다.

마지막으로 너무 많은 반복을 수행 했으므로 두 번째 마지막 다항식이 표시됩니다 (마지막 다항식이 삭제됨).

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

젤리 , 18 바이트

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

온라인으로 사용해보십시오!

계수 목록을 오름차순으로 반환합니다.

부동 소수점 부정확성을 가진 17 바이트에 대한 또 다른 솔루션이 있습니다 .

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

온라인으로 사용해보십시오!

설명

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

루비 + 다항식 , 59 58 + 13 = 72 71 바이트

-rpolynomial플래그를 사용합니다 .

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



2

공리, 40 바이트

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

결과

(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

Axiom에서 공식에 대한 하나의 대체 법칙을 정의하여 cos (n * x)의 확장을 위해 f () 함수를 사용할 수 있습니다. 여기서 n은 하나의 정수입니다.

(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 코어) 126 바이트

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

바이트 수에는 다음이 포함됩니다.

using System.Linq;

온라인으로 사용해보십시오!

이 함수는 다항식을 계수의 배열로 오름차순으로 반환 x^0합니다.x^n )

설명:

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

자바 스크립트 (ES6), 65 바이트

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

큰 비효율적입니다 n. 흥미롭지 만 슬프게도 비효율적입니다.

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

68 바이트에 매우 효율적 :

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

계수 배열을 오름차순으로 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.