Steinerの公式

Jakob Steiner による シュタイナーの公式(Steiner formula) と呼ばれる、現代の凸幾何学でも基本定理のひとつ。
「Quermass(クヴェアマース)」はドイツ語で「横断的な測度(寸法)」といった意味です。 この $W_i$ は、実は「$K$$i$ 次元的な平面で切ったり投影したりしたときの平均的な大きさ」(積分幾何学的な平均値)として解釈できるため、この名前がついているらしい。$V$を$\mathbb{R}^n$における普通 $n$次元体積として書くことにすると、

\[
V(K + \alpha B) = \sum_{i=0}^n \binom{n}{i} W_i(K) \alpha^i
\]

このシュタイナーの公式において、$\binom{n}{i}$ という二項係数がつくのも、混合体積の多重線形性($n$ 個の引数のうち、どこに $B$ を入れるかの組み合わせ を表す。

\[
W_i(K):=V(\underbrace{K,\dots,K}_{n-i},\underbrace{B(1),\dots,B(1)}_{i})
\] は 第$i$クヴェアマース積分(quermassintegral)と呼ばれる。

これの確率場(ガウス測度)バージョンがA Gaussian kinematic formula と呼ばれている:
Jonathan E. Taylor. “A Gaussian kinematic formula.” The Annals of Probability, 34(1) 122-158 January 2006. https://doi.org/10.1214/009117905000000594
日本語文献: 数理科学2020年九月号 確率場の幾何
ちなみに、宇宙マイクロ波背景(CMB)の宇宙の温度のゆらぎを観測する時のガウス性を検定するのに使っているらしい
WMAPデータのミンコフスキー汎関数解析から探る宇宙初期ゆらぎの非 ガウス性への制限

滑らかなガウス確率場 $(f \colon M\to\mathbb{R}^k)$($M$ は $n$ 次元の滑らかな多様体)を考え、レベル集合や超レベル集合

\[
A_u=\{x\in M:\ f(x)\in D_u\}
\]

(例:(k=1) なら ($D_u=[u,\infty)$)のLipschitz–Killing 曲率(= 固有体積)を見ることになる。(この下の説明は$k=1$での話。)

レベル集合 (A_u={f\ge u}) の期待オイラー標数は

\[
\mathbb{E}[\chi(A_u)]=\sum_{j=0}^{n}\mathcal{L}^j(M),\rho^{n-j}(u)
\]

となります。

ここで (\rho_m(u)) はエルミート多項式と( 標準正規分布の密度関数 ($\varphi(u)$) ) を使って

\[\rho_m(u)=(2\pi)^{-(m+1)/2} H_{m-1}(u)e^{-u^2/2} \quad (m\ge1)
\]

\[
\rho_0(u)=1-\Phi(u)
\] ($(\Phi)$:標準正規分布関数)という形になります。

さて、話を戻すと、

混合体積 (V(\cdot)) を使って

* (K) を (n-i) 回

* 単位球 (B(1)) を (i) 回

入れたものが$W_i(K)$である.

凸体 ($K \subset \mathbb{R}^n$) と単位球 (B) に対し、

\[
K + \alpha B
\]

(= 距離 (\alpha) だけ外側へ膨らませた集合)の体積は

\[
V(K+\alpha B)
\]

(\alpha) の次数 (n) の多項式になります。

これはミンコフスキー加法と体積の性質から導かれる事実で、
係数が クヴェアマース積分(Quermassintegrals) になる。

\[
V(K + \alpha B) =\sum_{j=0}^{n} \kappa_{n-j} V_j(K) \alpha^{n-j}
\]

ここで$V_j(K)$は固有体積と呼ばれる
\[
V_j(K)=\frac{\binom{n}{j}}{\kappa_{n-j}}W_{n-j}(K)
\] のことである。また、各$m$に対して$\kappa_m $は
\[
\kappa_m = W_j(B)
\frac{\pi^{m/2}}{\Gamma!\left(\frac{m}{2}+1\right)}
\] のことである。特に係数比較をすることで、
\[
V_j(B) = \frac{\binom{n}{j} \kappa_n}{\kappa_{n-j}}
\] がわかる。

 

  • $j=3$ (体積):

    $$V_3(B) = \frac{\binom{3}{3}\kappa_3}{\kappa_0} = \frac{1 \cdot \frac{4}{3}\pi}{1} = \frac{4}{3}\pi$$

    → 単位球の体積

  • $j=2$ (表面積の半分):

    $$V_2(B) = \frac{\binom{3}{2}\kappa_3}{\kappa_1} = \frac{3 \cdot \frac{4}{3}\pi}{2} = 2\pi$$

    → (半径$1$の)球の表面積は $4\pi$ なので、その半分になっている。

  • $j=0$ (オイラー標数):

    $$V_0(B) = \frac{\binom{3}{0}\kappa_3}{\kappa_3} = \frac{1 \cdot \kappa_3}{\kappa_3} = 1$$

    → 凸集合なので 1。

    固有体積 幾何学的意味
    (V_3(K)) 体積
    (V_2(K)) 表面積の 1/2
    (V_1(K)) 平均幅に比例
    (V_0(K)) オイラー標数(凸体なら1)

     

    \[
    F(K) =\left.\frac{d}{d\alpha}V(K+\alpha B)\right|_{\alpha=0}
    \]

    これは直感的にも:
    「薄い厚み (\alpha) だけ外側に皮をつけると
    体積は 表面積 × (\alpha) だけ増える」

    という意味になります。

    実際に多項式を微分すると、

    \[
    V(K+\alpha B) =V(K) + F(K)\alpha + \cdots
    \]

    となり、

    \[
    F(K)=\kappa_1 V_{n-1}(K).
    \] 一次係数が表面積に一致します。
    実際、

    $n=3$ のとき

    \[
    F(K)=\kappa_1 V_2(K).
    \]

    \[
    \kappa_1=2
    \] なので
    \[
    V_2(K)=\frac{1}{2}F(K).
    \] である。

    具体的には次のような
    偏極化公式(polarization identity)を使って示す:

    多面体 $(P_1,\dots,P_n\in \mathcal P^n) $に対して

    \[
    V(P_1,\dots,P_n)= \frac{1}{n!}\sum_{k=1}^{n}(-1)^{,n-k} \sum_{1\leq r_1<\cdots<r_k\leq n}V(P_{r_1}+\cdots+P_{r_k})
    \]

    これを用いる。

    \[
    V(\alpha_1P_1+\dots+\alpha_mP_m)= \sum_{1\leq i_1,\dots,i_n \leq n} \alpha_{i_1}\dots\alpha_{i_n} V^{(n)}(P_{i_1},\dots,P_{i_n})
    \]

    混合体積$V(P_1,\ldots,P_n)$は、

    * ($n=1$) では区間の長さ

    * ($n\ge 2$) では

    「法線方向ごとに、低次元の混合体積を足し合わせる」
    n 次元の体積を 境界面(法線方向)に分解して $(n−1)$ 次元の混合体積に落として定義されている。

    平行移動不変 : 各 (P_i) を別々に平行移動しても値は変わらない

    対称性:
    \[
    V^{(n)}(P_1,\dots,P_n)
    \] は引数を入れ替えても同じ
    (これと一緒に
    \[
    \dim(P_1+\dots+P_n) \le n-1
    \] なら混合体積は $0$が導かれる。)

    この図は、2つの長方形 $K$ (水色) と $L$ (黄緑) を足し合わせたとき(ミンコフスキー和 $K+L$)、全体の面積 $(a+c)(b+d)$ がどのように分解されるかを示しています。

    • 青色の部分 ($ab$): $K$ 本来の体積 $V(K)$ です。

    • 緑色の部分 ($cd$): $L$ 本来の体積 $V(L)$ です。

    • オレンジ色と紫色の部分 ($ad$$bc$): これらが、公式 $V(K+L) = V(K) + 2V(K, L) + V(L)$ における $2V(K, L)$ の正体です。

    つまり、\[
    2V(K, L) = ad + bc
    \] になっている。これは上の公式からも導けて、上の公式は$n=2$の場合、
    凸体を2つ:
    \[
    P_1=K,\quad P_2=L
    \]

    一般公式は

    \[
    V(\alpha_1P_1+\alpha_2P_2)=\sum_{1\le i_1,i_2\le 2} \alpha_{i_1}\alpha_{i_2} V^{(2)}(P_{i_1},P_{i_2})
    \] 添字の組は:

    \[
    (1,1),(1,2),(2,1), (2,2)
    \]

    したがって

    \[
    V(\alpha_1K+\alpha_2L) = \alpha_1^2V(K,K) + \alpha_1\alpha_2V(K,L) + \alpha_2\alpha_1V(L,K) + \alpha_2^2V(L,L)
    \]

    混合体積は対称なので
    \[
    V(K,L)=V(L,K)
    \]

    よって
    \[
    V(\alpha_1K+\alpha_2L)= \alpha_1^2V(K) + 2\alpha_1\alpha_2V(K,L) + \alpha_2^2V(L)
    \] ここで
    \[
    V(K,K)=V(K),\quad V(L,L)=V(L)
    \] に注意する。現在の例は、$\alpha_1,\alpha_2 $ともに$1$なので
    \[
    V(K+L)= V(K) + 2V(K,L) + V(L)
    \]

     

    なぜ、$V_0$ を「オイラー標数」と呼ぶのかというと、単一の凸体だけではなく、それらを組み合わせた凸集合の有限和集合を考えるときに、この定義がトポロジー的なオイラー標数と完全に一致するからです。

    オイラー標数には、以下の加法性(包含排除の原理)を満たす。

    $$\chi(A \cup B) = \chi(A) + \chi(B) – \chi(A \cap B)$$
    • $A$$B$ も凸なら、それぞれのオイラー標数は $1$ です。

    • もし $A \cap B$ も凸(または空ではない)なら、そのオイラー標数も $1$ です。

    • すると、$\chi(A \cup B) = 1 + 1 – 1 = 1$ となり、つながった1つの塊として正しくカウントされます。

    • もし $A$$B$ が離れていれば、$A \cap B = \emptyset$(オイラー標数 0)なので、$\chi(A \cup B) = 1 + 1 – 0 = 2$ となり、「塊が2つある」ことを正しく示します。

    参考:
    A Course

    on

    Convex Geometry

    Daniel Hug, Wolfgang Weil

    University of Karlsruhe

    revised version 2009/2010

    January 24, 2011

    Sierpinski Carpetの自己相似構造

    $C$に関しては,

    \[
    C= \sigma_1(\{3,4,5\}^\mathbb{N} \cup \{5,6,7\}^\mathbb{N}) \cup \sigma_2(\{3,4,5\}^\mathbb{N} \cup \{5,6,7\}^\mathbb{N}) \cup \sigma_3(\{7,8,1\}^\mathbb{N} \cup \{5,6,7\}^\mathbb{N}) \cup \sigma_4(\{1,2,3\}^\mathbb{N} \cup \{5,6,7\}^\mathbb{N}) \cup \sigma_5(\{7,8,1\}^\mathbb{N} \cup \{1,2,3\}^\mathbb{N}) \cup \sigma_6(\{3,4,5\}^\mathbb{N} \cup \{7,8,1\}^\mathbb{N}) \cup \sigma_7(\{3,4,5\}^\mathbb{N} \cup \{1,2,3\}^\mathbb{N}) \cup \sigma_8(\{1,2,3\}^\mathbb{N} \cup \{5,6,7\}^\mathbb{N})
    \]

    \[
    \mathcal{P} = \bigcup_{n=1}^{infty} \sigma^n(C_L)  =\{3,4,5\}^\mathbb{N} \cup \{5,6,7\}^\mathbb{N} \cup \{7,8,1\}^\mathbb{N} \cup \{1,2,3\}^\mathbb{N}
    \] の各項に対応して眺めると
    \[
    V_0 = (\{1\} \times [0,1] ) \cup ([0,1] \times \{1\} )\cup ([0,1] \times \{0\} ) \cup  (\{1\} \times [0,1] )
    \] がわかる。

    $\forall x\in C_K$, $S=\{1,2,\ldots,8\}$に対して
    ある$\{i,j\}\in \{ \{1,2\},\{2,3\},\{3,4\},\{4,5\},\{5,6\},\{6,7\},\{7,8\} ,\{8,1\} \}$
    により
    \[
    \{x\in S \mid x \in K_k\}=\{i,j\}
    \] これを利用すると,
    結果として
    \[\pi^{-1}(x) \subset (\sigma_i (\pi^{-1} (F_i^{-1}(x)) )) \cup (\sigma_j (\pi^{-1} (F_j^{-1}(x)) ))  \] がわかって, $y= (F_i^{-1}(x))$とおいて$\pi^{-1}(x)$を計算すると, $\# \pi^{-1}(x) =\# \pi^{-1}(F_i^{-1}(x)) \leq 2$. 同様に$\# \pi^{-1}(F_j^{-1}(x)) \leq 2$.

    このことから結局
    \[
    \# \pi^{-1}(x) \leq 4
    \]

    • 参考:
      講義ノートpdfファイル (2.4MB)(2014年2月23日更新:2.3節の内容を一部修正)
      応用解析学特論I(京都大学大学院情報学研究科 2013年度集中講義)フラクタル上の解析学入門

     

    ハルトークス(Hartogs)の定理1.

    Definition.
    [調和関数] $u : \Omega \to \mathbb{R}$ が\textbf{調和関数}であるとは,
    \[
    \Delta u = \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0
    \] が成り立つことをいう.
    Lemma.
    $f(z) = u(x,y) + iv(x,y)$ が正則ならば,$u$ および $v$ はともに調和関数である.
    [proof] $f$ が正則であることから,Cauchy–Riemann 方程式が成立する:
    \[
    \frac{\partial u}{\partial x} = \frac{\partial v}{\partial y}, \qquad
    \frac{\partial u}{\partial y} = -\frac{\partial v}{\partial x}.
    \] 1本目を $x$ で,2本目を $y$ で微分すると,
    \[
    \frac{\partial^2 u}{\partial x^2} = \frac{\partial^2 v}{\partial x \partial y}, \qquad
    \frac{\partial^2 u}{\partial y^2} = -\frac{\partial^2 v}{\partial y \partial x}.
    \] 正則関数は $C^\infty$ 級であるから混合偏微分の順序が交換可能,すなわち
    \[
    \frac{\partial^2 v}{\partial x \partial y} = \frac{\partial^2 v}{\partial y \partial x}.
    \] したがって,
    \[
    \Delta u
    = \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2}
    = \frac{\partial^2 v}{\partial x \partial y} – \frac{\partial^2 v}{\partial y \partial x}
    = 0.
    \] 全く同様の議論により $\Delta v = 0$ も従う.\qedhere
    [/proof]
    Lemma.
    $f(z_0) \neq 0$ の近傍では $\log f$ が正則に定義でき,
    \[
    \log|f| = \operatorname{Re}(\log f)
    \] は調和関数となる($f$ が正則で $f \not\equiv 0$ ならば,$f$ の零点は孤立していることに注意しておく. これは冪級数展開したらわかる.).調和関数は劣調和(平均値の等式が成立)であるから,
    $\log|f|$ は劣調和関数である(f(z_0=0$の場合は、それはそれで劣調和の条件を満たす。)).
    [proof] $f(z) = |f(z)|e^{i\arg f(z)}$だから
     
    \[ \log f(z) = \log|f(z)| + i\arg f(z), \]
    [/proof]

     

    [definiton] $\Omega \subset \mathbb{C}^2$とし, $\{v_k(z)\}$を$\Omega$で定義された関数列とする. このとき, $\{v_k(z)\}$が$K \subset \Omega$上で、上に一様有界であるとは、
    ある$M>0$が存在して, 任意の$k\in \mathbb{Z}_{+}$, $z\in K$に対して$v_k(z)< M$ で或ることを言う.
    [/definition]
    Lemma.
    $\Omega \subset \mathbb{C}^2$とし, $\{v_k(z)\}$を$\Omega$で定義された劣調和関数列とする. $\{v_k(z)\}$が、任意のコンパクト集合$K$上で、上に一様有界で, 定数$C>0$が存在して, $\limsup_{k \to \infty} v_k(z) \leq C$ $(z\in \Omega)$が成り立つと仮定する. すると, 任意の$\varepsilon >0$と任意のコンパクト集合$K$に対して, 正整数$N$が存在して, $\forall k > N$ならば, $v_k(z)\leq C + \varepsilon $ $(z\in K)$が成り立つ.
    [proof] $K \subset \Omega$をコンパクト集合とする.  コンパクト集合$K_1$を、$K \subset K_1^o \subset K_1 \subset \Omega$を満たすようにできる.  この時, $K_1^o $を$\Omega$とみなすことで, $\{v_k(z)\}$が、$\Omega$上で、上に一様有界として良い. すると, $M >0$が存在して, $v_k(z)\leq M$ $(z\in \Omega, k=1,2,\ldots)$. さらに, 表記を簡単にするために一般性を失わずに, $v_k(z)$のかわりに, $v_k(z)-M$を考えることで, $v_k(z)\leq 0$ $(z\in \Omega, k=1,2,\ldots)$として良い. $r>0$を$K\subset \{z\in \Omega \mid d(z,\partial \Omega) >3r\}$となるように十分小さくとる($K\ni z \mapsto d(z, \partial \Omega)$は連続関数で、最小値が$0$の場合は$z \in \partial \Omega$になるからそうはならない. ). そこで,  平均値の定理の(劣調和関数の)不等式ver.から
    $z\in K$, $0< \rho \leq r$に対して
    \[
    2\pi v_k(z) \leq \int_{0}^{2\pi} v_k(z + \rho e^{i \theta}) d\theta
    \] が成り立つ. 上式に$\rho$をかけて$\rho$について$0$から$r$まで積分すると,
    \[
    \pi r^2 v_k(z) \leq \int \int_{\abs{z-z’}<r} v_k(z’) dx’ dy’ \quad (z’ = x’ + i y’)
    \] が成り立ち, Fatouの補題と補題の仮定を使うと、
    \[
    \limsup_{k\to \infty}\int \int_{\abs{z-z’}<r} v_k(z’) dx’ dy’ \leq \int \int_{\abs{z-z’}<r} \limsup_{k\to \infty} v_k(z’) dx’ dy’ \leq \pi C r^2
    \] ここで, $\limsup_{k\to \infty}$の性質に立ち返ると,
    $z \in K$に対して, $k_0(z) \in \mathbb{Z}_+$が存在して, $\forall k \geq k_0(z)$に対して
    \[
    \int \int_{\abs{z-z’}<r} v_k(z’) dx’ dy’ \leq \pi (C + \frac{\varepsilon}{2}) r^2
    \]

    ところで, $0 < \delta < r$とすると, $\abs{z-w}<\delta$を満たす任意の$w$に対して
    \[
    \{z’ \mid \abs{z’-z}<r\} \subset \{z’ \mid \abs{z’-w}<r + \delta\}
    \] $v_k \leq 0$と劣調和による不等式を使うと, $k \geq k_0(z)$ならば
    \begin{align}
    \pi (r + \delta)^2 v_k(w) & \leq \int \int_{\abs{z-z’}<r + \delta} v_k(z’) dx’ dy’ \\
    & \leq \int \int_{\abs{z-z’}<r} v_k(z’) dx’ dy’ \leq  \pi (C + \frac{\varepsilon}{2}) r^2
    \end{align}

    よって, $k \geq k_0(z)$ならば
    \[
    v_k(w) \leq (r/(r+\delta))^2 (C+\frac{\varepsilon}{2})
    \] $r$も$\delta$も, $z$や$k$に依存していないことに注意.

    $\delta$を十分小さくとると,
    $k \geq k_0(z)$ならば, $\abs{z-w}<\delta$の時に$v_k(w)  < C + \varepsilon$
    が成り立つ.
    ここで, $K$はコンパクト集合だから, $z^1,\ldots, z^m \in K$が存在して, $K \subset \bigcup_{i=1}^m B(z^i,\delta)$とできる. そこで, $N= \max_{1\leq i\leq m} k_0(z^i)$とする. そうすると, 任意の$w\in K$に対して, $i \in \{1\leq i\leq m\}$ が存在して, $w\in B(z^i,\delta)$を満たし, 言い換えれば$\abs{w-z^i}<\delta$だから, 任意の$k > N$で$v_k(w) < C + \varepsilon$を満たす.
    [/proof]

    Schwartzの補題

    Lemma.
    $f(z)$は単位円板$B(0,1)\subset \mathbb{C}$において正則で, $f(0)=0$且つ$\abs{f(z)}\leq 1 \quad (\abs{z}<1)$を満たすとする. この時,
    \[
    \abs{f(z)}\leq \abs{z} (\abs{z}<1) \quad \abs{f'(0)} \leq 1
    \] が成り立つ. さらに, 或る$z\neq 0$に対して, $\abs{f(z)} = \abs{z}$となるか, または $\abs{f'(0)} =1$ならば$f(z)=\alpha z$と表すことができる。 ここで, $\abs{\alpha}=1$で或る.
    Lemma.
    関数$f(z)$は$B(0,r)\subset \mathbb{C}$で正則で、 定数$M>0$が存在して,
    $\abs{f(z)}\leq M$を満たするとする. この時、 次が成立する:
    \[
    \abs{f(z_1)-f(z_2)} \leq 2M \frac{r_j \abs{z_2 – z_1}}{\abs{r_j^2-\overline{z_1}z_2}} \quad z_1, z_2 \in B(0,r)
    \]
    [proof] $w_1 = f(z_1)$, $w_2 = f(z_2)$とおく. 一次分数変換$\Phi\colon B(0,r) \to B(0,1)$と$\Psi\colon B(0,M) \to B(0,1)$を
    \[
    \Phi(z)
    = \frac{ r (z – z_1) }{ r^2 – \overline{z_1} z }, \quad \Psi(w)=
    \frac{ M (w – w_1) }{ M^2 – \overline{w_1} w }
    \]

    によって定義する. $\Psi\circ f \circ \Phi^{-1}:B(0,1) \to B(0,1)$
    は$0$を$0$に写す正則関数であるから, Schwartzの補題から,
    $\abs{\Psi\circ f \circ \Phi^{-1}(z)}\leq \abs{z} $が成り立つ. $z=\Phi(z_2)$と置くと, $\abs{\Psi(w_2)}\leq \abs{\Phi(z_2)} $
    [/proof]

    有界な場合のHartogsの定理(これを2. で使う.)

    Lemma.
    $\Omega \subset \mathbb{C}^n$は開集合で、 $f(z)$は$\Omega$上で定義された有界関数とする. $f(z)$は各変数$z_j$ $1\leq j \leq n$に関して正則である.
    このとき, $f(z)$は$\Omega$で連続である(つまり, $f(z)$は正則である.).
    [proof] $f(z)$は有界であるから, 或る$M>0$が存在して, $\abs{f(z)}\leq M$が成り立つ.
    連続性は局所的な問題なので, $\Omega= P(0,r),\quad r=(r_1,\ldots,r_n)$としても問題ない.
    ここで直前の補題を用いると,
    \begin{align}
    &\abs{f(z) – f(\xi)} = \abs{f(z_1,\ldots, z_n) – f(\xi_1,\ldots, \xi_n)} \\
    &\leq \sum_{j=1}^n \abs{f(z_1,\ldots,\xi_{j-1},z_j,\ldots, z_n) – f(\xi_1,\ldots,\xi_j,z_{j+1} \ldots,\xi_n)} \\
    &\leq \sum_{j=1}^n 2M \frac{r_j \abs{z_j – \xi_j}}{\abs{r_j^2-\overline{\xi_j}z_j}}
    \end{align}
    となるから、 $z\to \xi$で$f(z)\to f(\xi)$が成り立つ. よって ,$f(z)$は$\Omega$で連続である. 従って, $f(z)$は$\Omega$上で正則でもある.
    [/proof]

    ハルトークスの定理2

    ハルトークスの定理

    というのがある。これは、多変数複素解析の場合は、各変数($z, w \mathbb{C}$)で偏微分可能ならば、多変数(複素)関数としての連続性もついてくるという主張である。
    (多変数複素解析学入門: ヘルマンダーか一松 信の複素解析の本に載ってたと思います。)

    Theorem.
    (Hartogsの定理)
    $\Omega \subset \mathbb{C}^n$が開集合で, $f(z)$が$\Omega$で定義された多変数複素関数とする. この時, $f(z)$が各変数$z_j\,(1\leq j \leq n)$に対して正則ならば, $f(z)$は$\Omega$上で正則である.
    変数の数$n$に関する帰納法で示す:
    $n=1$の時は明らかである.
    定理の$n-1$の場合が成り立つと仮定する. この仮定のもとで, 補題2つを示していく。

    最初の定理は, 正則性がほんの小さいところでしか保証されていなくてもCauchyの積分定理、$n$成分を固定して$f$を冪級数展開した時の係数の強い有界性から導かれる.

    Lemma.
    任意に$R>0$を考える. $f(z)$は多重円板$P(z^0, R)\subset \mathbb{C}^n$で定義された多変数複素関数で, 各変数$z_j (1\leq j \leq n)$に関して正則であるとする. この時$0< r(< R)$が存在して, $f(z)$は$Q = B(z_1,r)\times B(z_j,r)\times B(z_{n-1},r)\times B(z_n,R)$上で正則かつ有界であるとする. この時, $f(z)$は$P(z,R)$で正則になる.
    [proof] 一般性を失わずに$z^0 = (z_1^0,\ldots, z_n^0)=(0,\ldots,0)$と仮定して良い. そこで, $P=P(0,R)$と置くことにする. Hartogs定理の帰納法の仮定から, $f(z’,z_n)$は$z’$の関数として正則だから,
    \[
    f(z) = \sum_{\alpha_1, \ldots, \alpha_{n-1}=1}^{\infty} c_{\alpha}(z_n)(z’)^{\alpha}
    \] と表すことができる.
    (上式を偏微分するか, Cauchyの積分公式から冪級数展開するところに立ち返ればでてくることだが,) $c_{\alpha}(z_n)= D^{\alpha}f(0)/ \alpha !$である.
    $0<q<r$に対して, $Q=B(0,q)\subset \mathbb{C}$と置く.
    この時, Cauchyの積分公式から,
    \[
    c_{\alpha}(z_n) \alpha ! =D^{\alpha} f(0,z_n) = \frac{\alpha !}{(2\pi i)^{n-1}} \int_{\partial Q} \cdots \int_{\partial Q} \frac{f(\xi_1,\ldots, \xi_{n-1},z_n)}{\xi_1^{\alpha_1+1} \cdots \xi_{n-1}^{\alpha_{n-1}+1} } d\xi_1 \cdots d\xi_{n-1}
    \] と表される. 積分記号下で, ディーバー作用素
    \[
    \frac{\partial}{\partial \bar{z}}
    \frac{1}{2}
    \left(
    \frac{\partial}{\partial x}
    +
    i,\frac{\partial}{\partial y}
    \right)
    \] を作用させると, $\partial c_{\alpha} (z_n)/ \partial \overline{z_n} =0$となるから,
    $c_{\alpha}(z_n)$は$z_n$の関数として正則である(後に, この関数の絶対値に$\log$を合成したものが劣調和で或ることを使う.).

    さて, $R’, R_1, R_2$を$0<R_1<R_2<R'<R$を満たすようにとる.
    固定した$z_n$に対して$f(z’,z_n)$は$z’ $の関数として$P_{n-1}=B(0,R)\times \cdots \time B(0,R) $($n-1$回)で正則であるから, $B’=B(0,R’)\subset \mathbb{C}$とすると,
    \[
    D^{\alpha} f(0,z_n) = \frac{\alpha !}{(2\pi i)^{n-1}} \int_{\partial B’} \cdots \int_{\partial B’} \frac{f(\xi_1,\ldots, \xi_{n-1},z_n)}{\xi_1^{\alpha_1+1} \cdots \xi_{n-1}^{\alpha_{n-1}+1} } d\xi_1 \cdots d\xi_{n-1}
    \] が成り立つから, 絶対値を取って被積分関数をsupで抑えれば,
    \[
    \abs{D^{\alpha} f(0,z_n) } \leq alpha !(R’)^{-\abs{\alpha}}\sup_{z’ \in  P'(0,R’)}\abs{f(z’,z_n)}
    \] 但し, $P'(0,R’) = $B(0,R’)\times \cdots \time B(0,R’) $.
    固定した$z_n (\abs{z_n}<R)$に対して
    \[
    \abs{c_{\alpha}}R_2^{\abs{\alpha}} \leq  \abs{\frac{ R_2}{R’}}^{\abs{\alpha}}\sup_{z’ \in  P'(0,R’)}\abs{f(z’,z_n)}\to 0\quad(\abs{\alpha} \to \infty)
    \] が成り立つから,
    固定した$z_n (\abs{z_n}<R)$に対して$\abs{\alpha}$が十分大きいならば,
    \[
    \abs{c_{\alpha}}R_2^{\abs{\alpha}} <1
    \] が成り立つ.
    他方, 仮定から定数$M>0$が存在して, 任意の$z\in Q$に対して$\abs{f(z)}\leq M$が成立する. このことと$c_{\alpha}(z_n) $のCauchyの積分公式による表示から$\abs{c_{\alpha}(z_n)}\leq M/(q)^{\abs{\alpha}}$が成り立つ. $q \uparrow r$とすると,
    任意の$\abs{z_n}<R$
    \[
    \abs{c_{\alpha}(z_n)} r^{\abs{\alpha}} \leq M
    \] を得る.

    ここで, $\abs{c_\alpha(z_n)}$を評価していく.
    まず, 二つのmulti-index $\alpha=(\alpha_1,\ldots, \alpha_{n-1})$, $\beta=(\beta_1,\ldots,\beta_n)$に対して次のような順序(辞書式順序)を入れる:
    $\alpha < \beta$であるとは、ある$1\leq i \leq n-1$が存在して
    \[
    \alpha_1 = \beta_1,\ldots, \alpha_{i-1} = \beta_{i-1}, \alpha_i < \beta_i
    \] が成り立つこととする.

    $alpha=(\alpha_1,\ldots, \alpha_{n-1})$, $\abs{\alpha}\neq 0$に対して, $\varphi_{\alpha}(z_n)=(1/ \abs{\alpha})\log (\abs{c_{\alpha}(z_n)})$とする.
    すると、 ハルトークスの定理1で示したように$c_{\alpha}(z_n)$の正則性から, $\abs{z_n}<R$における劣調和関数である. また, $\{v_k(z_n)\}$を上の辞書式順序で$\{ \varphi_{\alpha}(z_n) \}$を並び替えたものとする. この時, $k\to \infty$の時, $\abs{\alpha}\to \infty$である.
    任意の$\abs{z_n}<R$
    \[
    \abs{c_{\alpha}(z_n)} r^{\abs{\alpha}} \leq M
    \] を使うと,
    $\abs{\alpha}\neq 0$, 任意の$\abs{z_n}<R$に対して,
    \[
    \varphi_{\alpha}(z_n)=\frac{1}{\abs{\alpha}} \log (\abs{c_{\alpha}(z_n)}) \leq -\log r + \frac{1}{\abs{\alpha}} \log M \leq -\log r + \log M
    \] が成り立つから, $\{v_k(z_n)\}$は$\abs{z_n}<R$において上に一様有界である.

    $\abs{\alpha}$を十分大きくとると,
    \[
    \abs{c_{\alpha}(z_n)}R_2^{\abs{\alpha}} <1
    \] から
    \[
    \log \frac{\abs{c_{\alpha}(z_n)}}{\abs{\alpha}} < -\log R_2
    \] が成り立つ. 言い換えると, $k$を十分大きくすると, $v_k(z_n)< – \log R_2$. つまり, $\limsup_{k\to \infty } v_k(z_n)\leq – \log R_2$がなりたつ.
    1. での 上への一様有界性の補題から、 $k$を十分大きくとると, $v_k(z_n)\leq – \log R_1$が一様に$\abs{z_n}<R_1$で成り立つ.
    言い換えれば、 $\abs{\alpha}$が十分大きければ,
    \[
    \abs{c_{\alpha}(z_n)}} R_1^{\abs{\alpha}} \leq 1 (\forall \abs{z_n}<R_1 )
    \] が成り立つ($\log \abs{c_{\alpha}(z_n)}} \leq \log R_1^{\abs{\alpha}} $から対数をtとれば良い).

    (一様収束性の証明ために)任意の$K\subset P(0,R)$をとる. ここで、 (必要があれば先ほどの$R_1$を縮めることで) $K \subset P(0,R’), R'<R_1$となるように$R’, R_1$を選ぶ.
    今, 直前で示した
    \[
    \abs{c_{\alpha}(z_n)}} R_1^{\abs{\alpha}} \leq 1 (\forall \abs{z_n}<R_1 )
    \] から
    $z\in K$上で, $\abs{c_{\alpha}(z_n)}z’} \leq \abs{R’/R_1}^{\abs{\alpha}}$となるから, $\sum_{\alpha_1,\ldots,\alpha_{n-1}}c_{\alpha}(z_n) (z’)^{\alpha}$は$K$上で一様収束する. だから, $f(z)$は$K$上で連続である. $K$は任意であったから, $f(z)$は$P(0,R)$上で連続である. 従って, $f(z)$は$P(0,R)$で正則である.
    [\proof]

     

    下の証明の最後の最後までは, Cauchyの積分定理を使っていない. ここで言っているのは、あくまで、 $P$の(気持ちはすごく小さい或る特定の)部分集合$Q$では正則だと言っているだけ。 こういうすごく小さくてもいいから、条件を満たす集合を見つけたいときに時折Baireのカテゴリー定理がでてくる。

    Lemma.
    関数$f(z)$は開集合$\Omega \subset \mathbb{C}^n$において, 各変数$z_j\,(1\leq j\leq n)$に関して, $1$変数複素関数として正則であると仮定する. 更に, 多重円盤$P=P_1 \times \dots \times P_n$は$\overline{P} \subset \Omega$を満たすと仮定する. この時, 各$(1\leq j \leq n)$に対して, 開円板$Q_j \subset P_j $が存在して, $Q_n = P_n$かつ $f(z)$は$Q= Q_1 \times \dots \times Q_n$において有界となる. 従って, 前の補題から$f(z)$は$Q$で正則となる。
    [proof] $E_M(z_n)=\{z’ \in  \overline{P_1} \times \overline{P_2} \times \dots \times \overline{P_{n-1}} \mid \abs{f(z’,z_n)} < M\}$とし, $E_M = \bigcap_{z_n \in \overline{P_n}}E_M(z_n)$とする. 今, 帰納法の仮定から, Hartogsの定理は$n-1$では使えるから, $f(z’,z_n)$は$z’ \in \overline{P_1} \times \overline{P_2} \times \dots \times \overline{P_{n-1}} $の連続関数である. 従って, 逆像を考えれば, 各$z_n \in \overline{P_n}$に対して $E_M(z_n)$は閉集合である. 言い換えれば, $\overline{P_1} \times \overline{P_2} \times \dots \times \overline{P_{n-1}} \setminus E_M(z_n)$は開集合である.
    ところで, $w’ \in \overline{P_1} \times \overline{P_2} \times \dots \times \overline{P_{n-1}}$を任意にとると, $f(z’,z_n)$は$n$番目の変数$z_n$について正則, 連続だから, 或る$M \in \mathbb{Z}_{+}$が存在して, $\forall z_n \in \in \overline{P_n}$, $\abs{f(z’,z_n)} < M$である. つまり, $z’ \in E_M \subset \bigcup_{M\geq 1} E_M$である.
    \[
    \bigcup_{M\geq 1} E_M = \overline{P_1} \times \overline{P_2} \times \dots \times \overline{P_{n-1}}
    \] である.
    直近二つのこととBaireのカテゴリー定理を用いる:
    今, $E_M\, (M=1,2,\ldots, \ldots)$が全て内点を持たないと仮定する.  この時, 各$M \in \mathbb{Z}_{+}$に対して, $F_M = ( \overline{P_1} \times \overline{P_2} \times \dots \times \overline{P_{n-1}}) \setminus E_M$は稠密な開集合である(位相空間$\overline{P_1} \times \overline{P_2} \times \dots \times \overline{P_{n-1}}$にとって). 従って, Baireのカテゴリ定理から, $\bigcap_{M\geq 1} F_n$は稠密な集合になる. ところで, $\bigcap_{M\geq 1} F_n = ( \overline{P_1} \times \overline{P_2} \times \dots \times \overline{P_{n-1}}) \setminus (\bigcup_{M\geq 1} E_M ) = \emptyset$だから, この両者の事柄は矛盾する.
    よって, ある$M \in \mathbb{Z}_{+}$が存在して, $E_M$は内点をもつ. 多重円板$Q= Q_1 \times \dots \times Q_n$を$Q\subset E_M \times P_n$, $Q_n = P_n$となるように選ぶことができる($\overline{P_1} \times \overline{P_2} \times \dots \times \overline{P_{n-1}}) $に直積位相が入っていると思ってよく, $E_M$の内部は各座標による十分小さな開円盤$Q_1 \times \dots \times Q_{n-1}$に含まれることからわかる.).
    結果として, 任意の$z\in Q$に対して, $\abs{f(z)}\leq M$が成り立つ.
    そして, 二つ前の補題から, $f(z)$は$Q$で正則であることがわかる.
    [/proof]

    $\xi =(\xi_1, \ldots, \xi_n ) \in \Omega$を任意にとる. $R>0$を$P(0,R)\subset \Omega$を満たすようにとる. 直前の補題(を$P=P(\xi,R)$で使う)から, $r>0$, $z^0=(z_1^0,\ldots,z_n^0)\in P(\xi,R)$が存在して, $Q_j = B(z^0_j,r) (1\leq j \leq n-1)$と置くと,  $Q_j \subset R_j $ (1\leq j \leq n-1)$且つ $z_n^0 = \xi_n$が成り立ち, $f(z)$は$Q_1\times Q_{n-1}\times P_n (\subset P(\xi, R))$上で正則且つ有界である.  これと, Hartogsの定理の仮定である”$f(z)$は$P(z^0,R)$は各変数$z_j\, (1\leq j \leq n)$に関して正則である”ことからを合わせると二つ前の補題から,
    $f(z)$は$P(z^0,R)$で正則になる. $\xi \in P(z^0,R)$だから, $f(z)$は任意の$\xi$で正則である.

    局所中心極限定理

     

    \[
    \varphi(\theta)
    := \frac{1}{d}\sum_{k=1}^d \cos \theta_k,
    \qquad \theta = (\theta_1,\dots,\theta_d)\in \mathbb{R}^d.
    \]

    一次微分(勾配)
    各成分について
    \[
    \partial_{\theta_j}\varphi(\theta)
    = \partial_{\theta_j}\left(\frac{1}{d}\sum_{k=1}^d \cos\theta_k\right)
    = -\frac{1}{d}\sin\theta_j.
    \]

    したがって勾配の二乗ノルムは
    \[
    |\nabla \varphi(\theta)|^2
    = \sum_{j=1}^d \left(-\frac{1}{d}\sin\theta_j\right)^2
    = \frac{1}{d^2}\sum_{j=1}^d \sin^2\theta_j.
    \]

    二次微分とラプラシアン
    \[
    \partial_{\theta_j}^2 \varphi(\theta)
    = \partial_{\theta_j}\left(-\frac{1}{d}\sin\theta_j\right)
    = -\frac{1}{d}\cos\theta_j.
    \]

    よってラプラシアンは
    \[
    \Delta \varphi(\theta)
    = \sum_{j=1}^d \partial_{\theta_j}^2 \varphi(\theta)
    = -\frac{1}{d}\sum_{j=1}^d \cos\theta_j
    = -\varphi(\theta).
    \]

    合成関数の公式
    \[
    \Delta(f^n)
    = n(n-1)f^{\,n-2}|\nabla f|^2
    + n f^{\,n-1}\Delta f
    \] を \(f=\varphi\) に適用すると
    \[
    \Delta \varphi^n(\theta)
    = n(n-1)\varphi^{n-2}(\theta)\,
    \frac{1}{d^2}\sum_{j=1}^d \sin^2\theta_j
    + n\varphi^{n-1}(\theta)\,(-\varphi(\theta)).
    \]

    整理して
    \[
    \boxed{
    \Delta \varphi^n(\theta)
    = n(n-1)\varphi^{n-2}(\theta)
    \left(\frac{1}{d^2}\sum_{j=1}^d \sin^2\theta_j\right)
    – n\varphi^n(\theta)
    }
    \]

    $d$ 次元変数 $\theta \in \mathbb{R}^d$ に対して、

    \[
    G_n(\theta) = \exp\left(- \frac{n}{2d} |\theta|^2 \right), \quad |\theta|^2 = \sum_{j=1}^d \theta_j^2
    \]

    を考える。

    任意の滑らかな関数 $f:\mathbb{R}^d \to \mathbb{R}$ に対して、

    \[
    \Delta e^f = (\lvert \nabla f \rvert^2 + \Delta f) e^f
    \]

    が成り立つ。ここで

    \[
    \nabla f = \left( \frac{\partial f}{\partial \theta_1}, \dots, \frac{\partial f}{\partial \theta_d} \right), \quad
    \Delta f = \sum_{j=1}^d \frac{\partial^2 f}{\partial \theta_j^2}.
    \]

    $f(\theta) = – \frac{n}{2d} |\theta|^2$ とすると、

    \[
    \frac{\partial f}{\partial \theta_j} = – \frac{n}{d} \theta_j \quad \Rightarrow \quad
    |\nabla f|^2 = \sum_{j=1}^d \left( -\frac{n}{d} \theta_j \right)^2 = \frac{n^2}{d^2} |\theta|^2,
    \]

    \[
    \frac{\partial^2 f}{\partial \theta_j^2} = – \frac{n}{d} \quad \Rightarrow \quad
    \Delta f = \sum_{j=1}^d \frac{\partial^2 f}{\partial \theta_j^2} = -n.
    \]

    上記の式を用いると、

    \[
    \Delta G_n(\theta) = (\lvert \nabla f \rvert^2 + \Delta f) e^f
    = \left( \frac{n^2}{d^2} |\theta|^2 – n \right) \exp\left(- \frac{n}{2d} |\theta|^2 \right)
    = \left( \frac{n^2}{d^2} |\theta|^2 – n \right) G_n(\theta).
    \]

    \[
    \text{スケーリング: } \theta = \frac{\alpha}{n}
    \]

    ${\Delta \varphi}_n$ の展開:
    \[
    \varphi\Big(\frac{\alpha}{n}\Big) = 1 – \frac{|\alpha|^2}{2dn} + O(n^{-2})
    \] \[
    \varphi^{\,n-2}\Big(\frac{\alpha}{n}\Big) \approx e^{-|\alpha|^2 / 2d}
    \] \[
    \sum_{j=1}^d \sin^2\Big(\frac{\alpha_j}{n}\Big) = \sum_{j=1}^d \left(\frac{\alpha_j^2}{n^2} + O(n^{-4})\right) = \frac{|\alpha|^2}{n} + O(n^{-2})
    \]

     

    \begin{align}
    \phi\!\left(\frac{\alpha}{n}\right)
    &= 1 – \frac{|\alpha|^2}{2d n} + O(n^{-2}), \\
    \phi^n\!\left(\frac{\alpha}{n}\right)
    &= \left( 1 – \frac{|\alpha|^2}{2d n} + O(n^{-2}) \right)^n
    \approx e^{- \frac{|\alpha|^2}{2d}} \left( 1 + O(n^{-1}) \right).
    \end{align}

    これらを $\Delta {\varphi}_n$ に代入すると:
    \[
    \Delta \varphi_n\Big(\frac{\alpha}{n}\Big)
    \approx n(n-1) \cdot e^{-|\alpha|^2 / 2d} \cdot \frac{d}{2} \cdot \frac{|\alpha|^2}{n} – n \, e^{-|\alpha|^2 / 2d}
    \] \[
    = \left(n \frac{d}{2} |\alpha|^2 – n\right) e^{-|\alpha|^2 / 2d} + O(1)
    \]

    ${\Delta G}_n$ の展開:
    \[
    \Delta G_n\Big(\frac{\alpha}{n}\Big) = \left(\frac{d}{2} n^2 \frac{|\alpha|^2}{n} – n\right) e^{-|\alpha|^2 / 2d} = \left(n \frac{d}{2} |\alpha|^2 – n\right) e^{-|\alpha|^2 / 2d}
    \]

    差のオーダーは:
    \[
    \Delta \varphi_n\Big(\frac{\alpha}{n}\Big) – \Delta G_n\Big(\frac{\alpha}{n}\Big) = O(1)
    \] である。
    主要な  $O(n) $項はキャンセルされ、残るのは $O(1) $項のみである。

    結果、

    \[
    \begin{aligned}
    |x|^2E(n,x)
    &=  (2\pi)^{-d}
    \int_{[-\pi,\pi]^d}
    e^{-i x \cdot \theta} \,
    \Biggl[
    -\Delta_\theta
    \Bigl( \varphi_n(\theta) – G_n(\theta) \Bigr)
    \Biggr] \, d\theta \\
    &\quad \overset{\theta = \alpha / \sqrt{n}}{=}
    (2\pi)^{-d}
    \int_{[-\pi \sqrt{n}, \pi \sqrt{n}]^d}
    e^{-i x \cdot (\alpha / \sqrt{n})} \,
    \Biggl[
    -\Delta_\alpha
    \Bigl( \varphi_n(\alpha / \sqrt{n}) – G_n(\alpha / \sqrt{n}) \Bigr)
    \Biggr] \, n^{-d/2} \, d\alpha
    = O(n^{-d/2})
    \end{aligned}
    \]

    参考:

    Intersections of Random Walks (Modern Birkhäuser Classics) (English Edition) 

    Osgood曲線(ルベーグ測度正をもつジョルダン曲線:Knopp’s Osgood Curve)


    [参考]:
    空間充填曲線とフラクタル; ザーガン, 鎌田清一郎

    フラクタル曲線についての解析学―擬等角写像外伝, 谷口 雅彦

    https://demonstrations.wolfram.com/KnoppsOsgoodCurveConstruction/

    三角形$T$(直角三角形である必要はない)から始まって, $r_1 \in (0,1)$である面積$r_1 J_2(T)$の開三角形を取り除き, 合わせた面積$J_2(T)(1-r)$の二個の閉三角形$T_0,T_1$が残る.
    これを続けていくと,
    \[
    \Lambda_2(C) = J_2(T) \Pi_{j=1}^{\infty} (1- r_j)
    \] をもった点集合
    \[
    C= (T_0 \cup T_1) \cap (T_{00} \cup T_{01}\cup T_{10} \cup T_{11}) \cap \cdots
    \] を得る. ここで, $\sum_{i=1}^{\infty}r_j$が収束すような$\{r_j\}_{j\geq 1}$であれば, $\Lambda_2(C) >0$である.
    そこで,  初期三角形$T$として, 長さ$2$の底辺を持った直角二等辺三角形を選び(したがって、$J_2(T)=1$), $r \in (0,1)$に対して, $r_j = r^2/ j^2$となるならば,
    \[
    \Lambda_2(C) = \Pi_{j=1}^{\infty} (1- \frac{r^2}{j^2})
    \]

    を得る. Weierstrass の分解定理から,
    \[
    \sin (\pi z) = \pi z \Pi_{j=1}^{\infty} (1- \frac{z^2}{j^2})
    \] である.
    \[
    \lambda_2(C)  = \Pi_{j=1}^{\infty} (1- \frac{z^2}{j^2}) = \frac{\sin(\pi r)}{\pi r}
    \] となる. 任意の$\lambda \in (0,1)$に対して, $\frac{\sin(\pi r)}{\pi r} = \lambda$が解$r \in (0,1)$をもつ. 任意の$\lambda \in (0,1)$に対して, 二次元Lebesgue測度$\lambda$の集合$C(\lambda)$を得ることができる.

    具体的に言うと,

    • 頂点 $A$ (直角の頂点): $(0, \sqrt{2})$

    • 左端 $B$: $(-\sqrt{2}, 0)$

    • 右端 $C$: $(\sqrt{2}, 0)$

    反復 $j$ における縮小率を $s_j = 1 – \frac{r}{j}$ とします。(

    反復 $j$ における除去面積率を $r_j = \frac{r^2}{j^2}$ とすると、残る三角形の高さの比率(縮小率) $s_j$ は次のように計算されています。

    $$s_j = 1 – \sqrt{r_j} = 1 – \frac{r}{j}$$

    )

     

    \[
    f_{j,1}\begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} s_j & 0 \\ 0 & s_j \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} + (1 – s_j) \begin{pmatrix} -\sqrt{2} \\ 0 \end{pmatrix}
    \]

    \[
    f_{j,2}\begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} s_j & 0 \\ 0 & s_j \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} + (1 – s_j) \begin{pmatrix} \sqrt{2} \\ 0 \end{pmatrix}
    \]

    \[
    E = \bigcap_{n=1}^{\infty} \bigcup_{\sigma \in \{1,2\}^n} (f_{n,\sigma_n} \circ \dots \circ f_{1,\sigma_1})(T_0)
    \]

    • $s$ が一定(例: 0.5)の場合: 面積は 0 に収束する。(典型的なKoch曲線)。

    • $s_j = 1 – r/j$ の場合: 縮小がだんだん「緩やか」になるため、無限回繰り返しても面積が 0 にならず、正の値($\frac{\sin \pi r}{\pi r}$)として残る。

      また, これは, 二次元の太ったCantor集合から構成も存在を保証できる。(実際の構成は、ザーガンのほんの8.2章に載っている。) そうではない方法としては, 一度作った太ったCantor集合(Smith–Volterra–Cantor set)にDenjoy–Riesz theoremを適用することで, 存在を証明できる。

      On Uncountable Unions and Intersections of Measurable Sets

     

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.patches import Polygon
    from matplotlib.widgets import Slider
    from typing import List, Callable
    from scipy.optimize import fsolve
    
    
    
    # ---- utilities ------------------------------------------
    
    
    def nest(f: Callable, x, n: int):
    for _ in range(n):
    x = f(x)
    return x
    
    
    
    def flatten_once(lst: List[List]):
    return [item for sub in lst for item in sub]
    
    
    
    # ---- Core fractal logic with varying removal rates --------------------
    
    
    class TriangleSplitterVarying:
    """
    Implements the construction where at iteration j, we remove a triangle
    with area ratio r_j relative to the parent triangle.
    
    
    For the special case r_j = r²/j², the final measure is sin(πr)/(πr).
    """
    
    
    def __init__(self, r: float, max_iterations: int = 10):
    """
    Args:
    r: The parameter in r_j = r²/j²
    max_iterations: Maximum depth of iteration
    """
    self.r = r
    self.max_iterations = max_iterations
    # Precompute removal ratios
    self.removal_ratios = [r**2 / j**2 for j in range(1, max_iterations + 1)]
    
    
    def compute_split_params(self, removal_ratio: float):
    """
    Given a removal ratio r_j, compute the split parameters.
    
    
    For a triangle with base on bottom, if we remove a triangle from the top
    with area ratio r_j, we need to find the height ratio.
    
    
    Since area scales with height, if we keep a fraction h of the height,
    each resulting triangle has area (1-r_j)/2.
    
    
    The removed triangle has area r_j.
    The two remaining triangles together have area (1-r_j).
    
    
    For symmetric removal from the top, we use:
    - center = 0.5 (middle of base)
    - The split point determines how much we remove
    """
    # For a symmetric split, if we remove area r_j from top,
    # the remaining two triangles share area (1-r_j)
    
    
    # Height ratio of removed triangle: sqrt(r_j)
    h_removed = np.sqrt(removal_ratio)
    
    
    # The split happens at height (1 - h_removed) from bottom
    h_split = 1 - h_removed
    
    
    # For the base of the removed triangle, we need to compute
    # the width at height h_split
    # For a triangle, width scales linearly with height from apex
    # At height h from bottom (where total height is 1),
    # the distance from apex is (1-h), so width is proportional to (1-h)
    
    
    # At the split line, the width ratio is (1 - h_split) = h_removed
    # So the split points on the base are at:
    # center ± h_removed/2
    
    
    center = 0.5
    half_width = h_removed / 2
    left = center - half_width
    right = center + half_width
    
    
    return left, center, right
    
    
    def split_triangle_at_iteration(self, triangle: np.ndarray, iteration: int):
    """
    Split a triangle at a given iteration with removal ratio r_iteration.
    """
    if iteration >= len(self.removal_ratios):
    return [triangle] # No more splitting
    
    
    r_j = self.removal_ratios[iteration]
    left, center, right = self.compute_split_params(r_j)
    
    
    a, b, c = triangle
    
    
    # Points on the base
    p_left = b + left * (c - b)
    p_right = b + right * (c - b)
    
    
    # The split happens at these points, creating two triangles
    return [
    np.array([p_left, b, a]),
    np.array([p_right, c, a]),
    ]
    
    
    def fractal(self, initial_triangle: np.ndarray, n_iterations: int):
    """
    Generate the fractal after n_iterations.
    """
    triangles = [initial_triangle]
    
    
    for iteration in range(min(n_iterations, self.max_iterations)):
    new_triangles = []
    for tri in triangles:
    new_triangles.extend(self.split_triangle_at_iteration(tri, iteration))
    triangles = new_triangles
    
    
    return triangles
    
    
    
    # ---- Measure computation ------------------------------------------------
    
    
    def compute_measure_product(r: float, n_terms: int = 100):
    """
    Compute the product: ∏(1 - r²/j²) for j=1 to n_terms
    """
    product = 1.0
    for j in range(1, n_terms + 1):
    product *= (1 - r**2 / j**2)
    return product
    
    
    
    def compute_measure_sinc(r: float):
    """
    Compute sin(πr)/(πr) using the Weierstrass product formula.
    """
    if abs(r) < 1e-10:
    return 1.0
    return np.sin(np.pi * r) / (np.pi * r)
    
    
    
    def find_r_for_lambda(target_lambda: float):
    """
    Find r such that sin(πr)/(πr) = target_lambda.
    """
    def equation(r):
    return compute_measure_sinc(r) - target_lambda
    
    
    # Initial guess
    r0 = 0.5
    solution = fsolve(equation, r0)
    return solution[0]
    
    
    
    # ---- Visualization ------------------------------------------------------
    
    
    def visualize_fractal_with_measure(r: float, max_iterations: int = 8):
    """
    Visualize the fractal construction with measure computation.
    """
    # Create initial right isosceles triangle with base 2, area 1
    # Base from (-1, 0) to (1, 0), apex at (0, 1)
    b = np.array([-1.0, 0.0])
    c = np.array([1.0, 0.0])
    a = np.array([0.0, 1.0])
    initial_triangle = np.array([a, b, c])
    
    
    fig, axes = plt.subplots(2, 4, figsize=(16, 8))
    axes = axes.flatten()
    
    
    splitter = TriangleSplitterVarying(r, max_iterations)
    
    
    # Compute theoretical measure
    measure_theory = compute_measure_sinc(r)
    measure_product = compute_measure_product(r, max_iterations)
    
    
    fig.suptitle(
    f'Fractal Construction with r = {r:.4f}\n'
    f'Theoretical Measure λ = sin(πr)/(πr) = {measure_theory:.6f}\n'
    f'Product Formula (n={max_iterations}): {measure_product:.6f}',
    fontsize=12, fontweight='bold'
    )
    
    
    for idx, n in enumerate(range(9)):
    if idx >= len(axes):
    break
    
    
    ax = axes[idx]
    triangles = splitter.fractal(initial_triangle, n)
    
    
    # Compute actual measure (sum of triangle areas)
    total_area = sum(triangle_area(tri) for tri in triangles)
    
    
    for tri in triangles:
    ax.add_patch(
    Polygon(
    tri,
    closed=True,
    edgecolor='black',
    facecolor='lightblue',
    linewidth=0.5,
    )
    )
    
    
    ax.set_xlim(-1.2, 1.2)
    ax.set_ylim(-0.1, 1.2)
    ax.set_aspect('equal')
    ax.set_title(f'Iteration {n}\nArea = {total_area:.6f}', fontsize=10)
    ax.grid(True, alpha=0.3)
    
    
    plt.tight_layout()
    return fig
    
    
    
    def triangle_area(triangle: np.ndarray):
    """
    Compute the area of a triangle using the cross product formula.
    """
    a, b, c = triangle
    return 0.5 * abs(np.cross(b - a, c - a))
    
    
    
    # ---- Interactive visualization with slider ------------------------------
    
    
    def interactive_measure_exploration():
    """
    Interactive exploration of the relationship between r and measure λ.
    """
    fig = plt.figure(figsize=(14, 10))
    
    
    # Create subplots
    ax_fractal = plt.subplot(2, 2, (1, 3))
    ax_graph = plt.subplot(2, 2, 2)
    ax_product = plt.subplot(2, 2, 4)
    
    
    plt.subplots_adjust(bottom=0.15, hspace=0.3)
    
    
    # Initial parameters
    r0 = 0.5
    max_iter = 8
    
    
    # Create initial triangle
    b = np.array([-1.0, 0.0])
    c = np.array([1.0, 0.0])
    a = np.array([0.0, 1.0])
    initial_triangle = np.array([a, b, c])
    
    
    def redraw(r, n_iter):
    # Clear axes
    ax_fractal.clear()
    ax_graph.clear()
    ax_product.clear()
    
    
    # Generate fractal
    splitter = TriangleSplitterVarying(r, max_iter)
    triangles = splitter.fractal(initial_triangle, n_iter)
    
    
    # Draw fractal
    for tri in triangles:
    ax_fractal.add_patch(
    Polygon(
    tri,
    closed=True,
    edgecolor='black',
    facecolor='lightblue',
    linewidth=0.5,
    )
    )
    
    
    total_area = sum(triangle_area(tri) for tri in triangles)
    measure_theory = compute_measure_sinc(r)
    
    
    ax_fractal.set_xlim(-1.2, 1.2)
    ax_fractal.set_ylim(-0.1, 1.2)
    ax_fractal.set_aspect('equal')
    ax_fractal.set_title(
    f'Iteration {n_iter}, r = {r:.4f}\n'
    f'Actual Area: {total_area:.6f}\n'
    f'Theory λ = sin(πr)/(πr): {measure_theory:.6f}',
    fontsize=11
    )
    ax_fractal.grid(True, alpha=0.3)
    
    
    # Plot measure vs r
    r_values = np.linspace(0.01, 0.99, 200)
    lambda_values = [compute_measure_sinc(r_val) for r_val in r_values]
    
    
    ax_graph.plot(r_values, lambda_values, 'b-', linewidth=2, label='λ = sin(πr)/(πr)')
    ax_graph.plot(r, measure_theory, 'ro', markersize=10, label=f'Current: r={r:.3f}, λ={measure_theory:.3f}')
    ax_graph.set_xlabel('r', fontsize=11)
    ax_graph.set_ylabel('λ (Measure)', fontsize=11)
    ax_graph.set_title('Measure vs Parameter r', fontsize=11)
    ax_graph.grid(True, alpha=0.3)
    ax_graph.legend()
    ax_graph.set_xlim(0, 1)
    ax_graph.set_ylim(0, 1)
    
    
    # Plot convergence of product
    iterations = range(1, 21)
    product_values = [compute_measure_product(r, n) for n in iterations]
    
    
    ax_product.plot(iterations, product_values, 'b-o', linewidth=2, markersize=4, label='Product formula')
    ax_product.axhline(y=measure_theory, color='r', linestyle='--', linewidth=2, label='Theoretical limit')
    ax_product.set_xlabel('Number of terms', fontsize=11)
    ax_product.set_ylabel('Product value', fontsize=11)
    ax_product.set_title(f'Convergence of ∏(1 - r²/j²) for r={r:.4f}', fontsize=11)
    ax_product.grid(True, alpha=0.3)
    ax_product.legend()
    
    
    fig.canvas.draw_idle()
    
    
    # Create sliders
    ax_r = plt.axes([0.15, 0.05, 0.7, 0.03])
    ax_iter = plt.axes([0.15, 0.01, 0.7, 0.03])
    
    
    s_r = Slider(ax_r, 'r', 0.01, 0.99, valinit=r0)
    s_iter = Slider(ax_iter, 'iterations', 0, max_iter, valinit=max_iter, valstep=1)
    
    
    def update(_):
    redraw(s_r.val, int(s_iter.val))
    
    
    s_r.on_changed(update)
    s_iter.on_changed(update)
    
    
    redraw(r0, max_iter)
    plt.show()
    
    
    
    # ---- Examples for specific target measures -----------------------------
    
    
    def show_specific_measures():
    """
    Show fractals with specific target measures.
    """
    target_lambdas = [0.9, 0.7, 0.5, 0.3]
    
    
    fig, axes = plt.subplots(2, 2, figsize=(12, 12))
    axes = axes.flatten()
    
    
    b = np.array([-1.0, 0.0])
    c = np.array([1.0, 0.0])
    a = np.array([0.0, 1.0])
    initial_triangle = np.array([a, b, c])
    
    
    for idx, target_lambda in enumerate(target_lambdas):
    ax = axes[idx]
    
    
    # Find r for this lambda
    r = find_r_for_lambda(target_lambda)
    
    
    # Generate fractal
    splitter = TriangleSplitterVarying(r, max_iterations=10)
    triangles = splitter.fractal(initial_triangle, 10)
    
    
    # Draw
    for tri in triangles:
    ax.add_patch(
    Polygon(
    tri,
    closed=True,
    edgecolor='black',
    facecolor='lightblue',
    linewidth=0.3,
    )
    )
    
    
    total_area = sum(triangle_area(tri) for tri in triangles)
    
    
    ax.set_xlim(-1.2, 1.2)
    ax.set_ylim(-0.1, 1.2)
    ax.set_aspect('equal')
    ax.set_title(
    f'Target λ = {target_lambda:.1f}\n'
    f'r = {r:.4f}\n'
    f'Actual area = {total_area:.4f}',
    fontsize=11
    )
    ax.grid(True, alpha=0.3)
    
    
    fig.suptitle(
    'Fractal Sets with Prescribed Measures\n'
    'Using r_j = r²/j² and λ = sin(πr)/(πr)',
    fontsize=13, fontweight='bold'
    )
    
    
    plt.tight_layout()
    return fig
    
    
    
    # ---- Main ----------------------------------------------------------------
    
    
    if __name__ == "__main__":
    print("Fractal Construction with Prescribed Measure")
    print("=" * 60)
    print("\nTheory: For r_j = r²/j², the limiting measure is:")
    print("λ = sin(πr)/(πr)")
    print("\nThis allows constructing a set with ANY measure λ ∈ (0,1)")
    print("by choosing appropriate r ∈ (0,1)")
    print("=" * 60)
    
    
    # Example calculations
    print("\nExamples:")
    for target_lambda in [0.9, 0.7, 0.5, 0.3, 0.1]:
    r = find_r_for_lambda(target_lambda)
    actual_lambda = compute_measure_sinc(r)
    print(f" Target λ = {target_lambda:.1f} → r = {r:.6f} → λ = {actual_lambda:.6f}")
    
    
    print("\n" + "=" * 60)
    print("Generating visualizations...")
    print("=" * 60)
    
    
    # Generate static visualizations
    fig1 = visualize_fractal_with_measure(r=0.5, max_iterations=8)
    fig1.savefig('fractal_iterations.png', dpi=150, bbox_inches='tight')
    
    
    print("✓ Saved: fractal_iterations.png")
    
    
    fig2 = show_specific_measures()
    fig2.savefig('fractal_specific_measures.png', dpi=150, bbox_inches='tight')
    print("✓ Saved: fractal_specific_measures.png")
    
    
    # Launch interactive visualization
    print("\nLaunching interactive visualization...")
    print("Use sliders to explore different values of r and iterations")
    interactive_measure_exploration()