code 41556;
real procedure KOLSMIR(D, XSIZE, YSIZE, EPS);
value D, XSIZE, YSIZE, EPS; real D, XSIZE, YSIZE, EPS;
begin integer I, KGV, M, N;
integer procedure GGD(M, N);
value M, N; integer M, N;
GGD:= if N = 0 then M else GGD(N, M - M ÷ N × N);
procedure APPROX;
begin integer K; real SUM, X, TERM, THETA;
SUM:= .5; THETA:= (1 + (M / KGV) ⭡ 1.2) / (M + N);
X:= (I / KGV + THETA) ⭡ 2 × 2 / (1 / M + 1 / N);
for K:= 1, K + 2 while TERM > EPS do
begin TERM:= EXP(-X × K × K);
SUM:= SUM - TERM × (1 - EXP(-X × (2 × K + 1)))
end;
KOLSMIR:= 2 × SUM
end;
procedure EXACT;
begin integer array LOW[0:N]; array H[0:M];
integer DMN, MN1, X, Y, UPP; real SUM, BINCOEF;
BINCOEF:= 1; LOW[0]:= 0; MN1:= M + N + 1;
DMN:= I × M × N / KGV;
for X:= 1 step 1 until N do
begin integer T, TN;
T:= M × X - DMN; TN:= T ÷ N;
LOW[X]:= if T ≤ 0 then 0 else
if TN = T / N then TN else TN + 1;
BINCOEF:= BINCOEF × (MN1 - X) / X;
if BINCOEF > 10318 then
begin EPS:= 10-4;goto L end
end;
H[0]:= 1;
for Y:= 1 step 1 until M do H[Y]:= 0;
for X:= 0 step 1 until N do
begin Y:= LOW[X]; SUM:= H[Y];
UPP:= M - LOW[N - X];
for Y:= Y + 1 step 1 until UPP do
H[Y]:= SUM:= SUM + H[Y]
end;
KOLSMIR:= SUM / BINCOEF
end;
if XSIZE ≤ 0 ∨ XSIZE > ENTIER(XSIZE) then
STATAL3 ERROR(“KOLSMIR”, 2, XSIZE);
if YSIZE ≤ 0 ∨ YSIZE > ENTIER(YSIZE) then
STATAL3 ERROR(“KOLSMIR”, 3, YSIZE);
if XSIZE < YSIZE then
begin N:= XSIZE; M:= YSIZE end
else begin M:= XSIZE; N:= YSIZE end;
if EPS < 0 ∨ EPS > 10-2 then EPS:= 10-3;
if XSIZE < YSIZE then
begin N:= XSIZE; M:= YSIZE end
else begin M:= XSIZE; N:= YSIZE end;
KGV:= M × N / GGD(M, N);
I:= ENTIER((1 + 10-14) × D × KGV);
if EPS ≥ 10-3 then L: APPROX else EXACT;
end KOLSMIR;
eop