ค้นหาค่าสัมประสิทธิ์ของฟังก์ชั่นการสร้างเหตุผล


12

หากเราเขียนลำดับของตัวเลขเป็นค่าสัมประสิทธิ์ของชุดพลังงานชุดพลังงานนั้นจะเรียกว่า (ธรรมดา) ฟังก์ชันสร้าง (หรือ Gf) ของลำดับนั้น นั่นคือถ้าสำหรับฟังก์ชันF(x)และชุดของจำนวนเต็มa(n)เรามี:

a(0) + a(1)x + a(2)x^2 + a(3)x^3 + a(4)x^4 + ... = F(x)

จากนั้นเป็นหน้าที่ของการสร้างF(x) aตัวอย่างเช่นชุดรูปทรงเรขาคณิตบอกเราว่า:

1 + x + x^2 + x^3 + x^4 + ... = 1/(1-x)

ดังนั้นการสร้างฟังก์ชั่นของการมี1, 1, 1, ... 1/(1-x)หากเราแยกความแตกต่างทั้งสองข้างของสมการข้างบนและคูณด้วยxเราจะได้ความเสมอภาคต่อไปนี้:

x + 2x^2 + 3x^3 + 4x^4 + ... = x/(1-x)^2

ดังนั้นการสร้างฟังก์ชั่นของการมี1, 2, 3, ... x/(1-x)^2การสร้างฟังก์ชั่นเป็นเครื่องมือที่ทรงพลังมากและคุณสามารถทำสิ่งที่มีประโยชน์มากมายกับพวกเขา คำแนะนำสั้น ๆ สามารถพบได้ที่นี่แต่สำหรับคำอธิบายที่ละเอียดมาก ๆ มีฟังก์ชั่นการสร้างหนังสือที่น่าทึ่ง


ในการท้าทายนี้คุณจะรับฟังก์ชั่น rational (ความฉลาดทางของสองชื่อประกอบด้วยหลายค่าสัมประสิทธิ์จำนวนเต็ม) เป็นอินพุทเป็นสองอาร์เรย์ของสัมประสิทธิ์จำนวนเต็มแรกคือตัวเศษแล้วตัวส่วน ตัวอย่างเช่นฟังก์ชั่นf(x) = x / (1 - x - x^2)จะถูกเข้ารหัสเช่นเดียวกับ[0, 1], [1, -1, -1]ในอินพุต

โปรแกรมของคุณจะต้องพิมพ์ค่าสัมประสิทธิ์ของซีรีย์พาวเวอร์ที่เท่ากับฟังก์ชั่นการสร้างหนึ่งค่าต่อบรรทัดโดยเริ่มจากสัมประสิทธิ์xแล้วx^2เป็นต้น


ตัวอย่าง:

[1], [1, -1] -> 1, 1, 1, 1, 1, 1, 1, ...
[1], [2, -2] -> 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, ...
[0, 1], [1, -2, 1] -> 1, 2, 3, 4, 5, 6, 7, 8, ...
[0, 1], [1, -1, -1] -> 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
[1], [1, -2] -> 1, 2, 4, 8, 16, 32, 64, 128, ...
[0, 1, 1], [1, -3, 3, -1] -> 1, 4, 9, 16, 25, 36, ...

อึภาษาของฉันถูกสร้างขึ้นสำหรับลำดับนี้ แต่ฉันไม่สามารถป้อนอาร์เรย์หลายมิติได้อย่างแท้จริง :(
Stephen

2
ฉันแค่คิดเชิงคณิตศาสตร์ไม่เพียงพอสำหรับสเป็คนี้โอกาสใด ๆ ที่คุณสามารถโพสต์คำอธิบายเพิ่มเติมของคนธรรมดาสามัญสำหรับเรา
Skidsdev


1
@trichoplax ที่บังคับให้ตัวเศษเป็น 1 เสมอซึ่งไม่เหมือนกัน ตัวอย่างเช่นมันไม่สามารถแสดงตัวอย่างสุดท้ายของฉันสี่เหลี่ยม
orlp

1
อีกทางเลือกหนึ่งของการใช้ถ้อยคำนี้คือการประเมินการเกิดซ้ำเชิงเส้นทั่วไป ด้วยวิธีการนี้จะทำให้คำถามนี้ทั่วไปและอาจใช้เป็นเป้าหมายล่อสำหรับคำถามที่เกิดซ้ำในอนาคต
Peter Taylor

คำตอบ:


7

Haskell , 63 ไบต์

z=0:z
(a:b)%y@(c:d)=a/c:zipWith(-)(b++z)(map(a/c*)d++z)%y
_%_=z

ลองออนไลน์!

กำหนดโอเปอเรเตอร์ที่%ส่งคืนรายการค่าสัมประสิทธิ์ไม่ จำกัด จำนวนอนันต์ รายการถูกทำดัชนีเป็นศูนย์ดังนั้นรวมสัมประสิทธิ์คงที่


3

Mathematica, 64 83 90 ไบต์

Do[Echo@Limit[D[#/#2/i!&@@Fold[x#+#2&]/@#,{x,i}],x->0],{i,∞}‌​]&

ขอบคุณ @ngenisis และ @Jenny_mathy!

รับข้อมูลเป็นสองรายการ

จำเป็นต้องAlt+.ยุติการดำเนินการเพื่อดูผลลัพธ์ ส่วนหน้าอาจมีปัญหาเนื่องจากการส่งออกที่รวดเร็ว

รุ่น 83 ไบต์ (@Jenny_mathy):

i=1;v=Tr[#*x^Range@Length@#]&;While[1<2,Echo@Limit[D[v@#/v@#2/i!,{x,i}],x->0];i++]&

83 ไบต์: i = 1; v = Tr [# * x ^ Range @ Length @ #] &; ในขณะที่ [1 <2, Echo @ Limit [D [v @ # / v @ # 2 / i !, {x, i}], x -> 0]; i ++] &
J42161217

@Jenny_mathy ขออภัยที่รบกวน ฉันพบว่ามีอักขระ Unicode ที่มองไม่เห็นในความคิดเห็นแรกของคุณ เมื่อทำความสะอาดแล้วรหัสก็โอเค
Keyu Gan

3
64Do[Echo@Limit[D[#/#2/i!&@@Fold[x#+#2&]/@#,{x,i}],x->0],{i,∞}]&ไบต์: สิ่งนี้ถือว่าอินพุตเป็นรายการของสองรายการและค่าสัมประสิทธิ์อยู่ในลำดับจากมากไปหาน้อย ในตัวเดียวที่ฉันรู้ว่าจะทำในสิ่งที่vเป็นInternal`FromCoefficientList
ngenisis

การใช้งานนี้ซ้ำ ๆ ฉันคิดว่าอาจต้องใส่วงเล็บสองสามอันiเข้าไปในแลมบ์ดา (ในทางกลับกันฉันไม่แน่ใจจริง ๆ ว่าความสามารถในการทำงานซ้ำ ๆ นั้นมีความเกี่ยวข้องหรือไม่เมื่อเป้าหมายคือการพิมพ์รายการที่ไม่มีที่สิ้นสุด ... มีมติเป็นเอกฉันท์เกี่ยวกับเรื่องนี้หรือไม่)
Julian Wolf

@ngenisis: คุณใช้เวอร์ชั่นอะไร เมื่อวันที่ V10.0 Iterator {i,∞} does not have appropriate boundsวิธีการแก้ปัญหาของคุณให้ฉัน
Julian Wolf

1

CJam (22 ไบต์)

{\{(W$(@\/_pW*f*.+1}g}

สาธิตออนไลน์ โปรดทราบว่าเป็นคำตอบที่มีอยู่จำนวนมากซึ่งรวมถึงสัมประสิทธิ์ 0 ในผลลัพธ์

การผ่า

{           e# Define a block which takes numerator N and denominator D as arguments
  \         e# Flip to put D at the bottom, since that won't change
  {         e# Infinite loop:
    (       e#   Pop the first element of (the modified) N
    W$(     e#   Copy D and pop its first element
            e#   Stack: D N[1:] N[0] D[1:] D[0]
    @\/     e#   Bring N[0] to top, flip, divide
            e#   Stack: D N[1:] D[1:] N[0]/D[0]
    _p      e#   Print a copy
    W*f*.+  e#   Multiply by -1, multiply all, pointwise add
            e#   Stack: D N[1:]-(N[0]/D[0])*D[1:]
  1}g
}

0

Mathematica, 86 79 ไบต์

f=x^Range@Length@#.#&;For[n=1,8>3,Print@SeriesCoefficient[f@#/f@#2,{x,0,n++}]]&

รับอินพุตเป็นสองรายการแยกกัน (ค่าสัมประสิทธิ์ตัวเลข, ค่าสัมประสิทธิ์ส่วน) หากอินพุตสามารถนำโดยตรงเป็นเศษส่วนของพหุนามแทนที่จะเป็นรายการของค่าสัมประสิทธิ์นี่อาจสั้นลงอย่างมีนัยสำคัญ

ดูเหมือนว่าDoสามารถทำงานกับขอบเขตไม่สิ้นสุดใน v11 ฉันไม่สามารถทดสอบภายในเครื่องนี้ได้ แต่ถ้าเป็นกรณีนี้โซลูชันนี้จะสั้นลงเหลือ75 ไบต์ :

f=x^Range@Length@#.#&;Do[Print@SeriesCoefficient[f@#/f@#2,{x,0,n}],{n,∞}]&

กรณีทดสอบครั้งสุดท้ายไม่ได้เริ่มต้นด้วย 0
J42161217

@ Jenny_mathy: ยิงขอบคุณสำหรับหัวขึ้น ดูเหมือนว่ากรณีทดสอบคาดว่าจะเริ่มต้นจากศูนย์แรกใน zeroth …ค่อนข้างแน่ใจว่านี่จะช่วยให้ฉันประหยัดได้ไม่กี่ไบต์
Julian Wolf

@ Jenny_mathy: ฉันคิดว่ากรณีทดสอบอาจไม่ชัด เริ่มnจาก 1 แทน0สิ่งนี้จะให้ผลลัพธ์เช่นเดียวกับโซลูชันของคุณ ทั้งสองล้มเหลว แต่ในกรณีทดสอบที่สองถึงครั้งสุดท้ายซึ่งวิธีนี้ผ่านเมื่อเริ่มต้นnจาก 0
Julian Wolf

0

Pyth , 23 ไบต์

JE#
KchQhJ=t-M.t,Q*LKJ0

ลองออนไลน์!

มันทำงานอย่างไร

                       Q = eval(input())
JE                     J = eval(input())
  #                    infinite loop:
 chQhJ                   Q[0]/J[0]
K                        assign that to K (and print it, because of the preceding newline)
              *LKJ       K times every element of J
            ,Q           [Q, that]
          .t      0      transpose, padding with 0s
        -M               subtract each pair
       t                 remove the first element
      =                  assign that back to Q

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.