ある関数

http://d.hatena.ne.jp/sumii/20060418/1145352301

f : R -> Rであって、f(f(x)) = -xとなるような関数fを求めよ。

まず、いろいろと考えてみる。まず、f(0) = 0であることがすぐに分かる。というのは、f(0) = xと置くと、f(x) = f(f(0)) = -0 = 0で無ければならない。そうすると、f(f(f(0))) = f(f(-x)) = -xであり、かつf(f(f(0))) = f(-0) = f(0) = xなので、x = -xとなる。よって、f(0) = 0となる。
次に、f(x) = -f(-x)であることも分かる。f(x) = yと置く。すると、f(f(f(x))) = f(f(y)) = -yであり、f(f(f(x))) = f(-x)なので、成立する。
すると、さらに次のようなことが分かる。この関数では、1つの正の値に対して1つの正の値が対応している。つまり(x, y), x != yというような正の値の組があり、f(x) = y or f(f(f(x))) = yとなる。問題は、この対応をどうやってつけるか、というところにあるはずだ。
さて、ではこの関数を有限個の点以外では微分可能なようなそういう関数だと仮定しよう。すると、この関数ではどうやってもうまくいかない。なぜか。有限個の点の正の部分にある個数を偶数個とした場合、微分可能な領域は奇数個に分割される。すると、その奇数個の部分を二つずつ対応付けすることが非常に困難になる。
逆に奇数個だとすると、微分不可能点を二つずつに対応できないのだ。したがって、微分が不可能な点は無限個存在する必要がある。
ということから考えて、以下のような関数ならどうだろうか。

roundupを
roundup(x) - 1 < x <= roundup(x)     if x >= 0
roundup(x) <= x < roundup(x) + 1     if x < 0
となるような整数と定義する。すなわち、単純な絶対値の切り上げ関数。
f(0) = 0
f(x) = x + 1       if x > 0 & roundup(x) === 1 (mod 2)
f(x) = -(x - 1)    if x > 0 & roundup(x) === 0 (mod 2)
f(x) = x - 1       if x < 0 & roundup(x) === 1 (mod 2)
f(x) = -(x + 1)    if x < 0 & roundup(x) === 0 (mod 2)

これであれば、特に問題はなさそうだ。汚いけれど。