Главная страница Алгоритмы [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
Свидетельство к алгоритму 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 |