피보 노미 계수 계산


11

배경

피보나치 수열은 다음과 같이 정의됩니다

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

계승과 유사한 피보 노리 알은 첫 n 피보나치 수 의 곱입니다 .

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

이항 계수와 유사한 피보 노미 계수는 다음과 같이 정의됩니다.

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

직무

목표는 kn 인 두 개의 음이 아닌 정수 nk 가 주어지면 피보 노미 계수를 계산하는 함수 또는 프로그램을 만드는 것입니다 .

테스트 사례

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

규칙

  • 이것은 이므로 가장 짧은 코드가 승리합니다.
  • 내장이 허용됩니다.

관련


필요한 경우 여기1335 에 피보 노미 계수 시퀀스 의 첫 번째 값 을 나열하는 웹 페이지가 있습니다.
R. Kap

는 IS a(50, 2)테스트 케이스는 선도적 누락 9?
Joe

@SirBidenXVII 네, 맞습니다. 자리를 놓쳤습니다.
마일

답변:


1

젤리 , 16 바이트

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

온라인으로 사용해보십시오!

Fibonacci-orial 도우미 링크에 대한 Dennis의 크레딧 .

;_/Ç€:/     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

하스켈, 46 바이트

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

수레를 출력합니다. 무한 피보나치 목록을 생성합니다. 그런 다음 이항 회귀는 피보나치 목록의 요소로 곱하고 나눕니다.


4

파이썬 67 바이트

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)

을 사용하여 전화하십시오 a(n,k). @Dennis fibonorial answer (허용 되었습니까?)를 사용하고 그렇지 않으면 질문을 간단하게 구현합니다.


모든 사용자 컨텐츠는 CC-BY-SA에 따라 라이센스가 부여되므로 귀속을 제공하는 한 다른 답변의 코드를 재사용 할 수 있습니다. 두 번째 람다를 짧게 줄일 수 있습니다 lambda n,k:f(n)/f(k)/f(n-k). 이름을 지정할 필요는 없습니다.
Dennis

3

하스켈, 77 57 55 52 50 바이트

첫 번째 줄은 원래 피보나치 함수 또는 시퀀스 챌린지에서 왔으며 @Anon에 의해 작성되었습니다.

두 번째 줄은 @ChristianSieversFibonacci-orial challenge에 추가되었습니다 .

이제 세 번째 줄을 추가했습니다. 이러한 도전은 얼마나 더 진행될 것인가? =)

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

5 바이트 @xnor에 감사드립니다!


/오히려 할 수 있습니까 div?
xnor

그렇습니다. 그러나 그것은 부동 소수점 숫자로 끝날 것입니다.
flawr

아, 그건 실제로 허용되지 않습니다, 고마워요 =)
flawr

아마 두피를 피하기 위해 두 번 나눌 수 있습니다.
xnor

1
이제 우리는이 문제를 가지고, 다음 것은이 ;-) 변환 fibonomial 수
기독교 승인 Sievers

3

C, 206 바이트 :

#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)));}

실행시, 공백으로 분리 된 2 개의 정수를 입력으로 요청합니다. #include전처리가되는 필요 , 그것 없이는으로, uint_64유효한 유형 및 사용 매우 큰 출력을 위해이 일을 할 수있는 유일한 방법은 아니다 unsigned long long양쪽에 대한 반환 형식 F(피보나치) 및 G단지보다 훨씬 더 긴 (Fibonorial) 기능을, <inttypes.h>및 3 가지 uint64_t유형 선언을 포함합니다 . 그러나 그 경우에도 피보나치 및 / 또는 Fibnorial 숫자의 표현 이 64 비트를 오버플로 하기 때문에 입력 값 14 1( Fiboomial Coefficient 시퀀스 의 첫 번째 값 을 나열하는 this 을 사용하여 확인) 에서 올바르게 작동하지 않습니다. 사용되는 정수 유형.132515

C 온라인! (아이디어)


아마도 15 번의 피보로 날 (Fibonorial)이 15 번 넘은 이후uint_64
마일

3

체다 , 75 64 바이트

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

용법

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 바이트

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

온라인으로 사용해보십시오!

설명

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 바이트

더 많은 골프가 가능할 것이므로 의견을 환영합니다!
나는 코드의 시작 부분에서 피보나치 오리알 질문에 대한 내 대답을 사용했습니다 .

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

언 골프 :

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

자바 : 304 260 257

메모리 기능을 약간 압축하고 f(n)완전히 제거 하여 직접 배열 액세스로 대체하여 바이트를 절약 했습니다.

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

불행히도 BigInteger오버플로로 인해 필요하며 메모를 추가해야했습니다. 심지어 세대 6 I7에, 그것은 복용 한 방식으로 큰 입력을 실행하는 데 시간이 너무 오래.

상용구 classmain코드 포함 :

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
}

프로그램 출력 :

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

자바 스크립트 (ES6), 70 바이트

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)

를 사용하여 c(n)(k)매우 간단하게 전화하십시오 .



1

dc, 67 바이트

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

입력은 한 줄에 공백으로 구분 된 10 진수 상수로 간주됩니다.

이것은 질문에 대한 나의 대답 을 사용합니다.이 /Fibon(acci-)?orial/단계는 마지막 단계에서 스택의 모든 숫자를 곱하여 다른 숫자는 다른 곳에 저장해야하며 다른 피보 노리 알은 계산됩니다.

?       # 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

공리 108 바이트

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

몇 가지 테스트

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

유형 : 튜플 분수 정수


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.