max関数の性質とその応用

## 何を述べているか
- 数学で見かける $\max$ 関数の性質とその応用方法について調べました。
- もしプログラミングで $\max$ 関数を自作することになった場合、「大きい方を返す」という仕様は一見して条件分岐を伴います。
  - しかし、$\max$ 関数の性質を考えると、絶対値の計算ができれば条件分岐なしで実装できることが分かります。
- さらに、この性質を数学の問題を解くことに応用できないか検討しました。

## きっかけ
都内の中高生向けプログラミングスクールでメンターをしています。
使用しているテキストの「関数」の章に、$\max$ 関数を自作するという練習問題がありました。仕様は以下となります。

| | $\max$ 関数の仕様 |
|:-:|:-:|
| 関数名 | $\max$ |
| 引数 | 第1引数（整数）、第2引数（整数）[^0] |
| 戻り値 | 整数 |
| 処理内容 | 第1引数と第2引数を比較して、大きい方の数値を戻り値として返す |

この仕様に従って $\max$ 関数を実装してみました。[^1]

```js
function max(arg1, arg2) {
  if (arg1 >= arg2) {
    return arg1;
  }
  return arg2;
}
```

このソースコードは問題なく動作します。
しかし、本当に条件分岐を使わなければ $\max$ 関数を実装することはできないのでしょうか？

結論から言えば、これから説明する $\max$ 関数の性質を利用すれば、条件分岐なしで実装することができそうです。

## 定義
ここで改めて $\max$ 関数と $\min$ 関数を定義しておきます。

- 任意の実数 $a,b$ の小さくない方を返す関数を $\max(a,b)$ とする。

```math
\max(a,b) =
\left\{
  \begin{array}{l}
    a \quad (a \geq b) \\
    b \quad (a \lt b)
  \end{array}
\right.
```

- 任意の実数 $a,b$ の大きくない方を返す関数を $\min(a,b)$ とする。

```math
\min(a,b) =
\left\{
  \begin{array}{l}
    b \quad (a \geq b) \\
    a \quad (a \lt b)
  \end{array}
\right.
```

## max関数とmin関数の性質
任意の実数 $a,b$ に対して、$\max$ 関数と $\min$ 関数は、それぞれ以下の等式を満たす。

```math
\begin{align}
  \max(a,b) = \frac{1}{2}(a+b+|a-b|) \\[10pt]
  \min(a,b) = \frac{1}{2}(a+b-|a-b|)
\end{align}
```

### 導出方法
$a, b$ の大小に関わらず、$\max$ 関数と $\min$ 関数について、以下の2式が成立する。

```math
a+b = \max(a,b) + \min(a,b) \\[5pt]
|a-b| = \max(a,b) - \min(a,b)
```

よって、上式と下式の両辺を足すと $\max$ 関数、上式から下式の両辺を引くと $\min$ 関数の等式が得られる。

### 解釈
$a, b$ の大小関係を $a \le b$ と仮定すると、以下の図より、

```math
\max(a,b) = b = \frac{a+b}{2}+\frac{|a-b|}{2} \\[5px]
\min(a,b) = a = \frac{a+b}{2}-\frac{|a-b|}{2}
```

![graph1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142063/546844af-0d4f-29d5-2ab5-6a3521c94eee.png)

### 実装
したがって、この性質を利用すると、条件分岐なしで $\max$ 関数を実装することができます。

```js
function max(arg1, arg2) {
  return (arg1 + arg2 + Math.abs(arg1 - arg2)) / 2;
}
```

## 応用問題
ここからは $\max$ 関数の性質の応用方法を検討します。

### 例題1
任意の実数 $a,b,c,d$ に対して、以下の不等式が成立することを示せ。

```math
\max(a+b,c+d) \leq \max(a,c) + \max(b,d)
```

### 例題1の解答
$\max$ 関数の性質より、

```math
\begin{align*}
  \max(a+b,c+d) &= \frac{1}{2}\Bigl\{(a+b)+(c+d)+\bigl|(a+b)-(c+d)\bigr|\Bigr\} \\[5px]
  &= \frac{1}{2}\Bigl\{(a+c)+(b+d)+\bigl|(a-c)+(b-d)\bigr|\Bigr\} \\[5px]
  &\leq \frac{1}{2}(a+c+|a-c|) + \frac{1}{2}(b+d+|b-d|) \\[5px]
  &= \max(a,c) + \max(b,d)
\end{align*}
```

評価のため、三角不等式 $|x+y| \leq |x| + |y|$ を用いた。

### 例題2
同じ定義域を持つ2つの関数 $f(x)$ と $g(x)$ から、それらと同じ定義域を持つ関数 $h(x)$ を

```math
h(x) = \max\bigl(f(x), g(x)\bigr)
```

によって定義する。 $f(x)$ と $g(x)$ が連続関数ならば $h(x)$ も連続関数であることを証明せよ。

### 例題2の解答
$\max$ 関数の性質より、

```math
h(x) = \max\bigl(f(x),g(x)\bigr) = \frac{1}{2}\Bigl\{f(x)+g(x)+\bigl|f(x)-g(x)\bigr|\Bigr\}
```

連続関数の和や差を取った関数は連続である。また、$|f(x)-g(x)|$ について、連続関数の合成関数は連続関数となることから、2つの連続関数 $s(x)=|x|$ と $f(x)-g(x)$ の合成関数 $\bigl(s\circ(f-g)\bigr)(x)$ も連続である。

よって、$h(x)$ は連続関数である。

### 例題3
$x,y$ を $0$ 以上 $1$ 以下の実数とする。このとき、以下の問いに答えよ。ただし、$a,b,c,d$ が実数のとき、$\max(a,b)$ は $a,b$ のうちの最大の数を表し、$\max(a,b,c,d)$ は $a,b,c,d$ のうちの最大の数を表す。

$(1)$ $\max(xy, 1-xy)$ の最小値を求めよ。
$(2)$ $\max(xy, 1-xy, x, y)$ の最小値を求めよ。

### 例題3の解答
$(1)$
$0 \leq x \leq 1$、$0 \leq y \leq 1$ より、$t=xy$ とおくと、$0 \leq t \leq 1$
$\max(xy, 1-xy) = \max(t, 1-t)$ のグラフは以下のようになる。[^2]

![graph2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142063/52563333-1dce-43ed-b896-60fd4ce27fd4.png)

よって、$\max(t,1-t)$ は $\displaystyle{t=\frac{1}{2}}$ のとき最小値をとる。
すなわち、$\displaystyle{xy=\frac{1}{2}}$ のとき、最小値 $\displaystyle{\frac{1}{2}}$ をとる。

$(2)$
$0 \leq x \leq 1$、$0 \leq y \leq 1$ より、$t=xy$ とおくと、$0 \leq t \leq 1$
$\max(a,b,c)$ は $a,b,c$ のうちの最大の数を表すとすると、

```math
\max(xy,1-xy,x,y) = \max\bigl(t,1-t,\max(x,y)\bigr)
```

ここで、$\max$ 関数の性質と相加相乗平均の関係から、

```math
\max(x,y) = \frac{1}{2}(x+y+|x-y|) \geq \frac{1}{2}(x+y) \geq \sqrt{xy} = \sqrt{t}
```

この不等式の等号は $x=y$ のとき常に成立し、$\max(x,y)$ は高々 $\sqrt{t},\; (0\leq t\leq 1)$
また、$t \leq \sqrt{t},\; (0\leq t\leq 1)$ である。

以上より、

```math
\begin{align*}
  \max\bigl(t,1-t,\max(x,y)\bigr) &= \max(t,1-t,\sqrt{t}) \\
  &= \max\bigl(\max(t,\sqrt{t}), 1-t\bigr) \\
  &= \max(\sqrt{t},1-t)
\end{align*}
```

$\max(\sqrt{t},1-t)$ のグラフは以下のようになる。[^3]

![graph3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142063/f269f76f-88ab-bfcd-4ae3-7132d1e697cc.png)

$\sqrt{t}$ と $1-t$ の交点を $\alpha,\; (0\leq\alpha\leq1)$ とすると、$\alpha$ は $\sqrt{t}=1-t$ の解であることより、$\displaystyle{\alpha = \frac{3-\sqrt{5}}{2}}$ である。
よって、$\max(\sqrt{t},1-t)$ は $\displaystyle{t = \frac{3-\sqrt{5}}{2}}$ のとき最小値をとる。
すなわち、$\displaystyle{xy = \frac{3-\sqrt{5}}{2}}$ のとき、最小値 $\displaystyle{\frac{-1+\sqrt{5}}{2}}$ をとる。

## 所感
- これまで $\max$ 関数を、絶対値を含む数式で書き換える機会がなかったので、記事を書いていてとても新鮮でした。
- この性質にも名前がありそうなんですが、探しても見つかりませんでした。もしご存知の方がいらっしゃいましたら教えてください。
- Qiita で数式を書くと、本文とずれたり、横スクロールバーが出たりするので難しいです。

[^0]: 整数は演算の途中で Number.MAX_SAFE_INTEGER を超えない数とする。
[^1]: JavaScript をはじめとする多くの言語で $\max$ 関数が存在することは承知していますが、ここは練習問題にお付き合いください。
[^2]: $xy$-平面として作図してしまいましたが、実際は $z(t) = \max(t, 1-t)$ としたときの $tz$-平面をイメージしてください。
[^3]: $xy$-平面として作図してしまいましたが、実際は $z(t) = \max(\sqrt{t}, 1-t)$ としたときの $tz$-平面をイメージしてください。