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


26

Chebyshev Polynomialsเป็นชื่อพหุนาม orthogonal ที่ปรากฏขึ้นในสถานที่ทุกประเภทในวิชาคณิตศาสตร์และพวกเขามีคุณสมบัติที่น่าสนใจมากมาย หนึ่งในตัวละครของพวกเขาก็คือพวกเขาจะมีหลายชื่อที่ไม่ซ้ำกันที่ตอบสนองTn(cos(x)) = cos(n*x)

ท้าทาย

ด้วยจำนวนเต็มที่ไม่ใช่ค่าลบnคุณควรส่งออกn-th Chebyshev Polynomial .Tn(x)

คำนิยาม

n-th เซฟพหุนามจะได้รับจากสามต่อไปนี้เรียกซ้ำระยะ:

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?
Luis Mendo

ตราบใดที่คำสั่งของ monomials นั้นสอดคล้องกันก็โอเค!
ข้อบกพร่อง

@flawr ก็2*x*(2*x**2 - 1) - xโอเคเป็นเอาต์พุตสำหรับ 3 สำหรับ polynom supportive lang หรือเราต้องการการแทนค่าเป็น coeffs หรือไม่
Uriel


2
ความไม่ถูกต้องของจุดลอยตัวยอมรับได้หรือไม่? ieT_5(n) = [0, 5, 3.55271e-15, -20, 0, 16]
ไมล์

คำตอบ:


15

Mathematica ขนาด 15 ไบต์

#~ChebyshevT~x&

แน่นอนว่า Mathematica มีแบบในตัว

หากอนุญาตให้ป้อนข้อมูลทางเลือกรูปแบบ (10 ไบต์):

ChebyshevT

ใช้จำนวนเต็มnและตัวแปร


3
ไม่สามารถเดาได้ฮะ : P
HyperNeutrino

14

อ็อกเทฟ 39 ไบต์

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

ลองออนไลน์!

คำอธิบาย

cos((.5:n)/n*pi)สร้างเวกเตอร์ด้วยรากของพหุนามที่กำหนดโดย

enter image description here

polyให้พหุนาม monic กับรากเหล่านั้น การคูณด้วยการ2^n/2สเกลค่าสัมประสิทธิ์ตามที่ต้องการ roundทำให้แน่ใจว่าผลลัพธ์เป็นจำนวนเต็มทั้งๆที่มีความแม่นยำเชิงตัวเลข


1
ฉลาดเช่นเคย :)
ข้อผิดพลาด

11

Pari / GP 12 ไบต์

ใช่ในตัว สั้นกว่า Mathematica

polchebyshev

ลองออนไลน์!


ไม่มี builtin:

Pari / GP , 34 ไบต์

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

ลองออนไลน์!


ไม่polchebyshevใช้เวลาเพียงหนึ่งในการป้อนข้อมูลและกลับพหุนาม?
JungHwan Min

@JungHwanMin ใช่ xเป็นค่าเริ่มต้นที่ไม่แน่นอน
alephalpha

10

Haskell , 62 ไบต์

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

ลองออนไลน์!

ข้อบกพร่องบันทึกเป็นไบต์


นี่คือสง่างามมาก! (ฉันลืมเกี่ยวกับ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




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

J , 33 ไบต์

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

ลองออนไลน์!

สมมติว่าความไม่ถูกต้องของจุดลอยตัวเป็นที่ยอมรับและสร้างอิโมจิ (0>.<:)

สำหรับ41 ไบต์มีวิธีแก้ไขปัญหาอื่นที่หลีกเลี่ยงการลอย

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

ลองออนไลน์!



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 ให้ใช้ฟังก์ชัน f () ด้านบนเพื่อขยาย cos (n * x) โดยที่ 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 Core) , 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

JavaScript (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.