ShikiPLはアスキーアートで書かれた数式を計算します。
ShikiPLはアスキーアートからJavaScriptのコードに変換します。

インストール

以下のように入力することでnpmからインストールすることができます。

$ npm install -g shikipl

使用方法

JavaScriptに埋め込みたいアスキーアートは\[…​\]内に記述します。

var f = \[
a = 1

         2
f(x) = 2x  + 1
\]

上記の例では、変数fは2つのプロパティを持ちます。
1つは定数値1を持つプロパティa、もう1つは引数を1つ持つ関数のプロパティfです。

ShikiPLにより生成されたオブジェクトは以下のように使用します。

console.log(f.f(2));  // outputs 9

ShikiPLコードが埋め込まれたJavaScriptファイルをJavaScriptコードに変換するには以下のコマンドを打ちます。

$ shikipl filename.js.shikipl

コードの詳細

定数と関数

左辺の変数がf(x)、またはsubscriptがあるときは関数、単純な変数名のときは定数になります。
関数の引数はカンマで区切ることで複数与えられます。

// f.aは定数、f.f、f.gは関数
var f = \[
a = 27

f(x) = x + 1

f  = x + 1
 x
\]

下に書かれた式は上に書かれた定数、関数の内容を参照できます。

var f = \[
a = 27

f(x) = x + a
\]
console.log(f.f(2));  // outputs 29

加算・減算

加算・減算は+,-を使用します。

var f = \[
f(x) = 2x + 1
\]
console.log(f.f(2));  // outputs 5

乗算

乗算は数または変数を並べて書きます。

var f = \[
f(x) = 2x
\]
console.log(f.f(3));  // outputs 6

乗算は加算より高い優先順位を持ちます。括弧を使えば優先順位を変えられます。

var f = \[
f(x) = 2x + 1

g(x) = 2(x + 1)
\]
console.log(f.f(3));  // outputs 7
console.log(f.g(3));  // outputs 8

べき乗

べき乗は数の右上に乗数を記述します。

var f = \[
        2
f(x) = x
\]
console.log(f.f(3));  // output 9

べき乗は乗算より高い優先順位を持ちます。括弧を使えば優先順位を変えられます

var f = \[
         2
f(x) = 2x

           2
g(x) = (2x)
\]
console.log(f.f(3));  // outputs 18
console.log(f.g(3));  // outputs 36

分数

分数は分子と分母の式をハイフンで上下に区切って記述します。

var f = \[
        x + 1
f(x) = -------
          2
\]
console.log(f.f(1));  // outputs 1

平方根

平方根は対象の式を根号で囲みます。以下の例は2次方程式の解の1つを求めます。

var f = \[
                     ________
                    / 2
              -b + v b  - 4ac
f(a, b, c) = -----------------
                     2a
\]
console.log(f.f(2, -4, 2));  // outputs 1

絶対値

絶対値は|…​|で囲みます。

var f = \[
f(x) = |x|
\]
console.log(f.f(-1));  // outputs 1

三角関数

三角関数はsin, cos, tanの後に対象の数を記述します。
sin a sin bと書いたときは(sin a)(sin b)の意味になります。

var f = \[
f(a) = sin a
\]
console.log(f.f(Math.PI / 2));  // outputs 1

sin, cos, tanの右上に乗数を記述することでべき乗を記述できます。

var f = \[
          2        2
f(a) = sin  a + cos  a
\]
console.log(f.f(8.765346283));  // outputs 1

乗数を-1にすることで逆三角関数を計算できます。

var f = \[
          -1
f(x) = tan   x
\]
console.log(4 * f.f(1));  // outputs 3.14159...

双曲線関数

双曲線関数はsinh, cosh, tanhの後に対象の数を記述します。
sinh a sin bと書いたときは(sinh a)(sin b)の意味になります。
双曲線関数をサポートしていないのにJavaScriptエンジンではPolyfillが必要になります。

var f = \[
f(a) = sinh a
\]
console.log(f.f(1));  // outputs 1.17520119...

sinh, cosh, tanhの右上に乗数を記述することでべき乗を記述できます。

var f = \[
           2         2
f(a) = sinh  a + cosh  a
\]
console.log(f.f(1));  // outputs 3.762195...

乗数を-1にすることで逆双曲線関数を計算できます。

var f = \[
           -1
f(x) = tanh   x
\]
console.log(0.5);  // outputs 0.54930614...

角度

数の右上にoを記述することで角度からラジアンに変換することができます。

var f = \[
            o
f(x) = sin x
\]
console.log(f.f(90));  // outputs 1

指数関数

指数関数はexpの後に対象の数を指定します。

var f = \[
f(x) = exp x
\]
console.log(f.f(1));  // outpus 2.71828...

対数関数

対数関数はlog, lnの後に対象の数を指定します。

var f = \[
f(a) = log a
\]
console.log(f.f(Math.E));  // outputs 1

logの右下に数を指定することで底を指定できます。lnではできません。

var f = \[
f(a) = log  a
          2
\]
console.log(f.f(8));  // outputs 3

定義済みの定数

e,π(\pi)は定義済みです。

var f = \[
a = e

b = π
\]
console.log(f.a);  // outputs 2.71828...
console.log(f.b);  // outputs 3.14159...

有限和

総和記号を使用することで有限和を計算することができます。

var f = \[
          3
       ---        2
f(a) =  >       an
       ---
          n = 1
\]
console.log(f.f(2));  // outputs 28

無限級数

和の上限を無限大にすることで無限級数を計算できます。

var f = \[
          oo    n
       ---     x
f(x) =  >     ----
       ---     n!
          n=0
\]
console.log(f.f(1))  // outputs 2.71828...

数値積分

積分記号を使用することで定積分を計算できます。
積分の変数は積分記号の直後に指定することが必要です。
積分の範囲は有限である必要があります。

var f = \[
          a
        /\      2
f(a) =  |   dx x
       \/
          0
\]
console.log(f.f(2));  // outputs 2.666...

アッカーマン関数

アッカーマン関数は以下の表式で定義される関数です。
与える数が大きくなると爆発的に大きくなるという特徴があります。

tex
tex
tex
var f = \[
A    = n+1
 0,n

A    = A
 m,0    m-1,1

A    = A
 m,n    m-1,A
             m,n-1
\]
console.log(f.A(3, 3)) // outputs 61

ベッセル関数

ベッセル関数は下記の微分方程式の解となる関数です。

tex

ここで、aは実数です。
ベッセル関数の解として以下の2つがあります。

tex
tex

上記の1つ目の式を第1種ベッセル関数(あるいは単にベッセル関数)、2つ目の式をノイマン関数とも呼びます。
(第1種)ベッセル関数をa=0のときに書き下すと以下のようになります。

tex

ShikiPLを用いて計算してみましょう。

var f = \[
          oo       m
       ---     (-1)     x  2m
J(x) =  >     ------- (---)
       ---     m!m!     2
          m=0
\]
console.log(f.J(1)) // outputs 0.76519...

グーデルマン関数

グーデルマン関数は以下の式で定義されます。

tex

また、以下の式と同値です。

tex
tex
var f = \[
          x
        /\        1
g(x) =  |   dt --------
       \/       cosh t
          0
\]
console.log(f.g(2)) // outputs 1.3017603...
var f = \[
          -1
g(x) = sin   tanh x
\]
console.log(f.g(2)) // outputs 1.3017603...
var f = \[
          -1
g(x) = tan   sinh x
\]
console.log(f.g(2)) // outputs 1.3017603...
var f = \[
           -1        x
g(x) = 2tan   (tanh ---)
                     2
\]
console.log(f.g(2)) // outputs 1.3017603...
var f = \[
           -1  x    π
g(x) = 2tan  (e ) - --
                    2
\]
console.log(f.g(2)) // outputs 1.3017603...