Üstel Üretim Fonksiyonu Teğet olan Diziyi Golf


15

Hemen hemen her fonksiyon sonsuz terimli bir polinom olarak ifade edilebilir.

Örneğin, e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ...

Örneğin, sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...

n-Th terimlerinin katsayıları bir sekans oluşturur ve buna karşılık gelen fonksiyona sekansın Üretici Fonksiyonu denir .

n-10 terimlerin katsayıları bir dizi oluşturur.

Genellikle, n-dönem bir paydaya sahip olur n!. Bu nedenle, Üstel Üretme Fonksiyonu orijinal fonksiyon olacak n!başka bir sekans elde etmek için katsayıyı çarpıyoruz .

Örneğin,, sekansı Üstel Yaratma Fonksiyon olduğu e^xolacaktır 1,1,1,1,....

Örneğin,, sekansı Üstel Yaratma Fonksiyon olduğu sin(x)olacaktır 0,1,0,-1,0,1,0,-1,....

Görev

Göreviniz bulmaktır ndizisinin ıncı terimini Üstel Yaratma İşlevi olduğunu 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

( Buradan kopyalanır .) (Uyarı 0:. Terim farklıdır)

Örnek uygulama

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

Boşver!

Referanslar


4
Fonksiyon oluşturma ve matematikte, özellikle kombinatorik ve sayı teorisinde kullanımları hakkında daha fazla bilgi edinmek istiyorsanız, H. Wilf tarafından yazılan bu "ünlü" ders kitabı oluşturma işlevini tavsiye ederim .
flawr

5
(Direnemez): kelimenin tam anlamıyla alındığında, ilk cümleniz son derece yanlış!
Suçlu

"Üreteç fonksiyonu" ve "üstel üretme fonksiyonu" terimlerini geri almanız gerekir. $ \ sin (x) $, 0,1,0, -1,0,1,0, -1,0, ... dizisinin üstel üretme işlevidir - üstel üretme işlevi olan dizi değildir $ \ sin (x) $. Bizi yapmasını istediğiniz şey, $ \ tan (x) $ tarafından katlanarak oluşturulan diziyi kodlamaktır.
Glen O

"Buna o işlevin Oluşturma İşlevi de denir. N. Terimlerin katsayıları bir dizi oluşturur." Dışında, "n. Th terimlerin katsayıları bir dizi oluşturur ve" msgstr "" "ilgili işleve, dizinin Üretme İşlevi denir".
Glen O

@GlenO Düzenlendi.
Leaky Nun

Yanıtlar:


8

CJam ( 33 32 27 26 23 20 bayt)

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

Çevrimiçi demo

teşrih

Bu esasen xnor tarafından açıklanan nüksü uygular .

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

Veya 23 bayt için oldukça farklı bir yaklaşımla:

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

Çevrimiçi demo . Dennis'e 3 bayt için teşekkürler.

teşrih

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

Veya 29 bayt için çok farklı bir yaklaşımla:

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

Çevrimiçi demo

Maalesef giriş için özel bir durum gereklidir 0.

teşrih

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 ?! Yanlış soruyu cevaplıyor" diye düşünüyor olabilirsiniz. Eğer öyleyse, bu anlaşılabilir, ancak her iki yaklaşım da gerçekten doğru sonuçları vermektedir .


Ot yardımcı olursa, TIO üzerindeki her gece için boş bir dizi döndürür [WW]3ew.
Dennis

@Dennis, teşekkürler. Bununla birlikte, bunun 0özel bir durum olması gerektiği ortaya çıkıyor , çünkü değerlendiriyor 1.
Peter Taylor

1
Biri, yanlış bir soruyu yalnızca bağlantımı tıklamamışsanız yanıtladığınızı düşünür.
Sızan Rahibe

ri_1&a{{1$+}*]W%0+}@*0=3 bayt kaydeder.
Dennis

2
@LeakyNun, o zaman bu herkes olur. Bu bağlantı listesini gördüm ve tl; dr.
Peter Taylor

7

Julia, 40 38 32 bayt

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

Girdi ve çıktı BigFloats şeklindedir . Çevrimiçi deneyin!

Arka fon

Teğet fonksiyonunun Maclaurin serisi kimliği tatmin eder

her x yakınsama yarıçapı yalan, B , n , bir Bernoulli sayıdır.

Yana B 2 (n + 1) ve (1) N , aynı işaret sahip B 2n + 1 = 0 ise , n> 0 ve B 1 = 1/2 , biz yeniden Aşağıdaki gibi, yukarıda.

Dahası, n negatif olmayan bir tam sayı olduğunda,

burada ζ belirtmektedir Riemann zeta fonksiyonu .

Bundan, kongre ile 0 0 = 1 , öyle izler

uygulamanın kullandığı formül.


6

Python, 57 bayt

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

Daha az golf:

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)

iTeğetsel fonksiyon isürelerini farklılaştırarak ve 'de değerlendirerek üstel üretme fonksiyonunun katsayısını hesaplayabiliriz 0. Her bir türev, içinde bir polinomdur tan(x)ve 0'daki değeri sabit terimidir.

Biz yinelemeli katsayısı ifade tan(x)**jiçinde ibir inci türevi tanfonksiyonu ile f(i,j). Özyinelemeli ifade ilişkiden gelir tan(x)' = 1 + tan(x)**2.

Yani, türev tan(x)**jDİR

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

Yani, katkıda bulunanlar tan(x)**jiçinde iinci türevi olan tan(x)**(j-1)ve tan(x)**(j+1)içinde (i-1)'türevinin, katsayı ile her biri iktidara eşittir. Bu özyinelemeli ifade verir

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

Negatif üsleri hariç tutmamız gerekmediğini unutmayın, jçünkü yine de sıfıra eşitlerler ve çaprazlama j=0çarpanı verdiği için katkıda bulunmazlar 0.

Bir temel durum i==0için karşılık gelir tan(x)ile kendini j==1Aksi belirtilmediği taktirde ve sıfır katsayı. Son değerlendirme j=0, varsayılan değer olarak konulan sabit terimde gerçekleşir .


Bu, CJam'de 20 bayta ulaşır. Birincil cevabımı yapmamın sakıncası var mı, yoksa bağlantı noktası göndermek ve göndermek mi istiyorsunuz?
Peter Taylor

Göndermelisin, bilmiyorum CJam.
xnor

4

Mathematica, 20 bayt

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

Basit yaklaşım. Hesaplayın n inci türevi tan (x) ve en değerlendirmek x = 0 .

kullanım

Misal


3

Haskell, 48 bayt

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

iTeğetsel fonksiyon isürelerini farklılaştırarak ve 'de değerlendirerek üstel üretme fonksiyonunun katsayısını hesaplayabiliriz 0. Her bir türev, içinde bir polinomdur tan(x)ve 0'daki değer, sabit terimidir.

Biz yinelemeli katsayısı ifade tan(x)^jiçinde ibir inci türevi tanfonksiyonu ile i%j. Özyinelemeli ifade ilişkiden gelir tan(x)' = 1 + tan(x)^2.

Yani, türev tan(x)^jDİR

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

Yani, katkıda bulunanlar tan(x)^jiçinde iinci türevi olan tan(x)^(j-1)ve tan(x)^(j+1)içinde (i-1)'türevinin, katsayı ile her biri iktidara eşittir.


3

Jöle , 12 11 bayt

Ṛ+\;S
ḂÇ⁸¡Ḣ

Gibi Peter Taylor'ın CJam cevap , bu hesaplar n inci dönem Euler dizisi aşağı / yukarı var ise n bile garip ve özel durumlar olduğunu n olarak 0'a .

Çevrimiçi deneyin!veya tüm test senaryolarını doğrulayın .

Nasıl çalışır

ḂÇ⁸¡Ḣ  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

Adaçayı, 26 bayt

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

Matematiğe yönelik dillerdeki diğer çözümler gibi, bu işlev de ntürevini hesaplar tan(x)ve değerlendirir x = 0.

Çevrimiçi deneyin


2

J, 15 13 bayt

Yerleşik bulunmaktadır t:hesaplar n inci üslü oluşturma işlevini katsayısı tan (x) .

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

@ Leaky Nun'e , 2 bayt tasarruf sağlayan J'deki Taylor serisi zarflarını hatırlattığı için teşekkürler .

15 bayt için alternatif .

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

Diğer bir yaklaşım, hesaplanmasıdır n inci türevi tan (x) ve en değerlendirmek x = 0 .

Not: J'de , türev işlevi tarafından kullanılan bellek miktarı, n 10'u geçtikçe d.hızla büyür .

kullanım

   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

açıklama

(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 bayt

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

Dennis sayesinde 2 bayt tasarruf etti.

En kısa Julia çözümü değil (bkz Dennis'in çözümü), ama bu tamamen türev mantık kullanılarak yapılır ... matrisler şeklinde.

Temel olarak, tan (x) türevinin 1 + tan (x) ^ 2 olduğu gerçeğini kullanır. Dolayısıyla, tan (x) 'in herhangi bir gücünün türevi olduğu için, tan (x) ^ k, k tan (x) ^ (k-1) tan (x)' = k tan (x) ^ (k-1) diyelim + k tan (x) ^ (k + 1), ikinci bir sıra veya sütun tan (x) 'nin türevlerini tutan genişlemeyi oluşturmak için uygun değerlere sahip bir matris üzerinde basit bir matris gücü kullanabiliriz ) kendisi.

Dolayısıyla, sonuçtaki ifadedeki sabiti bulmamız gerekir ve bu karşılık gelen satır veya sütundaki ilk değerdir.


!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]çalışmalı.
Dennis

@Dennis - güzel av. spdiagmBu inşaat tarzına izin vereceğini fark diagmetmedim - denedi , ama elbette işe yaramadı.
Glen O

2

JavaScript (ES6), 127 45 bayt

f=(n,m=0)=>n?++m*f(--n,m--)+--m*f(n,m):m-1?0:1

@ Xnor'ın çözümlerinin limanı.


0

Haskell, 95 93 bayt

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

Temel olarak genel formülün bazı küçük optimizasyonlarla uygulanmasıdır.


0

Sembolik Araç Kutusu ile MATLAB, 84 bayt

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

Örnek çalıştırmalar:

>> 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 (çok fazla bayt)

Yalnızca listelerdeki işlemleri ve Raymond Manzoni'nin sonucunu kullanma :

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

Ne yazık ki, bu değerleri nkullandığı için mütevazı değerleri için taşar Int. IntegerDeğerleri kullanarak sorunu çözmeye çalışacağım . O zamana kadar önerilerinizi bekliyoruz.


0

Aksiyom, 46 bayt

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

test kodu ve sonuçları

(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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.