เล่นกอล์ฟลำดับที่มีฟังก์ชันสร้างชี้แจงแทนเจนต์


15

เกือบทุกฟังก์ชั่นสามารถแสดงเป็นพหุนามที่มีเงื่อนไขไม่สิ้นสุด

ตัวอย่างเช่น, e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ...

ตัวอย่างเช่น, sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...

สัมประสิทธิ์ของnคำศัพท์ -th สร้างลำดับและฟังก์ชันที่เกี่ยวข้องเรียกว่าฟังก์ชันการสร้างของลำดับ

ค่าสัมประสิทธิ์ของnคำศัพท์ -th สร้างลำดับ

บ่อยครั้งที่nคำที่ -th จะมีตัวn!ส่วน ดังนั้นเราจึงคูณค่าสัมประสิทธิ์โดยn!การหาลำดับอื่นซึ่งฟังก์ชันการสร้างเลขชี้กำลังจะเป็นฟังก์ชันดั้งเดิม

ยกตัวอย่างเช่นลำดับที่มีฟังก์ชั่นเอกฝ่ายคือจะเป็นe^x1,1,1,1,...

ยกตัวอย่างเช่นลำดับที่มีฟังก์ชั่นเอกฝ่ายคือจะเป็นsin(x)0,1,0,-1,0,1,0,-1,...

งาน

งานของคุณคือการหาnระยะ -th ของลำดับที่มีการชี้แจงสร้างฟังก์ชั่นtan(x)คือ

Testcases

n result
0 0
1 1
2 0
3 2
4 0
5 16
6 0
7 272
8 0
9 7936
10 0
11 353792
12 0
13 22368256
14 0
15 1903757312
16 0
17 209865342976
18 0
19 29088885112832
20 0
21 4951498053124096
22 0
23 1015423886506852352
24 0
25 246921480190207983616
26 0

(คัดลอกมาจากที่นี่ ) (คำเตือน: 0คำที่แตกต่างกัน)

ตัวอย่างการนำไปใช้

# copied from https://github.com/Mego/Seriously/blob/v2.0/SeriouslyCommands.py#L16
def memoized(f):
    memo = {}
    def m_fun(*args):
        if args in memo:
            return memo[args]
        else:
            res = f(*args)
            memo[args] = res
            return res
    return m_fun

# copied from https://github.com/Mego/Seriously/blob/v2.0/SeriouslyCommands.py#L169
@memoized
def binomial(n,r):
    if r > n:
        return 0
    elif r==n:
        return 1
    res = 1
    i = 1
    while i<=r:
        res *= (n+1-i)
        res /= i
        i+=1
    return int(res)

# 2*u(n+1) = Sum_{k=0..n} binomial(n, k)*u(k)*u(n-k)
# from A000111
@memoized
def u(n):
    if n<0: return 0
    if n==0: return 1
    if n==1: return 1
    return sum([binomial(n-1,k)*u(k)*u(n-1-k) for k in range(n)])//2     

def t(n):
    if n%2 == 0: return 0
    return u(n)

print('\n'.join([str(x) + ' ' + str(t(x)) for x in range(26)]))

ไอเดียมัน!

อ้างอิง


4
ถ้าคุณต้องการที่จะเรียนรู้เพิ่มเติมเกี่ยวกับการสร้างฟังก์ชั่นและการใช้งานของพวกเขาในวิชาคณิตศาสตร์โดยเฉพาะอย่างยิ่ง combinatorics และ numbertheory ผมขอแนะนำให้นี้ "ที่มีชื่อเสียง" ตำราgeneratingfunctionologyโดยเอชวิลฟ์
ข้อผิดพลาด

5
(ไม่สามารถต้านทานได้): ถ่ายตามตัวอักษรประโยคแรกของคุณผิดพลาดมาก!
Flounderer

คุณมีความหมายของ "การสร้างฟังก์ชั่น" และ "ฟังก์ชั่นการสร้างชี้แจง" ย้อนหลัง $ \ sin (x) $ เป็นฟังก์ชันสร้างเลขชี้กำลังของลำดับ 0,1,0, -1,0,1,0, -1,0, ... - ไม่ใช่ลำดับที่เป็นฟังก์ชันสร้างเลขชี้กำลัง ของ $ \ sin (x) $ สิ่งที่คุณขอให้เราทำคือการเขียนรหัสลำดับที่สร้างโดยชี้แจงโดย $ \ tan (x) $
เกลน O

ดูดียกเว้น "นี่เรียกว่า Generating Function ของฟังก์ชั่นนั้นสัมประสิทธิ์ของคำศัพท์ n-th เป็นลำดับ" ซึ่งอาจจะพูดอะไรบางอย่างเช่น "สัมประสิทธิ์ของคำศัพท์ n-th เป็นลำดับและ ฟังก์ชั่นที่เกี่ยวข้องนั้นเรียกว่าฟังก์ชันสร้างของลำดับ "
เกลน O

@GlenO แก้ไขแล้ว
Leun Nun

คำตอบ:


8

CJam ( 33 32 27 26 23 20 ไบต์)

2,{ee::*_(@+.+}ri*0=

การสาธิตออนไลน์

การผ่า

นี้เป็นหลักดำเนินการกำเริบอธิบายโดย XNOR

2,        e# [0 1] represents the base case f(0,j) = j==1
{         e# Loop...
  ee::*   e#   Multiply each array element by its index
  _(@+.+  e#   Sum the array shifted left and the array shifted right
}ri*      e# ... n times
0=        e# Evaluate at j=0

หรือด้วยวิธีที่ค่อนข้างแตกต่างกันสำหรับ 23 ไบต์:

ri_1&a{{1$+}*]W%0+}@*0=

สาธิตออนไลน์ ขอบคุณเดนนิสสำหรับ 3 ไบต์

การผ่า

1a         e# Push [1]
{          e# Repeat...
  {1$+}*]  e#   Compute array of partial sums
  W%0+     e#   Reverse and append 0
}qi:A*     e# ... A times, where A is the input value
0=A1&*     e# Result is first element if A odd, and 0 otherwise

หรือด้วยวิธีที่แตกต่างกันมากสำหรับ 29 ไบต์:

qie!Ma-{W\+W+3ew{_$.=1=},!},,

การสาธิตออนไลน์

0แต่น่าเสียดายที่เป็นกรณีพิเศษเป็นสิ่งจำเป็นสำหรับการป้อนข้อมูล

การผ่า

qi            e# Take an integer n from stdin
e!            e#   Compute all permutations of [0 ... n-1]
Ma-           e#   Special-case n=0
{             e#   Filter...
  W\+W+       e#     Prepend and postpend -1
  3ew         e#     Take slices of 3 consecutive elements
  {           e#     Filter...
    _$.=1=    e#       Test whether the middle element is the second largest
  },!         e#     ... and require no matches
},,           e#   ... and count

คุณอาจกำลังคิดว่า "WTF ?! เขาตอบคำถามผิด" ถ้าเป็นเช่นนั้นก็เป็นที่เข้าใจได้ แต่ทั้งสองวิธีจะให้ผลลัพธ์ที่ถูกต้องแน่นอน


ในกรณี OT ช่วยสร้างคืนใน TIO [WW]3ewส่งกลับอาร์เรย์ที่ว่างเปล่า
Dennis

@ เดนนิสขอบคุณ อย่างไรก็ตามมันกลับกลายเป็นว่า0จำเป็นต้องเป็นกรณีพิเศษอยู่ดีเพราะมันประเมิน1ว่า
Peter Taylor

1
มีใครคิดว่าคุณกำลังตอบคำถามที่ผิดถ้าไม่มีแม้แต่คลิกที่ลิงก์ของฉัน
Leun Nun

ri_1&a{{1$+}*]W%0+}@*0=บันทึก 3 ไบต์
Dennis

2
@LeakyNun ดังนั้นทุกคนคงเป็นเช่นนั้น ฉันเห็นรายการลิงก์และ tl; dr
Peter Taylor

7

จูเลีย40 38 32 ไบต์

!n=2(2*4^n-2^n-0^n)abs(zeta(-n))

อินพุตและเอาต์พุตอยู่ในรูปของBigFloats ลองออนไลน์!

พื้นหลัง

ซีรี่ส์ Maclaurin ของฟังก์ชั่นแทนเจนต์ตรงตามตัวตน

เมื่อใดก็ตามที่xอยู่ในรัศมีการบรรจบกันโดยที่B nคือหมายเลข Bernoulli

เนื่องจากB 2 (n + 1)และ(-1) nมีเครื่องหมายเหมือนกันB 2n + 1 = 0ถ้าn> 0และB 1 = 1/2เราจึงสามารถเขียนข้างต้นดังต่อไปนี้

นอกจากนี้เมื่อใดก็ตามที่nเป็นจำนวนเต็มไม่เป็นลบเราก็มี

ที่ζหมายถึงฟังก์ชั่นซีตา Riemann

จากนี้ด้วยการประชุม0 0 = 1ก็เป็นไปตามนั้น

ซึ่งเป็นสูตรการใช้งาน


6

Python ขนาด 57 ไบต์

f=lambda i,j=0:~-j*f(i-1,j-1)-~j*f(i-1,j+1)if i else j==1

หักกอล์ฟ:

f=lambda i,j=0:j==1 if i==0 else (j-1)*f(i-1,j-1)+(j+1)*f(i-1,j+1)

เราสามารถคำนวณiค่าสัมประสิทธิ์ TH ของฟังก์ชั่นการสร้างความแตกต่างที่ชี้แจงโดยฟังก์ชั่นสัมผัสครั้งและประเมินผลที่i 0อนุพันธ์แต่ละอันคือพหุนามtan(x)และค่าที่ 0 คือเทอมคงที่

เราซ้ำแสดงค่าสัมประสิทธิ์ของtan(x)**jในiอนุพันธ์ของวันที่มีฟังก์ชั่นtan การแสดงออกเวียนเกิดมาจากความสัมพันธ์f(i,j)tan(x)' = 1 + tan(x)**2

ดังนั้นอนุพันธ์ของtan(x)**jคือ

j*tan(x)**(j-1)*(tan(x)**2+1), or equivalently
j*tan(x)**(j+1) + j*tan(x)**(j-1)

ดังนั้นผู้มีส่วนร่วมtan(x)**jในiอนุพันธ์อันดับที่หนึ่งtan(x)**(j-1)และtan(x)**(j+1)ใน(i-1)อนุพันธ์อันดับที่สามซึ่งมีสัมประสิทธิ์เท่ากับกำลังของมัน สิ่งนี้จะช่วยให้การแสดงออกซ้ำ

f(i,j) = (j-1)*f(i-1,j-1) + (j+1)*f(i-1,j+1)

โปรดทราบว่าเราไม่จำเป็นต้องยกเว้นเลขชี้กำลังเชิงลบjเพราะพวกเขาประเมินเป็นศูนย์อยู่แล้วและไม่ได้มีส่วนร่วมเพราะข้ามให้คูณของj=00

กรณีฐานของi==0สอดคล้องกับtan(x)ตัวเองด้วยj==1และค่าสัมประสิทธิ์เป็นศูนย์เป็นอย่างอื่น การประเมินขั้นสุดท้ายเกิดขึ้นที่คำคงj=0ที่ซึ่งจะถูกกำหนดเป็นค่าเริ่มต้น


พอร์ตนี้มีขนาด 20 ไบต์ใน CJam คุณสนใจหรือไม่ถ้าฉันตอบคำถามนั้นเป็นหลักหรือคุณต้องการพอร์ตและโพสต์มัน?
Peter Taylor

คุณควรโพสต์มันฉันไม่รู้ CJam
xnor

4

Mathematica ขนาด 20 ไบต์

Tan@x~D~{x,#}/.x->0&

วิธีการตรงไปข้างหน้า คำนวณn THอนุพันธ์ของน้ำตาล (x)และประเมินผลได้ที่x = 0

การใช้

ตัวอย่าง


3

Haskell, 48 ไบต์

0%1=1
0%_=0
i%j=sum[k*(i-1)%k|k<-[j+1,j-1]]
(%0)

เราสามารถคำนวณiค่าสัมประสิทธิ์ TH ของฟังก์ชั่นการสร้างความแตกต่างที่ชี้แจงโดยฟังก์ชั่นสัมผัสครั้งและประเมินผลที่i 0อนุพันธ์แต่ละอันคือพหุนามtan(x)และค่าที่ 0 คือเทอมคงที่

เราซ้ำแสดงค่าสัมประสิทธิ์ของtan(x)^jในiอนุพันธ์ของวันที่มีฟังก์ชั่นtan การแสดงออกเวียนเกิดมาจากความสัมพันธ์i%jtan(x)' = 1 + tan(x)^2

ดังนั้นอนุพันธ์ของtan(x)^jคือ

j*tan(x)^(j-1)*(tan(x)^2+1), or equivalently
j*tan(x)^(j+1) + j*tan(x)^(j-1)

ดังนั้นผู้มีส่วนร่วมtan(x)^jในiอนุพันธ์อันดับที่หนึ่งtan(x)^(j-1)และtan(x)^(j+1)ใน(i-1)อนุพันธ์อันดับที่สามซึ่งมีสัมประสิทธิ์เท่ากับกำลังของมัน


3

เจลลี่ , 12 11 ไบต์

Ṛ+\;S
ḂÇ⁸¡Ḣ

เช่นเดียวกับปีเตอร์เทย์เลอร์คำตอบ CJamนี้คำนวณn TH ระยะเวลาของออยเลอร์ขึ้น / ลงลำดับถ้าnเป็นเลขคี่และกรณีพิเศษแม้nเป็น0

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

ḂÇ⁸¡Ḣ  Main link. Argument: n

Ḃ       Bit; yield n's parity.
 Ç⁸¡    Apply the helper link (Ç) n (⁸) times.
    Ḣ   Head; retrieve the first element of the resulting list.


Ṛ+\;S   Helper link. Argument: A (list or 1/0)

Ṛ       Cast A to list (if necessary) and reverse the result.
 +\     Take the cumulative sum.
   ;S   Append the sum of A.

3

Sage, 26 ไบต์

lambda n:tan(x).diff(n)(0)

เช่นเดียวกับการแก้ปัญหาอื่น ๆ ในภาษาคณิตศาสตร์ที่มุ่งเน้นฟังก์ชั่นนี้คำนวณnอนุพันธ์ของวันและประเมินผลได้ที่tan(x)x = 0

ลองออนไลน์


2

J, 15 13 ไบต์

นอกจากนี้ยังมีในตัวt:ซึ่งคำนวณn THค่าสัมประสิทธิ์ของฟังก์ชั่นการสร้างชี้แจงของผิวสีแทน (x)

(1&o.%2&o.)t:

ขอบคุณ @ Leaky Nun ที่ทำให้ฉันนึกถึงคำวิเศษณ์ชุด Taylor ใน J ซึ่งบันทึก 2 ไบต์

ทางเลือกสำหรับ15 ไบต์

3 :'(3&o.d.y)0'

อีกวิธีหนึ่งคือการคำนวณn THอนุพันธ์ของน้ำตาล (x)และประเมินผลได้ที่x = 0

หมายเหตุ: ในJจำนวนหน่วยความจำที่ใช้โดยฟังก์ชันอนุพันธ์d.เติบโตอย่างรวดเร็วเมื่อnผ่าน 10

การใช้

   f =: (1&o.%2&o.)t:
   f 7
272
   (,.f"0) i. 11  NB. Additional commands are just for formatting the output
 0    0
 1    1
 2    0
 3    2
 4    0
 5   16
 6    0
 7  272
 8    0
 9 7936
10    0

คำอธิบาย

(1&o.%2&o.)t:  Input: n
(         )    Define a monad (one argument function), call the input y
 1&o.          Get the trig function sin(x) and call it on y
      2&o.     Get the trig function cos(x) and call it on y
     %         Divide sin(y) by cos(y) to get tan(y)
           t:  Get the nth coefficient of the exponential generating series
               for that function and return

3 :'(3&o.d.y)0'  Input: n
3 :'          '  Define a monad (one argument function) with input y
     3&o.        Get the trig function tan(x)
           y     The input n
         d.      Get the nth derivative of tan(x)
             0   Evaluate the nth derivative at x = 0 and return

2

Julia, 39 37 ไบต์

!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]

บันทึก 2 ไบต์ขอบคุณ Dennis

ไม่ใช่วิธีจูเลียที่สั้นที่สุด (ดูวิธีแก้ปัญหาของเดนนิส) แต่สิ่งนี้ทำโดยใช้ลอจิกเชิงอนุพันธ์ ... ในรูปแบบของเมทริกซ์

โดยพื้นฐานแล้วมันใช้ความจริงที่ว่าอนุพันธ์ของ tan (x) คือ 1 + tan (x) ^ 2 ดังนั้นเนื่องจากอนุพันธ์ของพลังงานใด ๆ ของ tan (x), พูด tan (x) ^ k, คือ k tan (x) ^ (k-1) tan (x) '= k tan (x) ^ (k-1) + k tan (x) ^ (k + 1) เราสามารถใช้พลังงานเมทริกซ์อย่างง่ายบนเมทริกซ์ที่มีค่าที่เหมาะสมเพื่อสร้างการขยายตัวด้วยแถวที่สองหรือคอลัมน์ (ขึ้นอยู่กับการก่อสร้าง) ถืออนุพันธ์ของแทน (x ) เอง

ดังนั้นเราแค่ต้องการหาค่าคงที่ในนิพจน์ผลลัพธ์และนั่นคือค่าแรกในแถวหรือคอลัมน์ที่สอดคล้องกัน


!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]ควรทำงาน.
Dennis

@Dennis - จับได้ดี ไม่ทราบว่าspdiagmจะอนุญาตรูปแบบการก่อสร้าง - ลองใช้ด้วยdiagmแต่แน่นอนว่ามันไม่ทำงาน
เกลน O


0

Haskell, 95 93 ไบต์

p=product
f n=sum[(-1)^(n`div`2+j+1)*j^n*p[k-j+1..n+1]`div`p[1..n+1-k+j]|k<-[1..n],j<-[0..k]]

มันคือการใช้งานสูตรทั่วไปที่มีการปรับให้เหมาะสมเล็กน้อย


0

MATLAB พร้อม Symbolic Toolbox ขนาด 84 ไบต์

n=input('');syms x;c=coeffs(taylor(tan(x),'Order',n+1))*factorial(n);c(end)*mod(n,2)

ตัวอย่างการทำงาน:

>> n=input('');syms x;c=coeffs(taylor(tan(x),'Order',n+1))*factorial(n);c(end)*mod(n,2)
7
ans =
272

>> n=input('');syms x;c=coeffs(taylor(tan(x),'Order',n+1))*factorial(n);c(end)*mod(n,2)
8
ans =
0

>> n=input('');syms x;c=coeffs(taylor(tan(x),'Order',n+1))*factorial(n);c(end)*mod(n,2)
9
ans =
7936

0

Haskell (มากเกินไปไบต์)

ใช้การดำเนินการเฉพาะกับรายการและผลลัพธ์ของ Raymond Manzoni :

c n = last $ map numerator $ zipWith (*) (scanl (*) (1) [2,3..]) (intersperse 0 $ foldr (.) id (replicate n (\xs->(xs ++ [(1%(1+2*length xs)) * (sum (zipWith (*) xs (reverse xs)))]))) [1])

น่าเสียดายที่โอเวอร์โฟลว์นี้มีค่าพอประมาณnเนื่องจากใช้Intค่าต่างๆ ฉันจะพยายามแก้ไขปัญหาโดยใช้Integerค่า จนกว่าจะถึงตอนนั้นยินดีต้อนรับข้อเสนอแนะ


0

ความจริง 46 ไบต์

f(n:NNI):NNI==(n=0=>0;eval(D(tan(x),x,n),x=0))

รหัสสำหรับการทดสอบและผลลัพธ์

(32) -> [[i, f(i)] for i in 0..26]
   (32)
   [[0,0], [1,1], [2,0], [3,2], [4,0], [5,16], [6,0], [7,272], [8,0], [9,7936],
    [10,0], [11,353792], [12,0], [13,22368256], [14,0], [15,1903757312],
    [16,0], [17,209865342976], [18,0], [19,29088885112832], [20,0],
    [21,4951498053124096], [22,0], [23,1015423886506852352], [24,0],
    [25,246921480190207983616], [26,0]]
                                       Type: List List NonNegativeInteger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.