감마 기능 골프


17

실수 주어 t에서 (-10^9,13)(제외 -10^9또는 13입력, 출력로서) Γ(t)일컬어, 감마 함수 는 다음과 같이 정의된다 :

감마 함수 정의

내장 된 감마 함수를 사용하여이 작업을 해결하거나 내장 숫자 또는 기호 통합 함수를 사용할 수 없습니다. 출력값은 유효 숫자 6 자리 또는 10^-6실제 값 이내에서 정확해야합니다 . 파이썬의 내장 감마 함수는 실제 값을 결정하는 데 사용됩니다. Γ(t)정의 된 즉, t양의 실수 또는 정수가 아닌 음의 실수 라고 가정 할 수 있습니다 |Γ(t)| ≤ 10^9. 다음 은 Python의 내장 감마 함수를 사용하여 실제 값을 얻는 데 사용할 수있는 참조 프로그램입니다.

1 -> 1.000000
-2.5 -> -0.945309
3.14159265 -> 2.288038
-2.71828182846 -> -0.952682
12 -> 39916800.000000
0.5 -> 1.772454
8.675309 -> 20248.386956
-10.1 -> -0.000002

규칙

  • 이것은 이므로 가장 짧은 답변 (바이트)이 이깁니다.
  • 표준 허점은 금지되어 있습니다.
  • 언어의 표준으로 간주되는 방식으로 입력 및 출력을 수행 할 수 있습니다.
  • 전체 프로그램, 기능 또는 일반적으로 귀하의 언어에 대한 올바른 답변으로 간주되는 모든 것을 작성할 수 있습니다

리더 보드

이 게시물의 하단에있는 스택 스 니펫은 답변 a) 언어별로 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 답변에서 리더 보드를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

## Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 개의 숫자를 포함 시키려면 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

## Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들면 스 니펫에 표시됩니다.

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


1
| gamma (t) | <10 ^ 9
flawr

링크는 참조 구현이 아닙니다 ...
sergiol

@sergiol Reworded
Mego

답변:


2

Pyth, 21 바이트

TI-BASIC 답변과 마찬가지로 전체 8 ^ 10 반복으로 이것을 테스트 할 수는 없었지만 작은 경우에는 모든 것이 좋아 보입니다.

cu*Gc^hc1HQhcQHS^8T1Q

설명:

                            [implicit: Q=input]
                ^8T         8**10
               S^8T         [1,2,3,...,8**10]
  *Gc^hc1HQhcQH             lambda G,H:G*(1+1/H)**Q/(1+Q/H)
                   1        Base case
 u*Gc^hc1HQhcQHS^8T1        Reduce with base case 1
c                   Q       Divide by Q

8 ^ 10 대신 2000 회 반복 하여 여기 에서 시도 하십시오 .


10

C ++ 14, 86 85 81 바이트

[](auto t){auto v=1.;for(int x=1;x<1e9;++x)v*=pow(1+1./x,t)/(1+t/x);return v/t;};

나는 이것에 많은 시간을 소비하지 않았다. 방금 구현하기 가장 쉬운 것으로 보이는 근사치 (바이트 방식)를 보았습니다. 루프가 모든 양의 정수를 초과하므로 값을 계산하는 데 약간의 시간이 걸리지 만, 시간 제한은 시도에서 지정되지 않습니다. 익명 함수 (lambda)이며 모든 인수를 취합니다 ( T 어떤에서 pow(double, T)하고 operator/(T,int)호출 할 수 있습니다) 반환을 double.

사용법이없는

#include <iostream>
int main()
{
    auto r = [](auto t)
    {
        auto v = 1.;
        for (int x = 1; x < 1e9; ++x)
            v *= pow(1 + 1. / x, t) / (1 + t / x);
        return v / t;
    };
    std::cout << r(-2.71828182846); // outputs -0.952682
}

@ 메고 물론입니다! 감사.
Zereges

-10 ^ 9와 10 ^ 9에 어떤 가치가 있습니까? 나는 당신이 나의 투표를하기 전에 당신의 물건이 얼마나 잘 작동하는지 알고 싶습니다
flawr

@Mego Microsoft 컴파일러에는 이러한 포함이 필요하지 않습니다.
Zereges

@MegoMicrosoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x86
Zereges

@flawr Mine 프로그램은 0을 출력 gamma(-10e9)하지만 OP는 명시 되어 있지만 감마 기능이 정의 된 매개 변수 만 고려할 수 있습니다. gamma(10e9)반환 inf하면서, 파이썬의 내장 감마 함수가 실제 값을 결정하기 위해 사용됩니다 말한다OverflowError: math range error
Zereges

7

Minkolang 0.12 , 35 34 25 바이트

n$zl8;dz;z$:r[i1+dz+$:*]N

오류 (0으로 나누려고 할 때)와 함께 중단되지만 메타 합의에 따라 허용됩니다 . 을 추가하다.정상적으로 중단되는 프로그램의 끝에 를 . 모든 테스트 사례를 한 번에 시도하십시오. 루프는 1e4 회만 반복되므로 나중에보다 빨리 완료됩니다.

설명

Zereges 는 무한한 대체 제품 정의 중 하나를 사용했습니다 . 결과적으로, 다른 하나는 Minkolang에서 구현하기가 훨씬 더 쉽습니다.

감마 함수의 오일러의 대안 공식

이것은 n무한 대로 가는 한계 입니다. 즉, 내가 갈 때 n!(t+n)나가서 모두 계산할 수 있습니다 . 따라서 1/t(왜냐하면 0!=1) n^t종료 값을 모르면 순차적으로 계산할 수 없기 때문입니다 n. 발생하는 것처럼n 한계 나는 그것을 두 번 사용할 수 있습니다. 한 번은 계산의 한 요소로, 한 번은 루프를 실행하는 횟수입니다.

순차적 인 무한 곱은 보통 1로 시작해야합니다.이 경우에는 n^t/t입니다. 루프 본문에서 k/(t+k)지금까지 이것을 계산 하고 곱합니다. 결국 전체 제품이 계산되어 출력되었습니다. 이것은 본질적으로 내 프로그램이하는 일이며 n, 대답이 정확할 정도로 충분히 높습니다.

무한 제품의 분해 버전

n                            Take number from input
 $z                          Store it in the register (this is t; retrieved with z)
   l8;                       10^8 (this is n, the limit)
      d                      n,n
       z;                    n,n^t
         z$:                 n,n^t/t
            r                Reverse stack -> n^t/t,n
             [               For loop that runs n times
              i1+            k
                 d           k,k
                  z+         k,t+k
                    $:       k/(t+k)
                      *      Multiply
                       ]N    Close for loop and output as integer

이 없기 .때문에 둘러 싸고 다시 시작됩니다. 그러나 n이제는 -1입력이 비어 있기 때문에 생성 되어 결국 0으로 나누려고 시도하여 프로그램이 중지됩니다.


5

줄리아, 141 바이트

z->(z-=1;a=90;c(k)=(k=big(k);(-1)^(k-1)/factorial(k-1)*(a-k)^(k-.5)*exp(a-k));(z+a)^(z+.5)*exp(-z-a)*(√(2π)+sum([c(k)/(z+k)for k=1:a-1])))

실수를 받아들이고 실수를 반환하는 명명되지 않은 람다 함수를 만듭니다. Spounge의 근사값을 사용합니다. 감마을 계산하기.

언 골프 드 :

function Γ(z::Real)
    # Spounge's approxmation is for Γ(z+1), so subtract 1
    z -= 1

    # Choose a number for the constant a, which determines the
    # bound on the error
    a = 90

    # Define a function for the sequence c_k
    function c(k::Integer)
        # Convert k to a BigInt
        k = big(k)
        return (-1)^(k-1) / factorial(k-1) * (a-k)^(k-1/2) * exp(a-k)
    end

    # Compute the approximation
    return (z+a)^(z+1/2) * exp(-z-a) * (√(2π) + sum([c(k)/(z+k) for k=1:a-1]))
end

아주, 아주 늦게 골프는하지만, z->(z-=1;a=90;c(k)=(k=big(k);(-1)^~-k/factorial(k-1)*(a-k)^(k-.5)*exp(a-k));(z+a)^(z+.5)*exp(-z-a)*(√(2π)+sum(c(k)/(z+k)for k=1:a-1)))137 바이트 (줄리아 0.6 이상)을 위해 일한다
씨 Xcoder

3

apt, 45 바이트

JaptJa vaScri pt 의 단축 버전입니다 . 통역사

$for(V=X=1;X<1e9;)$V*=(1+1/X pU /(1+U/X++;V/U

물론, 1E9 = 1,000,000,000 반복 그래서 테스트를 들면, 교체 시도, 영원히 소요 9로모그래퍼 6. (1e6은 ~ 5 유효 숫자까지 정확합니다. 입력에 1e8을 사용 12하면 처음 6 개를 얻는 데 충분합니다.)

테스트 사례 결과 : (1e7 정밀도 사용)

       1:  1
    -2.5: -0.9453083...
      pi:  2.2880370...
      -e: -0.9526812...
      12:  39916536.5...
     0.5:  1.7724538...
8.675309:  20248.319...
   -10.1: -0.0000022...

작동 원리

         // Implicit: U = input number
$for(    // Ordinary for loop.
V=X=1;   //  Set V and X to 1.
X<1e9;)$ //  Repeat while X is less than 1e9.
V*=      // Multiply V by:
(1+1/X   //  1 plus (1 over X),
pU /     //  to the power of U, divided by
(1+U/X++ //  1 plus (U over X). Increment X by 1.
;V/U     // Output the result of (V over U).

3

TI-BASIC, 35 바이트

Input Z
1
For(I,1,ᴇ9
Ans(1+I⁻¹)^Z/(1+Z/I
End
Ans/Z

이것은 Zereges와 동일한 알고리즘을 사용합니다.

주의 사항 : 실제로 전체 1e9 반복으로 이것을 테스트하지 않았습니다. 더 작은 값을 취하는 데 걸리는 시간을 기준으로 런타임이 몇 개월 정도 걸릴 것으로 예상합니다 . 그러나 수렴하는 것처럼 보이고 반올림 오류에 문제가 없어야합니다. TI는 숫자를 14 자리 정밀도로 10 진수 부동 소수점으로 저장합니다.


당신은 그것을 테스트하지 않았다?!
TanMath

1
@TanMath하고 싶지만 다음 달 최종 시험을 위해 계산기가 필요합니다.
lirtosiast

3

파이썬 3, 74 68 78 73 바이트

감사합니다 @ Mego와 @ xnor

이것은 Zereges의 C ++ 답변 번역입니다. 기본적으로 이것은 감마 함수의 대체 정의이므로 더 정확합니다 (그리고 더 적은 바이트를 사용하는 것이 좋습니다!)

모든 실수로 죄송합니다!

def g(z,v=1):
 for i in range(1,10**9):v*=(1+1/i)**z/(1+z/i)
 return v/z

1
+1당신이 수십억을 처리 할 때 범위에 문제가되지 않습니다. 또한 파이썬 3임을 지정해야합니다- 파이썬 2에서 목록 from __future__ import divisionrange반환하는 사실을 처리하려면 float 나누기와 몇 테라 바이트의 RAM이 필요합니다 . 또한 1.0s를 1s로 바꾸고 바이트.
Mego

2
@ TanMath : ^xor **입니까, 지수화 를 의미하지 않았 습니까?
jermenkoo 2011

3
int(1e9)그냥 10**9, 그리고 당신은 주변의 parens가 필요하지 않습니다 (1+1/i)**z.
xnor

3

파이썬 348 448 407 390 389 바이트

@Mego에게 감사드립니다!

448 점은 여전히 ​​448 점입니다. :피

이것은 Lanzcos 근사치를 기반으로합니다. 여기 에서 골프

from cmath import*
C=[0.9999999999998099,676.5203681218851,-1259.1392167224028,771.3234287776531,-17‌6.6150291621406,12.507343278686905,-0.13857109526572012,9.984369578019572e-6,1.5‌​056327351493116e-7]
def g(z):
 z-=1;if z.real<0.5:return pi/(sin(pi*z)*gamma(1-z))
 else:
  x=C[0]
  for i in range(1,9):x+=C[i]/(z+i)
  t=z+7.5;return sqrt(2*pi)*t**(z+0.5)*exp(-t)*x

1
최소한 공백 ( import *예 : -= 앞뒤 공백)을 제거 하고 한 문자 기능 이름을 사용 하여 제출물을 골프화하십시오 . 또한 실제 입력 만 지원하면됩니다.
lirtosiast

@ThomasKwa 편집했습니다. 내 원래 버전이 작동하지 않았습니다. 여기에 최신 버전이 있습니다.
TanMath

@Mego 편집 됨
TanMath

이로 인해 재귀 오류가 발생 합니다. z-=1;첫 번째 줄에서 gamma를 제거하여 수정하십시오. 또한 바이트를 절약하고로 이름이 충돌하지 않도록로 이름을 바꿔야 gamma합니다 . 또한 불필요한 선행 0을 삭제하십시오. gcmath.gamma
Mego

1

줄리아, 41 바이트

x->prod([(1+1/i)^x/(1+x/i)for i=1:1E7])/x

이것은 Zereges의 C ++ 답변을 번역 한 것입니다. 내 다른 Julia 답변이 즉시 완료되지만 다소 느립니다. 내 컴퓨터에서 각각 몇 초 만에 테스트 사례를 계산합니다.

언 골프 드 :

function f(x::Real)
    prod([(1 + 1/i)^x / (1 + x/i) for i = 1:1E7]) / x
end

1

프롤로그, 114 바이트

이것은 Zereges의 C ++ 답변을 번역 한 것입니다.

q(F,F,V,Z):-X is V/Z,write(X).
q(F,T,V,Z):-W is(1+1/F)**Z/(1+Z/F)*V,I is F+1,q(I,T,W,Z).
p(N):-q(1.0,1e9,1,N),!.

여기 에서 온라인으로 사용해보십시오
. 다음 형식의 쿼리로 실행하십시오.

p(12).

1e9 재귀로 실행하는 데 약 15 분이 걸립니다.
1e6으로 줄이면 약 1 초가 걸리므로 테스트가 쉬워 지지만 정확도는 떨어집니다.
컴퓨터 / 노트북의 통역사에서 실행하는 것이 대부분의 사람들에게 더 빠릅니다.


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