数学において、ミンコフスキー疑問符関数（）は、 によって定義された  と表される関数であり、さまざまな奇妙なフラクタル特性を持つ。この関数は、を有理数の二進展開に連分数展開する関係式を介して、二次無理数を単位区間内の有理数に写す。この関係式は1938年に(Arnaud Denjoy)によって与えられた。 また、(Stern–Brocot tree)に密接に関連する再帰的な定義でわかるように、この関数は有理数をに写す。

定義 
 が無理数の場合、 の連分数表現を  とすると、疑問符関数は次のように定義される。 

 

 が有理数の場合、 の連分数表現を  とすると、次のようになる。

直感的な説明 
上記の定義を直感的に理解するために、0で始まる無限ビット列を  内の実数と解釈する、2つの相異なる解釈方法を考える。 

まず明白な方法は、最初の0の後に2進小数点を置き、二進小数として読む方法である。たとえば、ビット列 001001001001001001001001... は、2進数 0.010010010010... すなわち  を表す。 

別の方法は、ビット列を連分数  とみなす方法である。ここで整数  は、ビット列を連長圧縮したときの連続回数である。この場合、先ほどと同じビット列 001001001001001001001001...は  に対応する。もしビット列で同じビットが無限に続いて終わる場合、それを無視して連分数表現を終了する。この操作の妥当性は以下の恒等式に基づく。 

 .

 に対する疑問符関数は、カントール関数が三進法表現を二進法表現に写すのと同様に、先程のビット列の2つ目の解釈方法を同じ列の1つ目の解釈方法に写すものと理解できる。先程のビット列を例に挙げると、以下の等式が成り立つ。

有理数引数に対する再帰的定義 
単位区間内の有理数の場合、関数を再帰的に定義することもできる。  と  が  を満たす（ファレイ数列の隣接する項である）既約分数である場合、次のようになる。 

 

初期条件を次のように与えると 

 

ファレイ数列を F2、F3と順に求めることで、任意の有理数  に対して  を計算することが可能になる。 

 と  が同じ連分数をそれぞれ n - 1 段、n 段で打ち切ったものとすると、行列 

 

の行列式は ±1 となる。このような行列は、2 × 2 行列で行列式が ±1 となる群  の元である。 この群は、モジュラー群に関係する。

アルゴリズム 
この再帰的な定義は、次のC言語関数が示すように、任意の実数に対して任意の精度で関数値を計算するアルゴリズムに適している。 このアルゴリズムは、入力  を探してを下降する途中で、 の二進展開の項を合計していく。 ループ不変量 が満たされる限り、分数  を約分する必要はない。 別の不変量は  である。このプログラムのforループは、 whileループのように扱われており、最初の3行の条件付きbreak構文が終了条件となる。 ループ内で不変条件に影響を与えるのは最後の2行のみであり、最初の3行がループから抜け出すことなく正常に実行されている限り、両方の不変条件が真であると示すことができる。ループ内部の第三の不変量（浮動小数点精度）は  であるが、どの条件もテストされる前に、ループの初めに  が半分にされるため、結果的にループの終了時でしか  は担保されない。 
プログラムのには、ループの反復ごとに合計 q + s が少なくとも1ずつ増加し、この合計がC言語のプリミティブ型 long で表現するには大きすぎる場合にループが終了することに注意すれば十分である。 ただし実際には、 y + d == y の条件付き break があるため、短時間でループが終了する。 /* Minkowski's question-mark function */
double minkowski(double x) {
  long p = x;
  if ((double)p > x) --p; /* p=floor(x) */
  long q = 1, r = p + 1, s = 1, m, n;
  double d = 1, y = p;
  if (x < (double)p || (p < 0) ^ (r <= 0))
    return x; /* out of range ?(x) =~ x */
  for (;;) { /* invariants: q * r - p * s == 1 && (double)p / q <= x && x < (double)r / s */
    d /= 2;
    if (y + d == y)
      break; /* reached max possible precision */
    m = p + r;
    if ((m < 0) ^ (p < 0))
      break; /* sum overflowed */
    n = q + s;
    if (n < 0)
      break; /* sum overflowed */

    if (x < (double)m / n) {
      r = m;
      s = n;
    } else {
      y += d;
      p = m;
      q = n;
    }
  }
  return y + d; /* final round-off */
}

自己相似性 
疑問符関数は明らかに視覚的に自己相似である。 自己相似のモノイドは、単位正方形に作用する2つの演算子  と  によって生成され、次のように定義される。 

 

視覚的には、  は単位正方形を左下4分の1に縮小し、  は中心を通る点反射を実行する。 

 のグラフ上の点は単位区間内の  に対して座標  を持つ。 はすべての  で以下の等式を満たすため、そのような点は  と  によってグラフ上の別の点に変換される。 

 

これら2つの演算子は繰り返し結合され、モノイドを形成する。 モノイドの一般的な要素は正の整数  に対して 

 

となる。このような各要素によって、疑問符関数の自己相似性が記述される。 このモノイドはモノイドとも呼ばれ、すべての周期倍加フラクタル曲線は、周期倍加モノイドによって記述される自己対称性を持つ（疑問符関数は(de Rham curve)の特殊なケースであり、ド・ラーム曲線はこのような自己相似曲線のカテゴリーである）。 モノイドの要素は、と連分数  を同一視することによって有理数と対応づけられる 。  

 
 

はいずれも整数係数の線形分数変換であるため、モノイドはモジュラー群 の部分集合と見なすことができる。

の特徴 

疑問符関数は狭義単調増加な連続関数であるが、絶対連続ではない。有理数における微分係数はゼロである。積分されたときに疑問符関数を生成する測度には、いくつかの構成法が存在する。そのような構成の1つは、実数直線上のフェリー数の密度を測定することによって得られます。 疑問符測度は、とも呼ばれるものに対する典型的な例である。 
疑問符関数は有理数をに写す。二進分数とは、上で述べた再帰的定義から帰納的に証明されるように、 その二進表現が終了するものを意味する。このほか、を非二進有理数に写す。また、疑問符関数は奇関数であり、関数方程式  を満たすことから、  は、周期 1 の奇周期関数である。  が無理数である場合、  は次数が2より大きい代数的数か、超越数である。 

疑問符関数は 0, , 1、そして少なくとももう2つの不動点を持ち、中点に対して対称である。不動点の一つはは約 0.42037 である。 

1943年、(Raphaël Salem)は疑問符関数のフーリエ・スティールチェス係数(Fourier–Stieltjes coefficients)が無限大でゼロになるかという問題を提起した。つまり、 

 

となるかどうか、ということである。この問題はの結果の特別なケースとして、ジョーダン(Jordan)とザールステン(Sahlsten)によって肯定的に解決された。 
ミンコフスキー疑問符関数のグラフは、と呼ばれるフラクタル曲線の特殊なケースである。

コンウェイの箱関数 
 関数は可逆であり、逆関数も多くの数学者の研究対象となった。特にコンウェイは逆関数を独立して発見し、 を  の周りに箱を描く   という記法で表現した。箱関数は、 の二進数表現のエンコーディングのように計算することができる。ここで  は床関数である。二進法表現では小数点の右側に、0 が  個、1 が  個、0 が  個というように続くが、 とすると、 

 
である。ここで、右辺は連分数である。

関連項目

脚注

歴史的参考文献

参考文献 

 .
 .
 .
 .
 .

外部リンク 

 An extensive bibliography list
 
 Simple IEEE 754 implementation in C++

ヘルマン・ミンコフスキー
連続写像
特殊関数
数学のエポニム
数学に関する記事