APL/J言語:多項式(ストープ、階段法)

APL/J言語:多項式(ストープ、階段法)
表現式*/ x + s * i. nはしばしば階乗関数(factorial function)と呼ばれますが、!(エクスクラメーションマーク、階乗)という原始関数との混乱を避けるためにストープ(階段式採掘法)と呼びます。この定義における要素はステップのサイズsによって変化します。炭鉱におけるストープ(階段式採掘法)でも同様です。ストープは保険数理計算や微分計算においいて便利です。

ストープは^(キャレット、累乗、パワー)の変形でもあります。^(キャレット、累乗、パワー)は上記の表現式のs=:0の場合に相当します。変形式^!.sによって提供されます。

   x + s * i. n  [ x=: 7 [ n=: 5 [ s=: _1
7 6 5 4 3

   (*/x + s * i. n);(x ^!.s n);(x ^!.0 n);(x^n)
 +----+----+-----+-----+
 |2520|2520|16807|16807|
 +----+----+-----+-----+

フレーズ+/c * x^!.s i.#cはストープ多項式とよばれます。同様に、+/c*x^i.#cを累乗多項式と呼ぶことができます。ここで副詞Pを定義し、任意のステップsについて対応するストープ多項式を生成したいと思います。

   P=: 1 : '+/@([ * ] ^!. x i.@#@[)"1 0'
   c=: 1 3 3 1 [ d=: 1 7 6 1 [ x=: 0 1 2 3 4
   (c p. x);(c 0 P x);(d _1 P x);(d p.!._1 x)
 +-------------+-------------+-------------+-------------+
 |1 8 27 64 125|1 8 27 64 125|1 8 27 64 125|1 8 27 64 125|
 +-------------+-------------+-------------+-------------+

上記でわかるように、ストープ多項式は係数を適宜に選択すれば通常の多項式と同等になります。さらに、相互の変換(transformation)は行列の積(matrix product)によって可能です。

   VM=: 1 : '[ ^!.x/ i.@#@]'
   TO=: 2 : '(x VM %. y VM)~ @i.@#'
   (0 TO _1 c) +/ . * c
1 7 6 1

行列の0から_1と_1から0は相互に逆行列(inverse)であり、スターリング数に単純に関係する。

   (0 TO _1 i.5);(_1 TO 0 i.5)
 +---------+------------+
 |1 0 0 0 0|1 0  0  0  0|
 |0 1 1 1 1|0 1 _1  2 _6|
 |0 0 1 3 7|0 0  1 _3 11|
 |0 0 0 1 6|0 0  0  1 _6|
 |0 0 0 0 1|0 0  0  0  1|
 +---------+------------+

ストープ多項式は変形式p.!.sによっても生成できます。