code 41513; real procedure GAMMA(X, ALPHA, SCALE); value X, ALPHA, SCALE; real X, ALPHA, SCALE; begin integer DELTA, UPP; real BETA, START, SUM, TERM; real procedure INCGAM(X, A, EPS); value X, A, EPS; real X, A, EPS; begin real C0, C1, C2, D0, D1, D2, X2, AX, P, Q, R, S, R1, R2, SCF; integer N; S:= EXP(-X + A × LN(X)); SCF:= 10+300; if X ≤ 1 then begin X2:= X × X; AX:= A × X; D0:= 1; P:= A; C0:= S; D1:= (A + 1) × (A + 2 - X); C1:= (D1 + AX + 2 × X) × S; R2:= C1 / D1; for N:= 1, N + 1 while ABS((R2 - R1) / R2) > EPS do begin P:= P + 2; Q:= (P + 1) × (P × (P + 2) - AX); R:= N × (N + A) × (P + 2) × X2; C2:= (Q × C1 + R × C0) / P; D2:= (Q × D1 + R × D0) / P; R1:= R2; R2:= C2 / D2; C0:= C1; C1:= C2; D0:= D1; D1:= D2; if ABS(C1) > SCF ∨ ABS(D1) > SCF then begin C0:= C0 / SCF; C1:= C1 / SCF; D0:= D0 / SCF; D1:= D1 / SCF end end; INCGAM:= R2 / A / EXP(LOGGAMMA(A)) end else begin C0:= A × S; C1:= (1 + X) × C0; Q:= X + 2 - A; D0:= X; D1:= X × Q; R2:= C1 / D1; for N:= 1, N + 1 while ABS((R2 - R1) / R2) > EPS do begin Q:= Q + 2; R:=N × (N + 1 - A); C2:= Q × C1 - R × C0; D2:= Q × D1 - R × D0; R1:= R2; R2:= C2 / D2; C0:= C1; C1:= C2; D0:= D1; D1:= D2; if ABS(C1) > SCF ∨ ABS(D1) > SCF then begin C0:= C0 / SCF; C1:= C1 / SCF; D0:= D0 / SCF; D1:= D1 / SCF end end; INCGAM:= 1 - R2 / A / EXP(LOGGAMMA(A)) end end INCGAM; if ALPHA ≤ 0 then STATAL3 ERROR(“GAMMA”, 2, ALPHA) else if SCALE ≤ 0 then STATAL3 ERROR(“GAMMA”, 3, SCALE) else if X ≤ 0 then GAMMA:= 0 else if ALPHA ≥ 500 then begin GAMMA:= PHI(((X / SCALE / ALPHA) ⭡ .33333333353333 - 1 + 1 / (9 × ALPHA)) × 3 × SQRT(ALPHA)) end else begin X:= X / SCALE; BETA:= ALPHA - ENTIER(ALPHA) + 1; START:= if X ≥ 40 then 1 else INCGAM(X, BETA, 10-12); if ALPHA < 1 then GAMMA:= START + EXP(-X + ALPHA × LN(X) - LOGGAMMA(ALPHA + 1)) else if ALPHA < 2 then GAMMA:= START else if X > 700 then GAMMA:= 1 else begin UPP:= ENTIER(ALPHA) - 2; SUM:= TERM:= EXP(-X + (ALPHA - 1) × LN(X) - LOGGAMMA(ALPHA)); for DELTA:= 1 step 1 until UPP do begin TERM:= TERM × (ALPHA - DELTA) / X; SUM:= SUM + TERM end; GAMMA:= START - SUM end end end GAMMA; eop