在浏览来自苏联大型机 BESM-6 的磁盘映像时,我发现了一些用于 Algol-60 的计算数学库的点点滴滴,它们以明文形式存储(如果使用奇偶校验的苏联GOST 10859编码,就像在穿孔卡片上一样,可以认为是明文)。
由于以诙谐/熟悉的方式表达的错误消息,一个功能特别令人感兴趣。函数名的意思是LAGRANGE2,几个单字母Cyrillic变量名应该不会太混乱。
为了便于阅读,我添加了空格、缩进和重排文本:
_REAL _PRОCEDURE ЛАГРАНЖ2(A,Х,У,Х1,Х2,P,П,П1);
_REAL Х1, Х2; _INTEGER P, П, П1; _ARRAУ A, Х, У;
_BEGIN
_REAL S, Z, Z1;
_INTEGER I, J, J1, К;
_ARRAУ S1[0:20];
_INTEGER Я, Я1;
_IF Х2 < A[1] _THEN _BEGIN
Z := Х2;
_GО _TО М3;
_END ;
_IF Х1 < Х[1] _THEN _BEGIN
Z := Х1;
_GО _TО М3;
_END ;
S := 0;
_FOR J1 := 1 _STEP 1 _UNTIL П1 _DО
_IF Х2 ≥ A[J1] ∧ Х2 ≤ A[J1+1] _THEN
_GО _TО М1;
Z := Х2;
_GО _TО М2;
М1: _FOR I := 1 _STEP 1 _UNTIL П _DО
_IF Х1 ≥ Х[I] ∧ Х1 ≤ Х[I+1] _THEN
_GО _TО М;
Z := Х1;
_IF Х1 ≤ Х[П] _THEN
_GО _TО М;
М2: _IF Х2 ≤ A[П1] _THEN
_GО _TО М;
М3: ОUTPUT(‘T’,‘ПРИ ОБРАЩЕНИИ К ПРОЦЕДУРЕ ЛАГРАНЖ2 АРГУМЕНТ=’,
‘E’,Z,‘T’,
‘ВЫШЕЛ ЗА ПРЕДЕЛЫ ТАБЛИЦЫ. РАЗБЕРИСЬ В ЧЕМ ДЕЛО, А Я ПРЕРЫВАЮ СЧЕТ. ДО ВСТРЕЧИ!’);
ОUTPUT(‘×’);
S := S / 0;
М: _IF I ≤ П - P _THEN
J := I
_ELSE
J := П - P;
_IF J1 > П1 - P _THEN
J1 := П1 - P;
Я1 := J1;
_FOR Я := 0 _STEP 1 _UNTIL P _DО _BEGIN
S := 0;
_FOR I := 0 _STEP 1 _UNTIL P _DО _BEGIN
Z := Z1 := 1;
_FOR К := 0 _STEP 1 _UNTIL P _DО _BEGIN
_IF К ≠ I _THEN
Z := Z × (Х1 - Х[К+J]) / (Х[I+J] - Х[К+J]);
_END ;
S := S + У[I + J + (J1 - 1) × П] × Z;
_END ;
S1[Я] := S;
J1 := J1 + 1;
_END ;
S := 0;
_FOR I := 0 _STEP 1 _UNTIL P _DО _BEGIN
Z := Z1 := 1;
_FOR К := 0 _STEP 1 _UNTIL P _DО _BEGIN
_IF К ≠ I _THEN
Z := Z × (Х2 - A[К + Я1]) / (A[I + Я1] - A[К + Я1]);
_END ;
S := S + S1[I] × Z;
_END ;
ЛАГРАНЖ2 := S;
_END
错误消息的意思是“调用 LAGRANGE2 过程时,参数值在表之外。找出问题所在,我正在中断计算。再见!”。打印消息后,强制出现除零错误。
那个函数在计算什么?一个猜测是拉格朗日插值,但计算所有系数只产生一个结果是浪费的。此外,有 3 个输入数组,而不是预期的两个。