関数の性質から数式へ逆引き

# はじめに

使いたい性質から具体的な関数を探し出すためのまとめです。
活用事例としては以下が挙げられるかと考えています。

* 機械学習の特徴量/目的変数に使用するときに、特定の意図を持って加工しておきたい
* ゲームのパラメータから効果値への変換時の数式の検討をしたい
* 数理モデルの推論時に目星をつけたい

基本的に要望を数式化して、その微分方程式などを解いた結果を書く、という流れにしていきます。
パラメータ $x$ を使用し、条件に合致する関数 $f(x)$ を考える、流れにしていきます。
また、 $a,b$ は任意の実数とし、ハイパーパラメータのような性質に関わらない部分に使います。大きさ調整をするためによしなに検討してください。

### パラメータがn倍になったら、同じく計算結果もn倍になってほしい

まずは数式化します。

* パラメータがn倍になったら　→　入力が $nx$
* パラメータがn倍になったときの計算結果　→　$f(nx)$
* 元々の計算結果　→　$f(x)$
* 元々の計算結果のn倍　→　$nf(x)$

満たすべき条件は以下になります。
$$f(nx)=nf(x)$$
これを解くと、以下のような一次関数になります。
$$f(x)=ax$$

(解き方)
$x=1$を代入すると $f(n \times 1)=nf(1)$になります。
$n$は任意の実数だったので、$x$に置き換えても問題ないので $f(x \times 1)=xf(1)$ が成り立ちます。
$f(1)$ が基準になるのですが、基準は任意に決めてよい部分になるので $a=f(1)$ で置き換えると $f(x)=ax$ となります。

### パラメータがn倍になったら、逆に計算結果はnで割った数になってほしい

* パラメータがn倍になったら　→　入力が $nx$
* パラメータがn倍になったときの計算結果　→　$f(nx)$
* 元々の計算結果　→　$f(x)$
* 元々の計算結果をnで割った数　→　$\frac{f(x)}{n}$

満たすべき条件は以下になります。
$$f(nx)= \frac{f(x)}{n}$$
これを解くと、以下のような反比例の関数になります。
$$f(x)= \frac{a}{x}$$

(解き方)
$x=1$を代入すると $f(n \times 1)= \frac{f(1)}{n}$になります。
$n$は任意の実数だったので、$x$に置き換えても問題ないので $f(x \times 1)= \frac{f(1)}{x}$ が成り立ちます。
$f(1)$ が基準になるのですが、基準は任意に決めてよい部分になるので $a=f(1)$ で置き換えると $f(x)= \frac{a}{x}$ となります。

### パラメータがn倍になったら、計算結果は(nの2乗)倍になってほしい

* パラメータがn倍になったら　→　入力が $nx$
* パラメータがn倍になったときの計算結果　→　$f(nx)$
* 元々の計算結果　→　$f(x)$
* 元々の計算結果の $n^2$ 倍　→　$n^2f(x)$

満たすべき条件は以下になります。
$$f(nx)=n^2f(x)$$
これを解くと、以下のような2次関数になります。
$$f(x)= ax^2$$

(解き方)
$x=1$を代入すると $f(n \times 1)=n^2f(1)$になります。
$n$は任意の実数だったので、$x$に置き換えても問題ないので $f(x \times 1)=x^2f(1)$ が成り立ちます。
$f(1)$ が基準になるのですが、基準は任意に決めてよい部分になるので $a=f(1)$ で置き換えると $f(x)=ax^2$ となります。

### パラメータがa倍になるごとに、計算結果に1ずつ足されてほしい

$a>0$ とします。また、$\sqrt{a}$ 倍なら1/2が足されるような滑らかな関数を想定しています。

* パラメータがa倍になったら　→　入力が $ax$
* パラメータがa倍になったときの計算結果　→　$f(ax)$
* 元々の計算結果　→　$f(x)$
* 元々の計算結果に1を足した数　→　$f(x)+1$

満たすべき条件は以下になります。
$$f(ax)= f(x)+1$$
これを解くと、以下のような関数になります。
$$f(x)= \log_{a}{x}+b$$

(解き方)
両辺を$a$を底として指数をとると $a^{f(ax)}=a^{f(x)+1}$になります。
指数法則より、 $a^{n+m}=a^n \times a^m$ なので、 $a^{f(ax)}=a^{f(x)} \times a$になります。
ここで、 $g(x)=a^{f(x)}$ と定義すると、先ほどの式は $g(ax)=g(x) \times a$ と書き直せます。
$g(ax)=ag(x)$ は $b'$ を任意の定数として $g(x)=b'x$ と解けるので、 $a^{f(x)}=b'x$ となります。
両辺を$a$を底とした対数を取ると、 $f(x)= \log _a(b'x)$
対数の性質 $\log _a(nm)= \log _an+ \log _am$ を使うと、$f(x)= \log _ax+\log _ab'$ になります。
$\log _ab'$ は定数なので纏めて $b= \log _ab$ で置き換えると $f(x)= \log _ax+b$ となります。

※補足
先ほどと違い、 $g(ax)=ag(x)$ の部分は任意の $a$ を持つわけではないので、例えば $g(x)=a^{FLOOR(\log _ax)}$ といった関数でも進められてしまいます。
ただ、 $\sqrt{a}$ 倍なら1/2が足されるような、連続であるという条件を付けくわえると $g(x)=b'x$ になります。ややこしめなので省略しました。

### パラメータがa倍になるごとに、計算結果に1ずつ引かれてほしい

* パラメータがa倍になったら　→　入力が $ax$
* パラメータがa倍になったときの計算結果　→　$f(ax)$
* 元々の計算結果　→　$f(x)$
* 元々の計算結果から1を引いた数　→　$f(x)-1$

満たすべき条件は以下になります。
$$f(ax)= f(x)-1$$
これを解くと、以下のような関数になります。
$$f(x)= -\log_{a}{x}+b$$

(解き方)
両辺に-1をかけてから $a$ を底として指数をとると $a^{-f(ax)}=a^{-f(x)+1}$になります。
指数法則より、 $a^{n+m}=a^n \times a^m$ なので、 $a^{-f(ax)}=a^{-f(x)} \times a$になります。
ここで、 $g(x)=a^{-f(x)}$ と定義すると、先ほどの式は $g(ax)=g(x) \times a$ と書き直せます。
$g(ax)=ag(x)$ は $b'$ を任意の定数として $g(x)=b'x$ と解けるので、 $a^{-f(x)}=b'x$ となります。
両辺を$a$を底とした対数を取ると、 $-f(x)= \log _a(b'x)$
両辺に-1をかけて対数の性質 $\log _a(nm)= \log _an+ \log _am$ を使うと、$f(x)= -\log _ax-\log _ab'$ になります。
$- \log _ab'$ は定数なので纏めて $b=- \log _ab$ で置き換えると $f(x)=- \log _ax+b$ となります。

### パラメータに1足されるごとに、計算結果にaずつ足されてほしい

1/2足される場合はa/2足されるような滑らかな関数を想定しています。
また、aが負なら引かれることになります。

* パラメータに1足されるごとに計算結果はaずつ足される　→　パラメータにn足されるごとに計算結果はanずつ足される
* パラメータにn足される　→　$x+n$
* パラメータにn足された後の計算結果　→　$f(x+n)$
* 元々の計算結果　→　$f(x)$
* 元々の計算結果にanを足した数　→　$f(x)+an$

満たすべき条件は以下になります。
$$f(x+n)= f(x)+an$$
これを解くと、以下のような関数になります。
$$f(x)= ax+b$$

(解き方)
$x=0$を代入すると $f(0+n)=f(0)+ax$になります。
$n$は任意の実数だったので、$x$に置き換えても問題ないので $f(0+x)=f(0)+ax$ が成り立ちます。
$f(0)$ が基準になるのですが、基準は任意に決めてよい部分になるので $b=f(0)$ で置き換えると $f(x)=ax+b$ となります。

### パラメータに1足されるごとに、計算結果はa倍されてほしい

1/2足される場合は $\sqrt{a}$ 倍になるような滑らかな関数を想定しています。

* パラメータに1足されるごとに計算結果はa倍される　→　パラメータがn足されるごとに計算結果は $a^n$ 倍になる
* パラメータにn足される　→　$x+n$
* パラメータにn足された後の計算結果　→　$f(x+n)$
* 元々の計算結果　→　$f(x)$
* 元々の計算結果の $a^n$ 倍　→　$a^nf(x)$

満たすべき条件は以下になります。
$$f(x+n)= a^nf(x)$$
これを解くと、以下のような関数になります。
$$f(x)= a^xb$$

(解き方)
$x=0$を代入すると $f(0+n)=a^nf(0)$になります。
$n$は任意の実数だったので、$x$に置き換えても問題ないので $f(0+x)=a^xf(0)$ が成り立ちます。
$f(0)$ が基準になるのですが、基準は任意に決めてよい部分になるので $b=f(0)$ で置き換えると $f(x)=a^xb$ となります。

### aごとの周期を持たせたい

ここでは $a>0$ とします。
曜日ごとに纏められたら良いようなカテゴリーに使うのか、滑らかで切れ目がないような周期のある変数に変えたいのかで方法が変わります。

#### カテゴリーとして使いたい

$a=3$ の時の例だと以下のように互い違いにグループ分けをしたいという内容です。

|カテゴリー|含まれるパラメータ|
|:-:|:-:|
|0|0, 3, 6, ......|
|1|1, 4, 7, ......|
|2|2, 5, 8, ......|

* 周期がaである　→　aを足した後の計算結果が元々の計算結果と変わらない
* aを足した後の計算結果　→　$f(x+a)$
* カテゴリーとして使いたい　→　差がa未満のときには別の計算結果にしたい
* 差がa未満のときの計算結果　→　$0<n^ \forall <a, f(x+n)$

満たすべき条件は以下になります。
$$f(x+a)=f(x)$$ $$0<n^ \forall <a \Rightarrow f(x+n) \neq f(x)$$
この条件を満たす関数はいくつもあるのですが、一例としては剰余関数がこの条件を満たします。
$$f(x)=MOD(x,a)$$

#### 切れ目がない遷移をする周期のある変数として使いたい

時間の「分」というようなイメージで、0:05と0:07は2分しか違わないのと同じように0:59と1:01も2分しか違わないとしたいという内容です。
何かしら引き算に対応する演算で「$7 \ominus 5=1 \ominus 59$」となるようにしたいということになります。
※引き算もどきなのでマイナス記号を使うのが自然ですが、別の演算ということを明示するため丸文字にしています。

剰余群 $\mathbb{R}/60\mathbb{Z}$ が使用できるのならそれで終いなのですが、計算結果は実数の要素として考えたいという内容で書きます。


満たすべき条件は以下になります。
$$f(x+a)=f(x)$$ $$0<n^ \forall <a \Rightarrow f(x+n) \neq f(x)$$ $$0<n^ \forall <a, x^ \forall, y^ \forall \Rightarrow f(x+n) \ominus f(x)=f(y+n) \ominus f(y)$$
この条件を実数の範囲で通常の引き算で満たす関数は存在しないので、2次元の値の例になります。また、引き算は角度の差を見ています。
```math
f(x)= \left ( \begin{array}{c} \sin(\frac{2 \pi x}{a}) \\ \cos(\frac{2 \pi x}{a}) \end{array} \right ), \quad
\left ( \begin{array}{c} x_1 \\ y_1 \end{array} \right ) \ominus \left ( \begin{array}{c} x_2 \\ y_2 \end{array} \right ) = \left ( \begin{array}{c} x_1y_2-x_2y_1 \\ x_1x_2+y_1y_2 \end{array} \right )
```

### 0を基準としてaごとに1増えるカテゴリーを作りたい

先ほどはa/2足されると1/2増える内容だったのですが、カテゴリーということで、aにたどり着くまでは増えない想定です。
$a=3$とすると以下のようなイメージです。

|カテゴリー(通し番号方式)|カテゴリー(代表値方式)|含まれるパラメータ|
|:-:|:-:|:-:|
|0|0|0, 1, 2|
|1|3|3, 4, 5|
|2|6|6, 7, 8|
| $\vdots$ | $\vdots$ | $\vdots$ |

通し番号方式の場合は以下のように切り捨てを行います。
$$f(x)=FLOOR \left ( \frac{x}{a} \right)$$
代表値方式の場合は以下のように剰余関数を使います。
$$g(x)=x-MOD(x,a)$$

### 微分した値が定数aになってほしい

ここからは微分と書きますが、傾きと読み替えてもOKです。書き換えると「傾きが一定の値になってほしい」という内容です。

* 微分した値　→　$\frac{d}{dx} f(x)$

満たすべき条件は以下になります。
$$\frac{d}{dx} f(x)= a$$
これを解くと、以下のような関数になります。
$$f(x)= ax+b$$

(解き方)
両辺を $x$ で積分をすると $\int \frac{d}{dx} f(x) dx= \int adx$になります。
$b$を積分定数として、 $f(x)=ax+b$ となります。

### 微分した値がその時のパラメータのa倍と同じになってほしい

* 微分した値　→　$\frac{d}{dx} f(x)$
* その時のパラメータのa倍　→　$ax$

満たすべき条件は以下になります。
$$\frac{d}{dx} f(x)= ax$$
これを解くと、以下のような関数になります。
$$f(x)= \frac{a}{2}x^2+b$$

(解き方)
両辺を $x$ で積分をすると $\int \frac{d}{dx} f(x) dx= \int axdx$になります。
$b$を積分定数として、 $f(x)= \frac{a}{2}x^2+b$ となります。

### 微分した値がその時の計算結果のa倍と同じになってほしい

* 微分した値　→　$\frac{d}{dx} f(x)$
* その時の計算結果のa倍　→　$af(x)$

満たすべき条件は以下になります。
$$\frac{d}{dx} f(x)= af(x)$$
これを解くと、以下のような関数になります。
$$f(x)= be^{ax}$$

(解き方)
$f(x) \neq 0$ として両辺を $f(x)$ で割ると、 $\frac{1}{f(x)} \frac{d}{dx}f(x)=a$ となります。
この両辺を $x$ で積分をすると $\int \frac{1}{f(x)} \frac{d}{dx} f(x) dx= \int adx$になります。
左辺は積分の変数変換を行うことでCを積分定数として、 $\int \frac{1}{f(x)} \frac{d}{dx} f(x) dx= \int \frac{1}{f(x)} df(x)= \log f(x)+C$ と解くことが出来ます。
元の等式に戻ると $b'$ を積分定数として、 $\log f(x)=ax+b'$ となります。
両辺の指数をとって、 $f(x)=e^{ax+b'}=e^{ax}e^{b'}$
$e^{b'}$ は定数なので纏めて $b=e^{b'}$ で置き換えると $f(x)=be^{ax}$ となります。

## 最後に

お目当てのものはありましたでしょうか？
ちょっとした変換を使うときに都合の良い関数が見つかっていれば幸いです。
ここにないものも満たすべき条件って何だろうを書き下してから整理するとうまく見つかることがあるので、その流れも参考にしてみてください。