Главная страница  Алгоритмы 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [ 39 ] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57]

Процедура legendr47 была транслирована н-а машицр М-220 для х=0, 0.3, 0.6, 0.9, 1; п=1, 2, 3, 4; т=1, 2,.. ..., п и r=true, false.

Результаты трансляции .полностью совпали с контрольными значениями функций Лежандра, вычисленными по конечным формулам, приведенным в работе Е. Янке и др. [32, с. 162-163]. Некоторые из полученных результатов приведены в табл. 19.

Таблица 19

true

г = false

х = 0.3

л: = 0.6

х=: 0.3

л; = 0.6

0.95393920

8.0000000

1.0440306

1.1661903

0.85854528

1.4400000

-0.93962758

-2.0991426

"2

2,7oUUUUU

1.9200000

-3.2700000

-4.0800000

13.021270

7.6800000

-17.069901

-23.790283

-1.6956269

-5.7600000

2.8423734

9.6560563

27.344667

32.256000

35.846792

99.919191

Свидетельство к алгоритму 47а

Алгоритм 47а получен в результате исправления, сокращения щ ординарной переработки алгоритма 47 (Herndon J. R. «САСМ», 1961, №.4). Кроме указанных в нижеследующем «Подтверждении» Р. Георга, были внесены новые исправления для ликвидации ошибки, заключающейся в том, что оператор y: = wl{xXx) теряет смысл при л;=0.

Подтверждение к алгоритму 47 Р. Георг (G е о г g R. «САСМ», 1963, № 8)

Эта процедура была запрограммирована на языке ФОРТРАН для вычислительной машины IBM-1620 и проверена для некоторого числа вещественных аргумен-тов. Были обнаружены некоторые ошибки... *.

* Указываются шесть ошибок в алгоритме 47, исправленных в алгоритме 47а, и отмечается возможность сокращения алгоритма. {Прим. ред.)



Щ С. Кобб (Cobb S. М. «САСМ», 1969, № 11)

V Эта процедура была проверена и прошла на машине Ис.Т. Atlas. Кроме ошибок, упомянутых в «Подтверждении» Р. Георга (Georg R. «САСМ», 1963, № 8), было замечено следующее.

1. Требование, чтобы р:=0 при п<т, должно пред-ществовать т)ребова«ию, чтобы р\ = \ при п=0. Следова-тельно, первые два условных оператора- иуж.но поменять "лестам-и.

2. Большинство машин пе могут выполнять деление на нуль. Следовательно, оператор, начинающийся с

ifx=Othen

.и заканчивающийся

go to lab end;

нужно поставить перед оператором «/: = l/xf2;

3. При л;=0 (если аргумент функции Лежандра вещественный) р нужно умножать на i(-1)*. Для этого после оператора, начинающегося с

p: = g[m + n+l],

необходимо вставить условный оператор if г then р:=рХ(-1)1; (относительно изменения смысла переменной г ом. п. 5).

4. После метки lab в составном операторе, следующим за условием if гф() then, оператор i: = n - п-4; не верен. Он должен быть i:=n-4Х(п-4);

5. Поскольку г используется только как указатель, то лучше присвоить ему тип Boolean. Тогда можно задавать ему значение true, если аргумент функции Лежандра вещественный, и false - если мнимый. Необходимы следующие изменения в процедуре.

Условие if г=0 then нужно заменить на if г then.

I- Условие if гф() then нужно заменить на if \г then.

6. Имеется несколько путей экономии машинного времени. Во-первых, можно описать еще одну целую переменную k и положить ее равной п-т. Тогда первым

, * Перевод этого «Подтверждения» адаптирован для удобства использования его в алгоритме 47а. Ошибки, указываемые в замечаниях 1 и 2 данного «Подтверждения», бы.пя уже обнаружены ранее авторами выпусков и исправлены при составлении алгоритма 47а. (Прим. ред.)



оператором будет

к:=п-т;

Первый условный оператор будет начинаться с if ft<Q tlien (это вместо условия if n<in then, расположение которого изменено согласно п. 1). Выражение п-т sa. меняется на k в операторе*

z:=xt(n-т);

и в строке **

if(i + i)=(n-m)then

Если ИСКЛЮЧИТЬ /, как это было предложено в «Под-тверждении» Р. Георга (George R. «САСМ», 1963 № 8), то эта буква освободится .и ее МОЖНо будет исполь-зовать .для запоминания значения k--2. Это вызовет следующие модификации.

- После оператора-[1]: = 1; вставляется оператор

j:-k-2;

В операторе, начинающемся с if х=0 then crpoicy begin i: = (n-m) -н2, нужно заменить на строку

begin

Дальнейшая экономия машинного времени может быть достигнута путем замены n-i на в операторе, начинающемся с

for i: = l step 1 until 12 do Следовательно, оператор цикла примет вид (в оригинале данного «Подтверждения» этот оператор содержит опечатку-отсутствует открывающая круглая скобка.- Прим. ред.)

for i:= 1 step 1 until 12 do begin k: = n-i;

if j +1 <i then go to lab; p:==p + g[2Xk+3l Xz/(g[i] Xg[k+2] X g[k-i-m--3]);

* В алгоритме 47 ему соответствует оператор цикла с заго.;10в-

for i:= 1 step ,1 until п-m do

** В оригинале «Подтверждения» С. Кобба эта строка содержит опечатку и имеет вид

if (1+1)Фп-т then В алгоритме 47а это условие было исправлено и переписано в виде

If п-тф2 X 1 then

{Прим. ред.)




[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [ 39 ] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57]

0.0157