Fibonomial Katsayıyı Hesaplayın


11

Arka fon

Fibonacci dizisi şu şekilde tanımlanır:

f(1) = 1
f(2) = 1
f(n) = f(n-1) + f(n-2)

Faktöriyel, faktöriyel benzer şekilde, ilk n Fibonacci sayısının ürünüdür .

g(n) = f(1) * f(2) * ... * f(n-1) * f(n)

Binom katsayısına benzer Fibonomial katsayı,

a(n, 0) = 1
a(n, k) = g(n) / ( g(n-k) * g(k) )
        = f(n) * f(n-1) * ... * f(n-k+1) / ( f(1) * f(2) * ... * f(k) )

Görev

Amacınız n ve k negatif olmayan iki tamsayı verilen Fibonomial katsayıyı kn ile hesaplamak için bir fonksiyon veya program oluşturmaktır .

Test Durumları

a(0, 0) = 1
a(1, 1) = 1
a(2, 0) = 1
a(3, 2) = 2
a(8, 3) = 1092
a(11, 5) = 1514513
a(22, 7) = 7158243695757340957617
a(25, 3) = 49845401197200
a(50, 2) = 97905340104793732225
a(100, 1) = 354224848179261915075

kurallar

  • Bu yani kısa kod kazanır.
  • Yerleşiklere izin verilir.

İlişkili


Gerekirse, burada bir web sayfasıdır listelerde ilk 1335Fibonomial Katsayısı dizisindeki değerler.
R. Kap

Is a(50, 2)test durumu öncü eksik 9?
Joe

@SirBidenXVII Evet, haklısın bir rakamı kaçırdım.
mil

Yanıtlar:


1

Jöle , 16 bayt

0+⁸С1ḊP
;_/Ç€:/

Çevrimiçi deneyin!

Fibonacci-orial yardımcı bağlantısı için Dennis'e verilen krediler .

;_/Ç€:/     Main chain,  argument: [n,r]
 _/         Find n-r
;           Attach it to original: [n,r,n-r]
   ǀ       Apply helper link to each element, yielding [g(n),g(r),g(n-r)]
     :/     Reduce by integer division, yielding g(n)//g(r)//g(n-r)

0+⁸С1ḊP    Helper link, argument: n
0+⁸С1ḊP    Somehow return the n-th Fibonacci-orial.

4

Haskell, 46 bayt

l=0:scanl(+)1l;a%0=1;a%b=(a-1)%(b-1)*l!!a/l!!b

Çıkışlar yüzer. Sonsuz Fibonacci listesini oluşturur. Daha sonra, binomiyal geri dönüşü Fibonacci listesindeki elemanlarla çarpma ve bölme yapar.


4

Python 67 bayt

f=lambda n,a=1,b=1:n<1or a*f(n-1,b,a+b)
lambda n,k:f(n)/f(k)/f(n-k)

Kullanarak arayın a(n,k). @Dennis fibonorial cevabını kullanır (buna izin verilir mi?) Ve sorunun aksi takdirde doğrudan uygulanması.


Tüm kullanıcı içeriği CC-BY-SA altında lisanslanmıştır, bu nedenle ilişkilendirme sağladığınız sürece diğer yanıtlardan gelen kodu yeniden kullanabilirsiniz. İkinci lambda'nızı kısaltabilirsiniz lambda n,k:f(n)/f(k)/f(n-k); adlandırma gerekli değildir.
Dennis

3

Haskell, 77 57 55 52 50 bayt

İlk satır ilk olarak Fibonacci fonksiyonundan veya dizi testinden geliyor ve @Anon tarafından yazıldı.

İkinci satır Fibianacci-orial mücadelesine @ChristianSievers tarafından eklendi.

Şimdi üçüncü satırı ekledim. Bu zorluklar ne kadar ileri gidecek? =)

f=1:scanl(+)1f
g=(scanl(*)1f!!)
n#k=g n/g(n-k)/g k

5 bytes @xnor için teşekkürler!


Bunun /yerine yapabilir misin div?
xnor

Hm evet, ama bu kayan nokta sayıları ile sonuçlanacaktır.
flawr

Oh, aslında izin verilmiyor, teşekkürler =)
Kusur

Parenlerden kaçınmak için muhtemelen iki kez bölebilirsiniz.
xnor

1
Şimdi buna sahip olduğumuza göre, bir sonraki şey fibonomial dönüşüm olabilir ;-)
Christian Sievers

3

C, 206 bayt:

#include <inttypes.h>
uint64_t F(x){return x<1 ? 0:x==1 ? 1:F(x-1)+F(x-2);}uint64_t G(H,B){uint64_t P=1;for(B=3;B<=H;B++)P*=F(B);return P;}main(U,Y){scanf("%d %d",&U,&Y);printf("%llu\n",G(U)/(G(U-Y)*G(Y)));}

Yürütme sırasında, girdi olarak 2 boşlukla ayrılmış tamsayı ister. #includeÖnişlemci edilir gerekli , onsuz olarak, uint_64geçerli bir tür ve kullanıyor oldukça büyük çıkışlar için bu işi yapmak için sadece diğer yol değildir unsigned long longikisi için dönüş türleri F(Fibonacci) ve Gsadece çok daha uzundur (Fibonorial) işlevlerini, de dahil olmak üzere <inttypes.h>3 ile uint64_ttürü bildirimleri. Bununla birlikte, bununla birlikte , büyük olasılıkla sayıların Fibonacci ve / veya Fibnorial temsili ve 64 bitlik taşması nedeniyle giriş değerlerinde 14 1( Fibonomial Katsayı dizisindeki ilk değerleri listeleyen bunu kullanarak onaylandı) doğru çalışmayı durdurur kullanılan tamsayı türü.132515

C Çevrimiçi! (Ideone)


Muhtemelen 15 taşma Fibonorial'den beriuint_64
mil

3

Çedar , 75 64 bayt

a->b->(g->g((a-b+1)|>a)/g(1|>b))(n->n.map(Math.fib).reduce((*)))

kullanım

cheddar> var f = a->b->(g->g((a-b+1)|>a)/g(1|>b))(n->n.map(Math.fib).reduce((*)))
cheddar> f(11)(5)
1514513

2

MATL , 25 23 bayt

1ti2-:"yy+]vtPi:)w5M)/p

Çevrimiçi deneyin!

açıklama

1t      % Push 1 twice
i2-:    % Take input n. Generate vector [1 2 ... n-2]
"       % Repeat n-2 times
  yy    %   Push the top two elements again
  +     %   Add them
]       % End
v       % Concatenate into column vector of first n Fibonacci numbers
tP      % Duplicate and reverse
i:      % Take input k. Generate vector [1 2 ... k]
)       % Apply index to get last k Fibonacci numbers
w       % Swap to move vector of first n Fibonacci numbers to top
5M      % Push [1 2 ... k] again
)       % Apply index to get first k Fibonacci numbers
/       % Divide element-wise
p       % Product of vector. Implicitly display

2

R, 120 bayt

Biraz daha golf muhtemelen mümkün, bu yüzden yorum elbette bekliyoruz! Kodun başlangıcında Fibonacci-orial soruya
verdiğim cevabı kullandım :

A=function(n,k){p=(1+sqrt(5))/2;f=function(N){x=1;for(n in 1:N){x=prod(x,(p^n-(-1/p)^n)/sqrt(5))};x};f(n)/(f(k)*f(n-k))}

Kurtulmamış:

A=function(n,k){
p=(1+sqrt(5))/2
    f=function(N){
        x=1
        for(n in 1:N){
           x=prod(x,(p^n-(-1/p)^n)/sqrt(5))
                     }
        x
        }

f(n)/(f(k)*f(n-k))
}

2

Java: 304 260 257

Notlama işlevini biraz sıkıştırarak ve f(n)tamamen kaldırarak , doğrudan dizi erişimi ile değiştirerek bazı baytları kurtardım .

BigInteger[]c;BigInteger a(int n,int k){m(n);return g(n).divide(g(n-k)).divide(g(k));}BigInteger g(int n){return n<3?BigInteger.ONE:g(n-1).multiply(c[n-1]);}void m(int n){c=new BigInteger[n];for(int i=0;i<n;++i)c[i]=(i<2)?BigInteger.ONE:c[i-2].add(c[i-1]);}

Ne yazık ki, BigIntegertaşmalar nedeniyle gerekli ve not eklemek zorunda kaldı. Hatta bir nesil 6 i7, bu alıyordu şekilde büyük girişli Çalışması çok uzun.

Ungolfed, kazan plakası classve mainkod ile:

import java.math.BigInteger;

public class ComputeTheFibonomialCoefficient {

  public static void main(final String[] args) {
    // @formatter:off
    String[][] testData = new String[][] {
      { "0", "0", "1" },
      { "1", "1", "1" },
      { "2", "0", "1" },
      { "3", "2", "2" },
      { "8", "3", "1092" },
      { "11", "5", "1514513" },
      { "22", "7", "7158243695757340957617" },
      { "25", "3", "49845401197200" },
      { "50", "2", "97905340104793732225" },
      { "100", "1", "354224848179261915075" }
    };
    // @formatter:on

    for (String[] data : testData) {
      System.out.println("a(" + data[0] + ", " + data[1] + ")");
      System.out.println("  Expected -> " + data[2]);
      System.out.print("    Actual -> ");
      System.out.println(new ComputeTheFibonomialCoefficient().a(
          Integer.parseInt(data[0]), Integer.parseInt(data[1])));
      System.out.println();
    }
  }

  // Begin golf

  BigInteger[] c;

  BigInteger a(int n, int k) {
    m(n);
    return g(n).divide(g(n - k)).divide(g(k));
  }

  BigInteger g(int n) {
    return n < 3 ? BigInteger.ONE : g(n - 1).multiply(c[n - 1]);
  }

  void m(int n) {
    c = new BigInteger[n];
    for (int i = 0; i < n; ++i)
      c[i] = (i < 2) ? BigInteger.ONE : c[i - 2].add(c[i - 1]);
  }
  // End golf
}

Program çıktısı:

a(0, 0)
  Expected -> 1
    Actual -> 1

a(1, 1)
  Expected -> 1
    Actual -> 1

a(2, 0)
  Expected -> 1
    Actual -> 1

a(3, 2)
  Expected -> 2
    Actual -> 2

a(8, 3)
  Expected -> 1092
    Actual -> 1092

a(11, 5)
  Expected -> 1514513
    Actual -> 1514513

a(22, 7)
  Expected -> 7158243695757340957617
    Actual -> 7158243695757340957617

a(25, 3)
  Expected -> 49845401197200
    Actual -> 49845401197200

a(50, 2)
  Expected -> 97905340104793732225
    Actual -> 97905340104793732225

a(100, 1)
  Expected -> 354224848179261915075
    Actual -> 354224848179261915075

1

JavaScript (ES6), 70 bayt

a=n=>n<2?1:a(--n)+a(--n);b=n=>n?a(--n)*b(n):1;c=n=>k=>b(n)/b(n-k)/b(k)

Kullanarak arayın c(n)(k), oldukça basit.



1

dc, 67 bayt

?skdsn[si1d[sadlarla+zli>b*]sbzli>b*]dsgxsplnlk-lgxsqlklgxlprlqr*/f

Giriş, tek bir satırda boşlukla sınırlanan ondalık sabit olarak alınır.

Bu benim kullanan cevabı için /Fibon(acci-)?orial/diğer Fibonorials hesaplanır iken başka bir yerde saklanmasına son adımda yığın çarpar Tüm numaraları, başka numaraları gerektiren soru.

?       # Take input from stdin
skdsn   # Store second number in register `k'; store a copy of first number in register `n'
[si1d[sadlarla+zli>b*]sbzli>b*] # Compute Fibonorial of top-of-stack, multiplying
                                #   until stack depth is 1
dsgx    # Store a copy of this function as g and execute it: g(n)
sp      # Store g(n) in register `p'
lnlk-   # Compute n-k
lgx     # Compute g(n-k)
sq      # Store g(n-k) in register `q'
lk lgx  # Compute g(k)
        # Top ---Down--->
lp      #  g(n)    g(k)
r       #  g(k)    g(n)
lq      #  g(n-k)  g(k)    g(n)
r       #  g(k)    g(n-k)  g(n)
*       # (g(k)g(n-k))     g(n)
/       #  g(n)/(g(k)g(n-k))
f       # Dump stack to stdout


1

Axiom 108 bayt

b(n,k)==(n<=k or k<1=>1;reduce(*,[fibonacci(i) for i in (n-k+1)..n])/reduce(*,[fibonacci(i) for i in 1..k]))

bazı testler

(34) -> b(0,0),b(1,1),b(2,0),b(3,2),b(8,3),b(11,5),b(22,7)
   Compiling function b with type (NonNegativeInteger,
      NonNegativeInteger) -> Fraction Integer
   Compiling function b with type (PositiveInteger,PositiveInteger) ->
      Fraction Integer
   Compiling function b with type (PositiveInteger,NonNegativeInteger)
       -> Fraction Integer

   (34)  [1,1,1,2,1092,1514513,7158243695757340957617]
                                                 Type: Tuple Fraction Integer
(35) -> b(25,3),b(50,2),b(100,1)

   (35)  [49845401197200,97905340104793732225,354224848179261915075]

Tür: Tuple Kesir Tamsayı


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.