1.2. Комбинаторика. Бином ньютона и родственные формулы

Число перестановокизnэлементов опре­де­ля­ет­ся формулой

Pn = n! ; (1.2)

число размещенийиз nэлементов поmэлементов

; (1.3)

число сочетанийизnэлементов по mэлементов

. (1.4)

Число перестановок с повторениями (корте­­жа­ми) со­ста­ва(спецификации) (k1, k2, ..., kr ) опре­де­ля­ется фор­му­лой

; (1.5)

число сочетанийизn элементов поm сповторени­­я­ми

. (1.6)

При чис­лен­­ных расчетах также можно ис­поль­зо­вать рекуррентную формулу

. (1.7)

В формулах (1.2) - (1.4) n!, m!,k! и (n-m)! - фак­то­­ри­а­лы, которые легко могут быть вы­чис­ле­ны­ из опре­де­ле­ния

0! = 1,n > 0. (1.8)

Однако для больших nиспользование вы­ра­же­­ния (1.8)в связи сo значительным количеством опе­­ра­­ций ум­но­­жения чисел с плавающей точкой при­во­дит к не­оп­рав­дан­нымзатратам про­цес­сор­но­го времени. В та­ких слу­ча­ях для при­бли­жен­но­го вы­числения фак­то­­ри­а­лов удоб­но ис­поль­зо­ватьасим­­пто­ти­ческое раз­­ложение Стир­­лин­га, в ре­зуль­та­те получаемфор­му­­лу Стирлингадляn!:

приn ®¥. (1.9)

Относительная ошибка фор­­мулы Стирлинга, как это видно из выражения (1.9), убы­ва­­ет с воз­рас­танием n. Для до­статочно большихn, од­на­ко, бо­лее точ­но­го ре­зуль­тата можно до­­би­ть­ся, ес­ли ис­поль­зовать спе­циальную фор­­мулу [Корн, Корн, 1978]:

, (1.10)

поскольку ;приn ®¥. От­ме­­чен­ные особенности учтены нами в процедуре вы­чис­ле­ния факториала, ко­­то­рая мо­жет быть с успехом ис­поль­зована для на­­­хож­денияв со­от­вет­ст­вии с форму­ла­ми (1.2) - (1.6).

Формальные параметры процедуры.Входные:n(типinteger) - натуральное число, фак­­ториал ко­то­ро­­го тре­бу­ется вычислить;k (типinteger) - ключ, зна­чение ко­то­ро­го отвечает выбо­ру одной из формул (1.8) - (1.10):k < 0 - формула (1.8), k = 0 - фор­мула (1.9),k > 0 -формула (1.10).Вы­ходной: идентификатор процедуры-функ­ции fct(типreal)- значение факториала.

{*** fct ***}

Function fct (n, k : integer) : real;

const pi = 3.14159265;

var s1, s2, s3 : real; i : integer;

begin

if n=0 then

begin

fct:=1;

exit;

end;

if k < 0 then

begin

fct:=1;

for i:=1 to n do

fct:=fct*i;

exit;

end;

s1:=sqrt(2*pi*n);

if k=0 then

begin

s3:=0;

s2:=0

end

else

begin

s3:=1/(360*n*n*n);

s2:=1/(12*n)

end;

fct:=exp(n*ln(n))*s1*exp(-n+s2-s3);

end .

Оценка точности вычислений проводилась при тес­ти­­ровании программы для n = 5,­ 10, ­15, ­20, 30;­ k =-1, 0, 1. Результаты, полученные приn = 5, 10, ­15, и со­от­вет­с­т­­­­вующие им величины от­но­си­тель­ной по­греш­­ности пред­­­ставлены в табл.1.2.

Результаты те­с­­­­тирования по­ка­зы­вают, что с рос­­том nпо­греш­ность вычисленияn! умень­­ша­ет­ся, при­чем во всех слу­­чаях формула (1.10) да­ет бо­лее точ­ный ре­зуль­тат. Од­нако следует отметить, что при дальнейшем уве­ли­­ченииnпогрешность фор­му­лы (1.10) остается прак­­тически на том же уров­не (~1.0e - 5 %) и при не­об­хо­димости по­лучить бо­лее точ­ный результат тре­бу­ется удер­жать сле­ду­ю­щий член в разложении (1.10). Даль­ней­­ший рост nпри­водит к появлению оши­бок округ­ле­­ния, свя­зан­­­ных с ко­­неч­нос­тью раз­ряд­­ной сет­ки ЭВМ.

Таблица 1.2

n

Формула (1.8) (точное значение)

Формула (1.9)

Формула (1.10)

5

120

118.019172668 (1.65 %)

119.9999771 (1.9 e - 5 %)

10

3628800

3598695.75 (0.82 %)

3628800 (0 %)

15

1307674279936

1300430716928 (0.55 %)

1307674411008 (1.0 e - 5 %)

Процедура fctмо­жет быть эф­­фек­тив­но ис­поль­­зо­­вана при вы­числении би­но­­ма Ньютона:

(1.11)

и величины полинома

, (1.12)

где суммирование проводится по всем наборам не­от­ри­ца­тельных целых чисел (k1 ,k2 ,...,kr ),для ко­то­рыхk1 + k2 + +... + kr = n.При этомCn (k1, k2, ..., kr),вы­чис­ляемые по фор­муле (1.5), на­зываются по­ли­но­­ми­аль­ными ко­эф­фи­ци­ен­та­­ми.Формула для определения количества по­­ли­но­ми­аль­ных ко­эф­фи­ци­ен­тов имеет вид:

.

Рассмотрим процедуру-функцию вы­чис­­­­ле­ния би­­но­ма Ньютона, в которой используется функ­ция fctв со­от­вет­ст­вии с формулой (1.11).

Формальные параметры процедуры.Входные:a,b (типreal)- значения слагаемых aиbв вы­ра­же­нии (1.11);n(типinteger) - показатель степени би­­но­­­ма;k(типin­te­ger) - ключ, определяющий вы­бор ал­­­го­рит­ма вы­чис­ле­ния фак­то­ри­ала (см. опи­са­ние па­­­ра­мет­ров процедуры-функции fct). Вы­­ход­ной:функ­ция binn(типreal) - зна­­чение би­нома Нью­то­­на.

Function binn (var a, b : real;

var n, k : integer;): real;

var s,f1,f2,f3 : real; l,m : integer;

begin

bin:=0;

f1:=fct(n,k);

for l:=0 to n do

begin

f2:=fct(l,k);

m :=n-l;

f3:=fct(m,k);

s :=f1/(f2*f3);

bin:=bin+s*exp(a*ln(m)+b*ln(l));

end;

end; {*** binn ***} .

Оценка точности вы­чис­ле­ний бинома про­­во­­ди­­лась при те­с­тировании про­грам­мы для n = 5, 10, 15, 20, 30; k =- 1 (дан­ное зна­чениеk со­от­вет­­ству­етточ­­но­му вы­чис­ле­­нию фак­то­риала в про­це­ду­ре-функ­­­цииfct) и раз­лич­­ных па­ра­мет­ровa иb. Результаты, по­лу­чен­ные приn =5, 7, 10, 15; a = =1.5; b = 2.5, -2.5, исо­­от­вет­с­т­­­­ву­­ющие им ве­ли­чи­ны от­­­но­си­­тель­­нойпо­греш­ности пре­д­­­став­­ле­­ны в табл. 1.3.

Таблица 1.3

Параметр

Значение бинома при ис­поль­зовании формулы

n

a

b

(1.8)

(1.10)

5

7

10

15

1.5

1.5

1.5

1.5

2.5

- 2.5

2.5

- 2.5

2.5

- 2.5

2.5

- 2.5

1024 (+ 0%)

— 1 (+ 0%)

16384 (+ 0%)

— 1 (+ 0%)

1048576 (+ 0%)

1.00098 (+9.766e-2%)

21073741696 (+1.2e-5%)

1024.1940 (+1.89e-2%)

— 0.8770 (+11.3%)

16385.5449 (+9.4e-3%)

0.125 (+112.6%)

1048610 (+3.2e-3%)

1073747328 (+5.1e-4%)

Из таблицы вид­­но, что при b > 0 с уве­ли­че­ни­емnточ­ность вычислений рас­тет и практически ог­ра­­ни­чена толь­ко ошиб­­ка­ми округления, для от­­ри­ца­тель­ных же bуже приn>10 в случае ис­поль­зо­вания формулы (1.8) и приn ~ 5 в слу­чае ис­поль­зо­вания формулы (1.10) для фак­ториала по­греш­­ность рез­ко возрастает, что свя­зано с вычитанием боль­­­ших чисел в правой час­ти равенства (1.11). По­этому приb < 0 ре­ко­мен­ду­ется ис­поль­зо­вать эле­мен­тар­ную фор­му­­лу (a + b)n, на со­вре­мен­ных быст­ро­дей­ст­ву­ю­щих ЭВМ это даст не­ко­то­рый вы­и­грыш во времени счета.

Заметим, что совершенно аналогично может бытьпо­стро­е­­на процедура вычисления величины по­­­­ли­но­ма (1.12), по­э­то­­му она здесь не при­во­дит­ся.

Когда известно некоторое сочетание из nпоm, тог­­да вы­­числение следующего по порядку соче­та­­­ния мо-

­жет быть эффективно осуществлено с по­­­мощью про­це­ду­ры генератора сочетаний [Аге­ев и др., 1976], которая об­ра­зу­ет следующее по по­­ряд­ку сочетание из n целых чи­сел по m, ес­ли за­да­ны n, m и пред­шес­т­в­у­ющее со­че­та­ние.

Формальные параметры процедуры.Входные:n, m(типinteger); векторj [1:m] (типinteger) - пред­шес­­т­ву­ю­щее сочетание.Выходной:тот же векторj, в котором це­лые числа ме­­няются от 0 доn - 1 и всегда при входе и вы­хо­де из процедуры со­став­ля­ют мо­но­тон­ную стро­го воз­­рас­тающую по­­­сле­до­ва­тель­­ность. Если вход­ной век­торj сос­­то­ит из нулей, то в качестве пер­вого сочетания бу­дет по­­лучено (n - m, ..., n - 1).Та­кое же сочетание по­лу­­чит­­ся и пос­­ле со­четания (0, 1,..., k - 1),являющегося по­­след­ним зна­­­чением вектора jв этом цикле.

procedure comb (n, m : integer; var j : mas1);

var a, b, l : integer;

begin

for b:= 1 to m do

if j[b]>b then

begin

a:=j[b]-b-1;

for l:=1 to b do j[l]:=l+a;

exit;

end;

b:=n-m-1;

for l:=1 to k do

j[l]:=b+l;

end; {*** comb ***}.

Данный алгоритм был переведен авторами с язы­­ка AL­GOL на языкPASCALи проверен на ма­ши­­не IBM PC/AT-286 для тех же значений вход­ных па­раметров, что и в работе Агеева и др. (1976),n = 4, k = 3. В ка­чес­т­ве на­чального вектора jбыл вы­б­ран вектор (0,0,0). В ре­­зультате по­сле­до­ва­­тель­­ных об­ра­щений к процедуре по­­лу­чены сле­­ду­ющие со­че­та­ния: (1,2,3), (0,2,3), (0,1,3), (0,1,2), что пол­нос­тью соответствует ре­зуль­та­там тести­ро­­­ванияAL­GOL-программы, при­ве­ден­ными в ра­бо­те Аге­­­ева и др. (1976).

Соседние файлы в папке GLAVA1_1