역 파이 기능


17

Pi 함수는 실수 (또는 복소수)에 대한 계승의 확장입니다. 정수 n의 경우 Π (n) = n! 그러나 실수에 대한 정의를 얻으려면 정수를 사용하여 정의합니다.

Pi (z) = 0에서 무한까지의 적분 t e ^ -tt ^ z dt

이 도전에서 우리는 Π 기능을 뒤집을 것입니다.

실수가 z ≥ 1 이면 Π (x) = z가 되도록 양의 x를 찾으십시오 . 귀하의 답변은 5 자리 이상이어야합니다.


예 :

120 -> 5.0000
10 -> 3.39008
3.14 -> 2.44815
2017 -> 6.53847
1.5 -> 1.66277

4
더 자주 사람들은 감마 (Γ) 기능을 사용합니다. Π (x) = Γ (x + 1) 입니다. 그러나 IMO Γ는 변화된 혐오이며 Π는 계승의 진정한 확장입니다.
orlp

1
Wellp, 그 시리즈 확장은 나를 놀라게하기에 충분합니다 ... i.imgur.com/ttgzDSJ.gif
Magic Octopus Urn

1
예를 들어 제공하는 모든 예제에는 다른 솔루션도 있습니다 120 -> -0.991706. x가 오른쪽에서 -1로 갈 때 Π (x)가 무한대로 이동하기 때문입니다. 아마도 당신은 그 x> 0을 고집하는 것을 의미 할 것입니다.
Greg Martin

@GregMartin 또한 추가되었습니다.
orlp

1
부 자연스러운 것처럼 보이지만 시프트 된 버전을 선호하는 몇 가지 이유가 있습니다. 예를 참조하십시오 이 답변 해당 페이지의 MathOverflow에 다른 사람뿐만 아니라.
Ruslan

답변:


8

매스 매 티카, 17 15 27 바이트

FindInstance[#==x!&&x>0,x]&

출력은 다음과 같 으며 솔루션은 {{x -> n}}어디에 n있으며 허용되지 않을 수 있습니다.


7

Pyth, 4 바이트

.I.!

숫자를 입력하고 결과를 인쇄하는 프로그램입니다.

테스트 스위트

작동 원리

.I.!    Program. Input: Q
.I.!GQ  Implicit variable fill
.I      Find x such that:
  .!G    gamma(x+1)
     Q   == Q
        Implicitly print

5

MATL , 13 바이트

1`1e-5+tQYgG<

1e-5시작 위치에서 선형시 치를 사용합니다 1. 따라서 온라인 컴파일러에서 시간이 너무 느리고 시간이 초과됩니다.

이를 테스트하기 위해 다음 링크는 1e-5정확도 요구 사항을로 대체합니다 1e-2. 온라인으로 사용해보십시오!

설명

1        % Push 1 (initial value)
`        % Do...while
  1e-5   %   Push 1e-5
  +      %   Add
  t      %   Duplicate
  QYg    %   Pi function (increase by 1, apply gamma function)
  G<     %   Is it less than the input? If so: next iteration
         % End (implicit)
         % Display (implicit)

3

지오 지브라 , 25 바이트

NSolve[Gamma(x+1)=A1,x=1]

CAS 입력에 입력되었으며 스프레드 시트 셀에 숫자 입력이 필요합니다 A1. 형식의 단일 요소 배열을 반환합니다 {x = <result>}.

실행의 gif는 다음과 같습니다.

progrma의 실행

작동 원리

N일반적 Solve으로 다음 방정식 : Gamma(x+1)=A1, 시작 값 x=1.


양수를 반환한다고 보장됩니까? 1.5에서 작동합니까? 몇 가지 답변이 깨졌습니다.
Pavel

@Pavel 나는 그것이 작동하는지 확인할 수 있습니다 1.5. GeoGebra가 수치 해석에 어떤 알고리즘을 사용하는지 알 수 없었지만, 초기 값은 x=1내가 시도한 모든 값에 대해 순수한 긍정적 인 대답을주었습니다.
TheBikingViking

2

MATLAB, 59 바이트

@(x)fminsearch(@(t)(gamma(t+1)-x)^2,1,optimset('TolF',eps))

이것은 원하는 정밀도를 달성하기 위해 1매우 작은 허용 오차 ( 에서 제공됨)로 Pi 함수와 그 입력 사이에서 제곱 차이의 최소화를 찾는 익명 함수입니다 eps.

테스트 사례 (Matlab R2015b에서 실행) :

>> @(x)fminsearch(@(t)(gamma(t+1)-x)^2,1,optimset('TolF',eps))
ans = 
    @(x)fminsearch(@(t)(gamma(t+1)-x)^2,1,optimset('TolF',eps))
>> f = ans; format long; f(120), f(10), f(3.14), f(2017)
ans =
   5.000000000000008
ans =
   3.390077650547032
ans =
   2.448151165246967
ans =
   6.538472664321318

옥타브에서 온라인으로 시도 할 수 있지만 불행히도 일부 결과에는 필요한 정밀도가 부족합니다.


2

J, 86 33 바이트

((]-(-~^.@!)%[:^.@!D.1])^:_>:)@^.

오버플로를 피하기 위해 log Pi와 함께 Newton의 방법을 사용합니다.

이것은 스털링의 근사값을 사용하여 로그 감마를 계산하는 이전 버전입니다. 로그 감마 (3)의 단계 크기 (1e3) 및 항 수는 성능 비용으로 정확도를 높이기 위해 늘릴 수 있습니다.

3 :'(-(k-~g)%%&1e3(g=:((%~12 _360 1260 p.&:%*:)+-+^~-&^.%:@%&2p1)@>:)D:1])^:_>:k=:^.y'

즉시 계수 항을 계산하는 다른 버전

3 :'(-((-^.y)+g)%%&1e3(g=:((%~(((%1-^@-)t:%]*<:)+:>:i.3)p.%@*:)+(*^.)-]+-:@^.@%&2p1)@>:)D:1])^:_>:^.y'

온라인으로 사용해보십시오! 용어가 수렴 하는 것을 볼 수 있습니다.

설명

((]-(-~^.@!)%[:^.@!D.1])^:_>:)@^.  Input: float y
(                            )@^.  Operate on log(y)
                           >:        Increment, the initial guess is log(y)+1
 (                     )^:_          Repeat until convergence starting with x = log(y)+1
                      ]                Get x
               ^.@!                    The log Pi verb
             [:    D.1                 Approximate its first derivative at x
       ^.@!                            Apply log Pi to x
     -~                                Subtract log(y) from it
            %                          Divide it by the derivative
  ]-                                   Subtract it from x and use as next value of x

2

수학, 21 바이트

FindRoot[#-x!,{x,1}]&

FindRoot 초기 값이있을 때 내부적으로 Newton의 방법을 적용합니다.

아래 두 가지 방법은 뉴턴의 방법을 직접 적용합니다.

FixedPoint 45 바이트를 사용하는 대안

FixedPoint[#-(#!-y)/Gamma'[#+1]&,Log[y=#]+1]&

Mathematica는 미분을 근사화하지 않고 직접 미분을 계산할 수 있기 때문에이를 해결하기위한 Newton의 방법을보다 정확하게 구현합니다.

규칙을 반복적으로 대체하기 위해 사용하는 것이 더 짧을 수 있지만, 수행 할 수있는 반복 횟수에는 제한이 있지만 제한이 없습니다 (65536) FixedPoint.

규칙을 사용한 대체, 38 바이트

Log[y=#]+1//.x_->x-(x!-y)/Gamma'[x+1]&

영상


1

젤리 , 34 바이트

Ḋ!Æl_®
ȷİ‘×;µ!ÆlI÷I÷@Ç_@ḊḢ
Æl©‘ÇÐĿ

온라인으로 사용해보십시오! 또는 중간 값이 수렴 될 때 봅니다.

Π ( n ) 의 역수를 계산하기 위해 J의 뉴턴 방법과 미분 근사 (시컨트 방법) 조합의 구현 .

오버플로를 피하기 위해 대신 log ( Π ( n )) 의 역을 해결합니다 .

초기 추측으로 시작합니다. x 0 = y +1 여기서 y = log ( Π ( n )). 그런 다음 x n +1 = x n- (log ( Π ( x n ))- y ) / (log (( Π (1.001 * x n ))-log ( Π ( x n )))을 사용하여 수렴 될 때까지 반복합니다. (0.001 * x n )).


3
입력에 오류가 있습니다.1.5
Luis Mendo

@LuisMendo 와우 좋은 캐치입니다! 중간 값 중 하나가 ~ 65807이므로 감마가 적용되고 파이썬이 오버플로 된 후 큰 값입니다. 동일한 계산에 의존하기 때문에 J에서도 마찬가지입니다.
마일

1

PARI / GP, 30 바이트

x->solve(t=1,x+1,gamma(t+1)-x)

1와 사이의 솔루션을 찾습니다 x+1. 불행히도 x같은 입력의 상한만큼 충분히 크지 않습니다 1.5.


1

수학, 26 바이트

또 다른 Mathematica 솔루션!

방정식 해결은 항상 최소화 문제로 전환 될 수 있습니다.

NArgMin[{(#-x!)^2,x>0},x]&

방정식의 좌변과 우변의 차이를 최소화하는 인수를 찾습니다.

NMinimize 대신 NArgMin을 사용하면 출력이 일반적인 상세 규칙 기반 출력이 아닌 원하는 결과가됩니다 (바이트를 절약합니다).


0

libm을 가진 C, 111

최신 정보 -입력 1.5로 수정되었습니다.

f(double *z){double u=2**z,l=0,g=u,p=0;for(;log(fabs(g-p))>-14;)p=g,g=(u+l)/2,u=tgamma(g+1)>*z?g:(l=g,u);*z=g;}

gamma(x+1)해당 범위에서 단조 증가하는 함수이며, shis는 연속 값 간의 차이가 작을 때까지 이진 검색입니다. 시작 하한 0은 시작 상한은 2*x입니다.

입력 및 출력은 함수에 전달 된 이중에 대한 포인터를 통해 이루어집니다.

나는 이것이 더 깊이 골프를 칠 수 있다고 확신합니다. 특히 4 개의 로컬 복식이 필요하지 않다고 생각하지만 지금까지 이것을 줄일 수있는 쉬운 방법을 보지 못했습니다.

온라인으로 사용해보십시오 -빌드 (libm과 연결)는 bash 스크립트에서 실행됩니다.

온화한 골퍼

f(double *z){
    double u=2**z,l=0,g=u,p=0;
    for(;log(fabs(g-p))>-14;){
        p=g;
        g=(u+l)/2;
        u=tgamma(g+1)>*z?g:(l=g,u);*z=g;
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.