//RCI関数 function RCI1; input s(series), period(number), f(number); result res(series); vars ptbl(series), ttbl(series), i(number), j(number), k(number), w(number), sum(number), P3(number); begin f := max(front(s), f); P3 := 6 * 100 / (period * (period * period - 1)); ptbl := makeseries(1, period, 0); ttbl := makeseries(1, period, 0); for i := 1 to period do begin ptbl[i] := s[f + i - 1]; ttbl[i] := period - i + 1; end; //バブルソート for i := 1 to period do begin for j := 1 to period do begin if ptbl[i] > ptbl[j] then begin w := ptbl[i]; ptbl[i] := ptbl[j]; ptbl[j] := w; w := ttbl[i]; ttbl[i] := ttbl[j]; ttbl[j] := w; end; end; end; //1回目のRCI計算 sum := 0; for j := 1 to period do begin w := ttbl[j] - j; sum := sum + w * w; end; res[period] := 100 - sum * P3; //メイン処理 for i := f + period to back(s) do begin //古いデータ削除・時間ランクを全てシフト for j := 1 to period do begin if ttbl[j] = period then begin if j < period then begin for k := j to period - 1 do begin ptbl[k] := ptbl[k + 1]; ttbl[k] := ttbl[k + 1] + 1; end; end; ptbl[period] := 0; ttbl[period] := 0; break; end; ttbl[j] := ttbl[j] + 1; end; //新しいデータ挿入・RCI計算 sum := 0; for j := 1 to period do begin if ptbl[j] < s[i] then begin if j < period then begin for k := period - 1 downto j do begin ptbl[k + 1] := ptbl[k]; ttbl[k + 1] := ttbl[k]; w := ttbl[k + 1] - (k + 1); sum := sum + w * w; end; end; ptbl[j] := s[i]; ttbl[j] := 1; w := ttbl[j] - j; sum := sum + w * w; break; end; w := ttbl[j] - j; sum := sum + w * w; end; res[i] := 100 - sum * P3; end; end.