Next.js ✕ LM Studio ✕ gpt-oss-20b

# gpt-oss-20b をLM studioで動かしてそれをnext.jsを用いてブラウザでchat botっぽく表示する方法です。

## 結果

↑こんな感じになると思います。

## やりかた

### LM-studio & gpt-oss-20b
なんか最近(8/8現在)でたgpt-oss-20bです。
LM studioの導入はこのお方
の記事を、例えば参考にしてください。

こことか見ておく。

### Approuter

pnp install
pnpm add vercel/ai openai

みたいなのを打っといてください。

Create-next-appとターミナルで打って、いい感じに質問に答えておきましょう。

app/api/chat/route.ts

にディレクトリを作りつつ、以下のコードをコードを貼ってください。

/* app/api/chat/route.ts */

import { NextResponse } from 'next/server'; 
export async function POST(req: Request) { 
const { messages } = await req.json(); 

const response = await fetch(process.env.AI_API_URL!, { 
method: 'POST', 
headers: { 'Content-Type': 'application/json' }, 
body: JSON.stringify({ model: 'openai/gpt-oss-20b', messages }), 
}); 

if (!response.ok) { 
return new NextResponse('Error contacting LM Studio API', { status: 500 }); 
} 

const data = await response.json(); 

// LM Studioのレスポンスから必要な部分だけを抽出して返す 
const message = data.choices?.[0]?.message; 

if (!message) { 
return new NextResponse('Invalid response format from LM Studio API', { status: 500 }); 
} 

// 必要最低限の形で返す 
return NextResponse.json({ 
choices: [ 
{ 
message, 
}, 
], 
}); 
}


### 実際の表示画面部分
これをapp/src にpage.tsxとして置いといてください。(とりあえず)

'use client'; 

import { useState } from 'react'; 
import ReactMarkdown from 'react-markdown'; 

type Message = { 
role: 'user' | 'assistant'; 
content: string; 
id: string; 
}; 

export default function Chat() { 
const [messages, setMessages] = useState<Message[]>([]); 
const [input, setInput] = useState(''); 

const handleSubmit = async (e: React.FormEvent) => { 
e.preventDefault(); 
if (!input.trim()) return; 

const userMessage: Message = { 
role: 'user', 
content: input, 
id: crypto.randomUUID(), 
}; 

// 表示用にユーザーメッセージを先に追加 
setMessages(prev => [...prev, userMessage]); 
setInput(''); 

try { 
const res = await fetch('/api/chat', { 
method: 'POST', 
headers: { 'Content-Type': 'application/json' }, 
body: JSON.stringify({ messages: [...messages, userMessage] }), 
}); 

const data = await res.json(); 

const aiContent = data?.choices?.[0]?.message?.content; 

if (aiContent) { 
const aiMessage: Message = { 
role: 'assistant', 
content: aiContent, 
id: crypto.randomUUID(), 
}; 

setMessages(prev => [...prev, aiMessage]); 
} 
} catch (err) { 
console.error('API error:', err); 
} 
}; 

return ( 
<main> 
<div> {messages.map((m) => ( 
<div key={m.id}> 
<strong>{m.role === 'user' ? '👤 User' : '🤖 AI'}:</strong> 
<ReactMarkdown>{m.content}</ReactMarkdown> 
</div> ))} 
</div> 

<form onSubmit={handleSubmit}> 
<input type="text" 
value={input} 
onChange={e => setInput(e.target.value)} 
placeholder="質問を入力..." 
/> 
<button type="submit">送信</button> 
</form> </main> ); 
}

### `.env.local` 設定

env.localファイルを作って、

AI_API_URL=http://localhost:1234/v1/chat/completions
OPENAI_API_KEY=lm-studio
# - `AI_API_URL`: LM Studio のチャットエンドポイント(デフォルト) 
# - `OPENAI_API_KEY`: 実際には使われないが、ライブラリ上必須なのでダミーを入れる

あとは、

 npm run dev 

でも打って、でてきた

 ▲ Next.js 15.4.6 (Turbopack)
- Local: http://localhost:3000
- Network: http://192.168.21.9:3000
- Environments: .env.local

http://localhost:3000

みたいなのに飛べばいいと思います。
### 参考

Vercel AI SDK を使って Next.js アプリに AI 機能を追加する

## おまけ(## Google APIでの検索を入れたい場合

## Google APIでの検索を入れたい場合
https://programmablesearchengine.google.com/controlpanel/all
からGoogle CSXの番号を拾ってくる。

Google Custom APIを検索して、登録する。
API key
このAPI keyCSXコードを.env.localっていうmy app直下につけたす。
## 📎 参考
- (https://ai-sdk.dev/providers/ai-sdk-providers/openai)[Vercelai/sdkの説明]
- [https://github.com/vercel/ai](https://github.com/vercel/ai)
- [https://lmstudio.ai](https://lmstudio.ai)
# Google Custom Search API
# GOOGLE_API_KEY=あなたのAPIキー
# GOOGLE_CX=あなたの検索エンジンID
GOOGLE_API_KEY=AIUEO_WADDLE_DEE
GOOGLE_CX=WADDLE_DEE

そしたら、src/app/api/chat/route.tsの中身を

import { NextResponse } from 'next/server';

export async function POST(req: Request) {
    const { messages } = await req.json();

    if (!Array.isArray(messages) || messages.length === 0) {
        return new NextResponse('Invalid messages', { status: 400 });
    }

    // 最新のユーザーメッセージを取得
    const lastUserMessage = [...messages].reverse().find(m => m.role === 'user');
    if (!lastUserMessage) {
        return new NextResponse('No user message found', { status: 400 });
    }

    // Google検索API呼び出し
    const searchUrl = `https://www.googleapis.com/customsearch/v1?q=${encodeURIComponent(
        lastUserMessage.content
    )}&key=${process.env.GOOGLE_API_KEY}&cx=${process.env.GOOGLE_CX}`;

    const searchRes = await fetch(searchUrl);
    if (!searchRes.ok) {
        console.error('Google Search API error:', await searchRes.text());
        return new NextResponse('Google Search API error', { status: 500 });
    }

    const searchData = await searchRes.json();
    const searchText =
        searchData.items?.map((item: any) => `${item.title}: ${item.snippet}`).join('\n') ||
        '検索結果なし';

    // LM Studioに渡すmessages配列を構築
    const lmMessages = [
        { role: 'system', content: '以下の検索結果を参考にして質問に答えてください。' },
        ...messages,
        { role: 'user', content: `検索結果:\n${searchText}` },
    ];

    // LM Studio APIへ問い合わせ
    const lmRes = await fetch(process.env.AI_API_URL!, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            model: 'openai/gpt-oss-20b', // ここはLM Studioで使うモデル名に置き換えてください
            messages: lmMessages,
        }),
    });

    if (!lmRes.ok) {
        console.error('LM Studio API error:', await lmRes.text());
        return new NextResponse('Error contacting LM Studio API', { status: 500 });
    }

    const data = await lmRes.json();
    const message = data.choices?.[0]?.message;

    if (!message) {
        return new NextResponse('Invalid response from LM Studio', { status: 500 });
    }

    return NextResponse.json({
        choices: [{ message }],
    });
}

にしてください。以上です。心配だったら、
src/app/example/page.tsx

'use client';
import React, { useState } from 'react';

export default function Example() {
    const [value, setValue] = useState('');

    const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
        setValue(e.target.value);
    };

    return (
        <div>
            <input type="text" value={value} onChange={handleChange} />
            <p>入力された値: {value}</p>
        </div>
    );
}

src/app/page.tsxを

'use client';

import { useState } from 'react';
import ReactMarkdown from 'react-markdown';

type Message = {
    role: 'user' | 'assistant' | 'system';
    content: string;
    id: string;
};

export default function Chat() {
    const [messages, setMessages] = useState<Message[]>([
        {
            role: 'system',
            content: '僕は、親切なAIアシスタントだよ。検索結果を参考にして回答するよ。',
            id: crypto.randomUUID(),
        },
    ]);
    const [input, setInput] = useState('');

    const handleSubmit = async (e: React.FormEvent) => {
        e.preventDefault();
        if (!input.trim()) return;

        const userMessage: Message = {
            role: 'user',
            content: input,
            id: crypto.randomUUID(),
        };

        // ユーザーメッセージを追加
        const updatedMessages = [...messages, userMessage];
        setMessages(updatedMessages);
        setInput('');

        try {
            const res = await fetch('/api/chat', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ messages: updatedMessages }),
            });

            const data = await res.json();
            const aiContent = data?.choices?.[0]?.message?.content;

            if (aiContent) {
                const aiMessage: Message = {
                    role: 'assistant',
                    content: aiContent,
                    id: crypto.randomUUID(),
                };
                setMessages(prev => [...prev, aiMessage]);
            }
        } catch (err) {
            console.error('API error:', err);
        }
    };

    return (
        <main style={{ maxWidth: 600, margin: 'auto', padding: 20 }}>
            <div style={{ marginBottom: 20 }}>
                {messages.map(m => (
                    <div key={m.id} style={{ marginBottom: 10 }}>
                        <strong>{m.role === 'user' ? '👤 User' : m.role === 'assistant' ? '🤖 AI' : '⚙️ System'}:</strong>
                        <ReactMarkdown>{m.content}</ReactMarkdown>
                    </div>
                ))}
            </div>

            <form onSubmit={handleSubmit}>
                <input
                    type="text"
                    value={input}
                    onChange={e => setInput(e.target.value)}
                    placeholder="質問を入力..."
                    style={{ width: '80%', padding: '8px' }}
                />
                <button type="submit" style={{ padding: '8px 16px', marginLeft: 8 }}>
                    送信
                </button>
            </form>
        </main>
    );
}

src/app/layout.tsxを

export default function RootLayout({
                                       children,
                                   }: Readonly<{
    children: React.ReactNode;
}>) {
    return (
        <html lang="en">
        <body> {/*  class名を削除 */}
        {children}
        </body>
        </html>
    );
}

.env.localのまとめ↓

# LM Studioのローカルサーバーアドレスを指定
# 通常は "http://localhost:1234/v1" です(LM studioの設定画面を見てください)
# OPENAI_API_BASE_URL="http://localhost:1234/v1"
AI_API_URL=http://localhost:3141592/v1/chat/completions


# LM StudioAPIキーを要求しませんが、ライブラリ側で必須の場合があるため
# ダミーの文字列を入れておきます
OPENAI_API_KEY="lm-studio"


# Google Custom Search API
# GOOGLE_API_KEY=あなたのAPIキー
# GOOGLE_CX=あなたの検索エンジンID
GOOGLE_API_KEY=AIUEO_WADDLE_DEE
GOOGLE_CX=WADDLE_DEE

多様体のアフィン接続

公理的にベクトル場の共変(Covariant )微分を次のように定義する.
ベクトル場による“関数”の微分に対し, ベクトル場による“ベクトル場”の微分を定めるのが, $\textbf{共変微分}$と呼ばれる操作である.

Definition.
多様体Mについて, 以下の$4$条件を満たす写像
\[\nabla \colon \mathcal{X}(M) \times \mathcal{X}(M) \to \mathcal{X}(M) \colon (X,Y)\mapsto \nabla_{X}Y\]を$M$の共変微分という.
ユークリッドの共変微分が持っていた性質のこと。

$\nabla_{X}(Y+Z)= \nabla_{X}Y + \nabla_{X}Z$
$\nabla_{X}(fY) = (Xf)Y+f\nabla_{X}Y$ こっちはガチで微分だからchain ruleが発生する。fYは微分されるから.
$\nabla_{X+Y}Z= \nabla_{X}Z+ \nabla_{Y}Z$
$\nabla_{fX}Y= f \nabla_{X}Y$

$F(X, Y)= \nabla_{X}Y $はLeibnitz ruleのせいで, テンソル性(“$C^{\infty}$”多重線形性を持たない )
だけど、写像$ \nabla, \nabla’$の差は(1,2)-Tensor場になっている.
すなわち,
\[S(X, Y)= \nabla_{X}Y- \nabla’_{X}Y\] は(1,2)-Tensor fieldである. 実際,
\[
\begin{align}
S(fX, gY)
&= \nabla_{fX}(gY)- \nabla’_{fX}(gY) \\
&= f \nabla_{X}(gY)-f \nabla’_{X}(gY) \\
&= f \big( (Xg)Y + g\nabla_{X}(Y) \big) – f \big( (Xg)Y + g\nabla’_{X}(Y) \big) \\
&= f g \big( \nabla_{X}(Y)- \nabla’_{X}(Y) \big) \\
&= f g S(X,Y)
\end{align}
\]

このことから, p.121にあるとおりRiemaniann connection を固定して、共変微分と(1,2)-Tensor fieldを1 to 1でみることがある.

 

Remark.

たとえば, $M$が$\R^n$の場合は, $M$の$C^{\infty}$ベクトル場$Y$は$M$上の$\R$値$C^{\infty}$級関数$(f^1,\dots,f^m)$とみなせる. ここで, ベクトル場$X$による関数の微分を考えれば,

$(Xf^1,\dots, Xf^m)$が$\nabla_X Y$である\footnote{ここで, $Xf^i$は$\R$上の関数であることに注意する. }. ユークリッド空間では今述べたように, 単純に成分ごとに微分すれば良いのだが, 第一“曲がった”空間では微分した後のベクトル場(の係数)もズレてしまう. そこで, そのベクトル(場)のズレを表す係数(を表す関数)がクリストッフェル記号である.

Definition.
$(U,\{x_i\})$を$M$の局所座標とする.

この時, 自然フレーム$\{\partial / \partial x^i\}_i$を用いて, $U$上の$C^{\infty}$-関数の族$\{\Gamma_{i,j}^k\}_{1\leq i,j,k \leq m}$を

\[\nabla_{\frac{\partial}{ \partial x^i}}\frac{\partial}{ \partial x^j} = \sum_{k=1}^{m} \Gamma_{i,j}^k\frac{\partial}{ \partial x^k} \]

の係数として定義する. この$\{\Gamma_{i,j}^k\}_{1\leq i,j,k \leq m}$を$(x^i)$に関する線形接続$\nabla$の$\textbf{接続係数(クリストッフェル記号)}$という.

別の座標近傍$(V,\{\xi^a\}_{1\leq a \leq n})$でも同様に、

$V$上の$C^{\infty}$-関数の族$\{\Gamma_{a,b}^c\}_{1\leq a,b,c \leq n}$を

\[\nabla_{\frac{\partial}{ \partial {\xi}^a}}\frac{\partial}{ \partial {\xi}^b} = \sum_{k=1}^{n} \Gamma_{a,b}^c\frac{\partial}{ \partial {\xi}^c} \]

の係数として定めることができる。座標近傍の共通部分$U\cap V$では2つの局所座標系$(x^i)$, $(\xi^{\alpha})$が共存しているから, $\{\Gamma_{i,j}^k\}, \{\Gamma_{a,b}^c\}$の間に何らかの座標変換規則がある。それを導くために、$\nabla_{\frac{\partial}{ \partial x^i}}\frac{\partial}{ \partial x^j} $を$2$通りで計算してみる。 まず一方は, Christoffelの定義を使ってから、接空間$\frac{\partial}{ \partial x^j}$の変換則を使う。
\[\nabla_{\frac{\partial}{ \partial x^i}}\frac{\partial}{ \partial x^j} = \sum_{k=1}^{n} \Gamma_{i,j}^k\frac{\partial}{ \partial x^k}=\sum_{k=1}^{n}\sum_{c=1}^n \Gamma_{i,j}^k  \frac{\partial {\xi}^c }{ \partial {x}^k }\frac{\partial}{ \partial {\xi}^c}\]

他方、上で言った操作の順番を逆転して計算する。(bは別になんでもよくて、最後が$c$だと上の式と比較しやすいから別の文字を使ってるだけ。 最終行の等号は、このことに関連して、当然、一項目のbと二項目のcを合わせていいからである。)
\[
\begin{align}
\nabla_{\frac{\partial}{ \partial x^i}}\frac{\partial}{ \partial x^j}
&=\nabla_{\frac{\partial}{ \partial x^i}} (\frac{\partial {\xi}^b }{ \partial {x}^j }\frac{\partial}{ \partial {\xi}^b})\\
&=\frac{\partial^2 {\xi}^b }{ \partial {x}^i\partial {x}^j } \frac{\partial}{ \partial {\xi}^b} + \frac{\partial {\xi}^b }{ \partial {x}^j } \nabla_{\frac{\partial}{ \partial x^i}}\frac{\partial}{ \partial {\xi}^b} \\
&=\frac{\partial^2 {\xi}^b }{ \partial {x}^i\partial {x}^j } \frac{\partial}{ \partial {\xi}^b} + \frac{\partial {\xi}^b }{ \partial {x}^j } \nabla_{ \frac{\partial {\xi}^a }{ \partial {x}^i }\frac{\partial}{ \partial {\xi}^a }}\frac{\partial}{ \partial {\xi}^b}\\
&=\frac{\partial^2 {\xi}^b }{ \partial {x}^i\partial {x}^j } \frac{\partial}{ \partial {\xi}^b} + \frac{\partial {\xi}^b }{ \partial {x}^j }\frac{\partial {\xi}^a }{ \partial {x}^i } \nabla_{ \frac{\partial}{ \partial {\xi}^a} }\frac{\partial}{ \partial {\xi}^b}\\
&=\frac{\partial^2 {\xi}^b }{ \partial {x}^i\partial {x}^j } \frac{\partial}{ \partial {\xi}^b} + \frac{\partial {\xi}^b }{ \partial {x}^j }\frac{\partial {\xi}^a }{ \partial {x}^i} \Gamma_{a,b}^c\frac{\partial}{ \partial x^c} \\
&=\left( \frac{\partial^2 {\xi}^c }{ \partial {x}^i\partial {x}^j }  + \frac{\partial {\xi}^a }{ \partial {x}^i }\frac{\partial {\xi}^b }{ \partial {x}^j } \Gamma_{a,b}^c \right)  \frac{\partial}{ \partial x^c}
\end{align}
\]

\[ \Gamma_{i,j}^k  \frac{\partial {\xi}^c }{ \partial {x}^k }= \frac{\partial^2 {\xi}^c }{ \partial {x}^i\partial {x}^j }  + \frac{\partial {\xi}^a }{ \partial {x}^i }\frac{\partial {\xi}^b }{ \partial {x}^j } \Gamma_{a,b}^c \]

Remark.

$\Gamma_{i,j}^k$は, 自然フレームの$i$番目のベクトル場$\frac{\partial}{ \partial x^i}$ $\textbf{を}$ $j$番目のベクトル場$\frac{\partial}{ \partial x^j}$ $\textbf{で}$ 微分した時にズレてくる係数の内$k$番目のベクトル場$\frac{\partial}{ \partial x^k}$での係数を表している.

当然, ユークリッド空間でのベクトル場のベクトル場の微分と一致するはずと思うかもしれない. でも,$ \textbf{まだ接続$\nabla$と計量$g$の対応が述べられていないわけである}$. そこで出てくる特別な接続が, $\textbf{Levi-Civita 接続}$である.

Example.
$M$が通常の内積を持ったユークリッド空間$\R^n$の場合, $\R^n$の座標関数から定まる自然フレームに関して$g_{i,j}=\delta_{i,j}$だから{細かいことを言わなければ, 標準基底を左から並べて行列にしたらいい.}, \[ \Gamma_{i,j}^k=0 \quad 1\leq i,j,k \leq m\]
Proposition.
. Let M $C^{\infty}$ mfd, $\nabla$ を或る connection on M とし,  $\gamma: [a, b] \to M $be a smooth curve in M. 次のような $\gamma$に沿った$C^{\infty}$ベクトル場上で定義された$\mathbb{R}$-linear map, $D/dt$ が一意に存在する.   (1) For any $f \in C^{\infty}([a, b])$,
\[
\frac{D(fX)}{ dt} = \frac{df}{ dt} X + f \frac{DX}{ dt}
\] (2) $X$が或るベクトル場$Z \in X(M)$により誘導されたベクトル場、つまり, $X(t_0) = Z(\gamma(t_0))$ for all $t_0 \in [a, b]$のとき,
\[
\frac{DX}{ dt} (t_0)=(\nabla_{\dot{\gamma}(t_0)}Z)_(t_0)
\]

 

Proposition.
多様体 M 上の可微分曲線 $\gamma \colon [a, b] \to M$ と,任意の $v \in T_{\gamma(a)}M $に対して, $\gamma$ に沿って平行なベ クトル場 $X(t)$ で$ X(a) = v$ となるものが唯一存在する. 証明: $X = (X_1 , . . . , X_m) $は線型常微分方程式 (9.1)
\[
\frac{dX_j}{dt} + \sum_{i,k} \Gamma^{j}_{i,k} \frac{dx_i}{dt} X_k = 0 (j = 1, . . . , m)
\] の初期条件 $X_j (a) = v_j$ ($v_j $は $v$ の成分) を満たす解である.
Proposition.
平行移動 Pγ : TpM → TqM は線型同型写像である. 証明: 方程式 (9.1) は線型方程式であるから線型性が従う.さらに γ の逆向きの曲線は Pγ の逆写像を与えるの で,同型が言える.特に、$\nabla$がLevi-Citivita接続ならば、この写像はmetic $g$に関して, 等長同型である、つまり, $O(n)$ ($M$-$n$ dim mfd)の元である.

Remark.

ここででてきた$\Pi_{p(t)})^p(a)$は、端点が同じ場合、特にholonomy(ホロノミー)と呼ばれる。このホロノミーのさらなる部分集合として一点可縮な曲線の集合とすると、それは山辺の定理( Lie 群内の弧状連結部分群は連結 Lie 部分群 )から連結 Lie 部分群となり, $GL(T_pM)$ の単位元をもつ連結成分であるから, ホロノミー群自身も$GL(T_pM)$ のLie 部分群となる. この考えは、別に$T_pM$じゃなくても一般にベクトル束のファイバー$E_p$においても同様のことが成り立つ.
(参考: お茶の水女子大学大学院 幾何構造特論 IV ————– 部分多様体の法ホロノミー群 とその応用 修正版 (3 月 21 日) 田崎博之)

Theorem.
多様体$M$ において,点 $p(a) \in M $を通る曲線 $C = \{p(t) : a − \varepsilon < t < a + \varepsilon\}$, $\varepsilon > 0 $を考える.任意のベクトル場 $Y \in \mathcal{X}$ に対して, $(\nabla_{\dot{p }(t) }Y)_{p(a)} = \lim_
{t\to a} \frac{1 }{t − a} \{\Pi_{p(t)})^p(a))  Y_p(t) − Y_{p(a)} \}$ が成り立つ.$\Pi_{p(t)})^p(a)$ は特に始点と終点を明示して書いたものであり, $\Pi_{C}$と同じ意味である.
ここでは、参考文献とは違った”カッコいい”証明を書いておく。(参考:[1]
: MathStackExchange, [2]Riemann幾何学 田崎博之 p.11にRiemannian 多様体の場合について記述がある。(後者は、(p,q)-Tensor場のベクトル束のことを書いていて詳しいかも。)

Lemma.

任意の滑らかな曲線 $\gamma : I \to M$ と始点 $x = \gamma(0)$ において、接空間 $T_x M$ の基底

\[
\{ e_1, e_2, \dots, e_n \}
\] を取ると、この基底を曲線 $\gamma$ に沿って平行移動して拡張した平行フレーム
\[
\{ e_1(t), e_2(t), \dots, e_n(t) \} \subset \Gamma(\gamma^* TM)
\] が存在し、一意的に定まる。すなわち、各ベクトル場は

\[
\nabla_{\dot{\gamma}(t)} e_i(t) = 0, \quad e_i(0) = e_i
\] を満たし、かつ $t$ に関して滑らかである。

[proof]

今、存在を保証した特別なフレーム、平行フレームに関する双対フレームの存在と成分表示について次のことが言える:
平行フレーム $\{ e_i(t) \}$ に対して、双対束 $\gamma^* T^* M$ 上に対応する双対フレーム
\[
\{ e^1(t), e^2(t), \dots, e^n(t) \}
\] が存在し、
\[
e^i(t)[e_j(t)] = \delta^i_j
\] を満たす。これを用いて、Levi-Civita接続を持つとは限らない、一般の$C^{\infty}$多様体に関して, 任意のベクトル場が次のように、平行フレームを用いて表示できる: 任意のベクトル場
\[
V(t) \in \Gamma(\gamma^* TM)
\] は一意的に
\[
V(t) = \sum_{i=1}^n V^i(t) e_i(t)
\] と表され、成分関数は
\[
V^i(t) := e^i(t)[V(t)] \] で定義される。また、成分関数の滑らかさについては、双対フレームが滑らかであるため、$V(t)$ が滑らかなベクトル場ならば各成分関数 $V^i(t)$ も滑らかな実数値関数である。

さて、本題に戻る.

平行移動は平行フレームにより定義されるので、
\[
{\Pi}_{p(t)}^{p(a)} E_i(t) = E_i(a)
\] が成り立つ。したがって
\[
\Pi_{p(t)}^{p(a)} Y_{p(t)} = \Pi_{p(t)}^{p(a)} \left( Y^i(t) E_i(t) \right) = Y^i(t) \Pi_{p(t)}^{p(a)} E_i(t) = Y^i(t) E_i(a).
\]

ここで、差分商の極限を計算すると、

\[
\begin{align}
\lim_{t \to a} \frac{1}{t – a} \bigl( \Pi_{p(t)}^{p(a)} Y_{p(t)} – Y_{p(a)} \bigr)
&= \lim_{t \to a} \frac{1}{t – a} \bigl( Y^i(t) E_i(a) – Y^i(a) E_i(a) \bigr) \\
&= \lim_{t \to a} \frac{Y^i(t) – Y^i(a)}{t – a} E_i(a) \\
&= \dot{Y}^i(a) E_i(a)
\end{align}
\]

ただし $\dot{Y}^i(a) := \frac{d}{dt} Y^i(t) \big|_{t=a}$ である。

一方、共変微分の定義を使って書き下すと、
\[
(\nabla_{\dot{p}(t)} Y)_{p(a)} = \left. \frac{D}{dt} \right|_{t=a} Y_{p(t)} = \left. \frac{D}{dt} \right|_{t=a} \left( Y^i(t) E_i(t) \right).
\]

接続の性質と平行フレームの定義から

\[
\left. \frac{D}{dt} \right|_{t=a} E_i(t) = \nabla_{\dot{p}(a)} E_i = 0,
\]

ゆえに
\[
(\nabla_{\dot{p}(t)} Y)_{p(a)} = \dot{Y}^i(a) E_i(a).
\]

以上より、

\[
\lim_{t \to a} \frac{1}{t – a} \left\{ \Pi_{p(t)}^{p(a)} Y_{p(t)} – Y_{p(a)} \right\} = (\nabla_{\dot{p}(t)} Y)_{p(a)}.
\] [/proof]

テンソル場

Definition.
多様体Mの各点$p$に対し, $p$における接空間$T_pM$上の$(r,s)$-Tensor $F_p$を対応させる対応$F=\{F_p\}_{p\in M}$のことを, $M$上のTensor 場という.
Definition.
$M$上のTensor 場の和と関数倍も、ベクトル場のときと同様に定義される。
\[
\begin{align}
(F+G)_p &=F_p + G_p \\
(fF)_p &=f(p)F_p
\end{align}
\]
Example.
$M$上で定義された$(0,2)$-Tensor場$g$であって, 各点$p\in M$で$g_p$が$T_pM$上の正定値対称双線形形式であるものを$M$のRiemannian metricという.
局所座標$(x^1,\ldots, x^n)$を用いて,
\[g=g_{i,j}dx^i\otimes dx^j\] とあらわすと, その成分
\[g_{ij}=g\left( \frac{\partial }{\partial x^i}, \frac{\partial }{\partial x^j}\right)\] は正定値対称行列となる. これは藤岡の情報幾何学で示したことと同じ。
Riemannian metric $g$が与えれたmfd $M$を Riemannian mfd $(M,g)$という.

Tensor っていうのは互いの次元に関して関与しないので、多重線形性をもつ.

Lemma.
$F$を$(r,s)$-Tensor 場とする. さらに, $i=1,\ldots, r$に対して, $\omega_i,\tilde{\omega_i}\in \mathcal{D}^{1}(M)$: $M$上の微分$1$-形式全体, $j=1,\ldots, s$に対して, $X_j,\tilde{X_j}\in \mathcal{X}(M)$とし, 定数$a,b\in \mathbb{R}$を任意に固定する. このとき, $i$番目の微分$1$-形式に関する線形性
\[
\begin{align}
&F(\omega_i,\ldots, (a\omega_i+b\tilde{\omega_i}),\ldots, \omega_r,X_1, \ldots, X_s) \\
&= aF(\omega_i,\ldots, \omega_i,\ldots, \omega_r,X_1, \ldots, X_s)\\
&+bF(\omega_i,\ldots,\tilde{\omega_i},\ldots, \omega_r,X_1, \ldots, X_s)
\end{align}
\] $j$番目のベクトル場に関する線形性
\[
\begin{align}
&F(\omega_i,\ldots,  \omega_r,X_1, \ldots,(aX_j+b\tilde{X_j}) ,\ldots, X_s) \\
&= aF(\omega_i,\ldots, \omega_i,\ldots, \omega_r,X_1,\ldots,X_j, \ldots, X_s)\\
&+bF(\omega_i,\ldots,\tilde{\omega_i},\ldots, \omega_r,X_1, \ldots,\tilde{X_j},\ldots, X_s)
\end{align}
\]

微分$1$-形式もベクトル場も結局点$p\in M$での挙動しかみてない

Proposition.

\[
\begin{align}
&F(f_1\omega_i,\ldots,  f_r\omega_r,g_1X_1, \ldots g_sX_s) \\
&= f_1(p)\cdots f_r(p)g_1(p)\cdots g_s(p)F(\omega_1,\ldots,\omega_r,X_1, \ldots, X_s)
\end{align}
\]

このような性質を$F$のテンソル性と呼ぶ. 微分形式とかベクトル場の値”そのもの”っていうのは、局所座標表示によらない。 なんで、次が成り立つ。

Theorem.
\[G \colon \mathcal{D}^{1}(M)\times \cdots \times \mathcal{D}^{1}(M) \times \mathcal{X} \times \cdots \times \mathcal{X} \to C^{\infty} \] という多重$C^{\infty}$-線形写像が任意に与えられているとする. (<- テンソル性をもってるということ ) このとき、局所座標によらずに, テンソル場全体が定まる.
$r=s=1$の場合を示す.
点$(U; (x^1,\ldots, x^n))$を取り, 一次微分形式$\omega$, ベクトル場$X$を
\[\omega = a_idx^i \quad X=v^i \frac{\partial }{\partial x^i}\] と局所座標する. 、もう一組$\tilde{\omega}, \tilde{X}$を用意して,
\[\tilde{\omega}= \tilde{a_i}dx^i \quad \tilde{X}=\tilde{v^i} \frac{\partial }{\partial x^i}\] $a_i, \tilde{a_i},v^i, \tilde{v^i} $は勿論 $C^{\infty}$関数.
更に, $p$で互いの値が一致していたとする.
このとき, テンソル性から,
\[
\begin{align}
&G(\omega, X)(p) \\
&=a_i(p)v^i(p)G(dx^, \frac{\partial }{\partial x^i} )(p)\\
&=\tilde{a_i}(p)\tilde{v_i}(p)G(dx^, \frac{\partial }{\partial x^i} )(p)\\
&=G(\tilde{\omega}, \tilde{X})(p)
\end{align}
\]

曲率テンソルの時に使う見方を観察する.

Remark.
$(1,s)$-Tensor field の別の見方を観察する.
線形空間$V$上の$(1,s)$-Tensor, つまり $(s+1)$重$\mathbb{R}$-線形写像
\[F\colon V^{*}\times V \times \cdots \times V \to \mathbb{R}\] は$s$-重$\mathbb{R}$-線形写像
\[ \tilde{F} \colon  V \times \cdots \times V \to  V \] と同一視できた。この事実と, 上記のTensor性から, 上の$(1,s)$-Tensor Field, i.e. $(s+1)$重$\mathcal{C}^{\infty}(M)$-線形写像
\[F\colon \mathcal{D}^{1}(M) \times \mathcal{X} \times \cdots \times \mathcal{X} \to\mathcal{C}^{\infty}(M)\]は、
\[ \tilde{F} \colon  \mathcal{X} \times \cdots \times \mathcal{X} \to \mathcal{X}\] と同一視できることになる.
各点$p\in M$で前半の普通の同一視の仕方を使って、テンソル性からわかる.
$(U; (x^1,\ldots, x^n))$を取り, 与えられたテンソル場
\[F= F^{i}_{j_1,\ldots, j_s} \frac{\partial }{\partial x^i} \otimes dx^{i_1}\otimes \cdots \otimes dx^{i_s}\] に対し, 後半の$ dx^{i_1}\otimes \cdots \otimes dx^{i_s}$にだけ基底ベクトル場を作用させて、最初のベクトル場だけを残しておく写像$\tilde{F}$:
\[
\begin{align}
&\tilde{F}(\frac{\partial }{\partial x^{k_1}}, \ldots, \frac{\partial }{\partial x^{k_s}}) \\
&= F^{i}_{j_1,\ldots, j_s} \frac{\partial}{\partial x^i} \frac{\partial x^{j_1}}{\partial x^{k_1}}, \ldots, \frac{\partial x^{j_s}}{\partial x^{k_s}} \\
&= F^{i}_{j_1,\ldots, j_s} \frac{\partial}{\partial x^i} \delta^{j_1}_{k_1} \cdots \delta^{j_s}_{k_s} \\
&= F^{i}_{k_1,\ldots, k_s} \frac{\partial}{\partial x^i}
\end{align}
\]

 

Berry-Essenの定理

Lecture Notes in STEIN’S METHOD Martin Raic のLecture ノートのSection 3.4あたりにStein Methodを使ったBerry-Essenの定理の証明が載っている。

Bayesの基本定理について

Bayesの基本定理
$\pi(\theta|x)=\frac{p(x|\theta)\pi(\theta)}{\int_{\Theta}p(x|\theta)d\theta}$

は、尤度関数(測度)と事前分布(測度)の直積測度$P$を周辺尤度$M(\cdot)=P(\Theta \times \cdot )$に関してdisintegrationを考えたものが事後分布と考えれば、厳密に導出できる。disintegrationiについてはKallenbergやBogachevを参照。
また、このロジックは、conditioning as disintegration (Cheng, Pollard)や SpringerのSchervish Theory of Statisticsを参照。

指数分布族

次のような指数分布族の特徴付けがある。(

BARNDORFF-NIELSEN, O., & PEDERSEN, K. (1968). SUFFICIENT DATA REDUCTION AND EXPONENTIAL FAMILIES. Mathematica Scandinavica, 22(1), 197–202. http://www.jstor.org/stable/24489736
Dudleyのopen course lectureにも書いてあったと思う。
EXPONENTIAL FAMILIES
AND
THEORETICAL INFERENCE
Bent Jørgensen Rodrigo Labouriau

)

Theorem

前提条件:

統計モデルが $(\mathcal{X}, \mathcal{A}, \mathcal{P})$ であり、$\mathcal{X}$ は $R^r$ 内の領域(開集合かつ連結集合)である

$\mathcal{A}$ は $\mathcal{X}$ のボレル$\sigma$代数である

確率測度のクラス $\mathcal{P}$ がルベーグ測度 $\lambda$ によって支配されている

$\mathcal{P}$ に属する各測度 $P$ の $\lambda$ に対する密度関数 $f_P$ が $\mathcal{X}$ 上で正である

$f_P$ が $\mathcal{X}$ 上で連続である

$k < n$ なる正の整数であり、$T$ が連続な $k$ 次元の統計量である

$T$ がモデル $(\mathcal{X}^{(n)}, \mathcal{A}^{(n)}, \mathcal{P}^{(n)})$ に対して $\varphi$-十分である

ここで**$\varphi$-十分性とは、結合確率密度関数が $T(x)$ の関数と $x$ の関数(パラメータに依存しない部分)の積に因数分解される際に、「空集合に関する制限なしに」**この因数分解が成り立つことを意味しまこれは、因数分解基準 (Fisher-Neyman Criterion) のより厳密な形式です。

 

 

このとき、次の結論が得られる。:

(i) もし $k=1$ ならば、$\mathcal{P}$ は1次の指数型分布族である。

(ii) もし密度関数 $f_P$ が $\mathcal{X}$ 上で連続な偏導関数を持つならば、$\mathcal{P}$ は $k$ 以下次の指数型分布族である。

 

 

命題 (i)’ の証明 (r=1の場合)

この命題は、「$k=1$ の場合、族 $\mathcal{P}$ は1次の指数型である」ことを証明します。証明は、主に以下のステップと補題を用いて行われます。

前提と定義:

まず、$S’ = S \cap C’$ と定義されます。ここで、$S$ は十分統計量 $T(x_1, \dots, x_n)$ の範囲であり、$C’$ は連続で一次の偏導関数を持つ実関数の空間です

証明の妥当性の根拠として、Denny (1964) を参照し、任意の $n>1$ に対して $\mathcal{X}^n$ 上の連続な実数値関数がほとんど至る所で1対1であること(almost everywhere 1-1)が述べられています

式 (3) の重要性: $\varphi(x_1) + \dots + \varphi(x_n) = \psi(T(x^{(n)}))$ という形式の式 (3) は、$S$ と $S’$ が $\mathcal{X}$ 上の定数関数を含むと仮定すると、それぞれ $V \subset S$ および $V \subset S’$ を意味します

補題1の提示と証明:

証明の鍵となるのが補題1です。この補題は、**「もし $\varphi(y_1) = \varphi(y_2)$ かつ $T(x_0, y_1) < T(x_0, y_2)$ ならば、$\varphi$ は $x_0$ の近傍で定数である」**と述べています

証明の詳細:

1.
まず、$\varphi(y_0)$ が絶対最小値または絶対最大値である場合が検討されます

2.
$\psi(t) = \min{\varphi(t) : t \in [t_1, t_2]}$ と定義されます

3.
$T$ の連続性と連結性を用いて、任意の $x_0 \in \mathcal{X}$ に対して $T(x_0, y_1) = t_1$ かつ $T(x_0, y_2) = t_2$ となる $y_1, y_2 \in \mathcal{X}$ が存在することが示されます

4.
さらに、$\varphi_1$ と $\varphi_2$ を $S$ の任意の要素とし、$\varphi_1$ が定数でないと仮定します。つまり、$\varphi_1(y_1) \neq \varphi_1(y_2)$ となる $y_1, y_2 \in \mathcal{X}$ が存在します

5.
このとき、任意の $x_0 \in \mathcal{X}$ に対して $T(x_0, y_1) + \varphi_1(y_1) = T(x_0, y_2) + \varphi_1(y_2)$ が成立します

6.
この関係から、$\varphi_2(y_1) – \varphi_1(y_1) = \varphi_2(y_2) – \varphi_1(y_2)$ が導かれ、これは関数 $\varphi_2 – \varphi_1$ が定数であることを意味します

7.
この定数性が、補題1の結論、すなわち $\varphi$ が $x_0$ の近傍で定数である、という結果を導きます

結論: 補題1が証明されることで、命題 (i)’、すなわち $k=1$ の場合に $\text{dim } S’ \le 1+1=2$ となることが示唆されます

命題 (ii)’ の証明 (r=1の場合)

この命題は、「密度関数 $f_P$ が連続な偏導関数を持つ場合、族 $\mathcal{P}$ は $k$ 次以下の指数型である」ことを証明します。証明は帰納法によって行われます

基本ケース: $n=1$ の場合は明らかに真であるとされています

写像とヤコビアン:

証明は、写像 $\Phi: x^{(n)} \to (\varphi_1(x_1), \dots, \varphi_n(x_n))$ を考慮することから始まります。ここで、$x^{(n)} = (x_1, \dots, x_n) \in \mathcal{X}^n$ です

この写像のヤコビアン $J: x^{(n)} \to \det J(x^{(n)})$ が導入されます。ヤコビアンは、$\frac{\partial (\varphi_1, \dots, \varphi_n)}{\partial (x_1, \dots, x_n)}$ の行列式です

もしヤコビアンの決定式 $\det J(x^{(n)})$ が非ゼロであれば、関数 $1, \varphi_1, \dots, \varphi_n$ は線形独立であると述べられています

帰納的仮定と矛盾の導出:

証明は、「$k+1 < n$ であり、かつ $\text{dim } S’ > k+1$ である」と仮定し、この仮定の下で、少なくとも $n=k+1$ の場合には、線形独立な関数 $\varphi_1, \dots, \varphi_n$ が存在すると説明されています

$\text{dim } S’ > k+1$ であるという仮定の下では、$n=k+1$ となるような $\varphi_1, \dots, \varphi_{k+1}$ が存在し、これらが線形独立であるとされています

もし十分統計量 $T$ がその近傍で1対1であるならば、この仮定は矛盾を引き起こします。この矛盾によって、$S’$ の次元が $k+1$ を超えないことが示されます

任意の次元 $r$ への一般化

文書の後半では、上記の命題 (i) と (ii) の結果を、任意の次元 $r$ に一般化する方法が議論されています

依存関係: この一般化は、空間 $\mathcal{X}, S, S’$ が次元 $r$ に依存することを明示的に考慮しています

写像とハイパープレーン:

$r>1$ の場合に、写像 $\xi \to (\hat{\varphi}1(\xi), \dots, \hat{\varphi}{k+1}(\xi))$ が用いられます。ここで、$\xi = (\xi_1, \dots, \xi_r) \in \mathcal{X}_r$ です

この写像が、$\mathbb{R}^{k+1}$ のハイパープレーン(超平面)に含まれることが示されます。ハイパープレーンは、一次独立な関数が $k+1$ 個あるならば、それらの線形結合で表される空間です。

結論と矛盾:

もし $\text{dim } S’ > k+1$ であるならば、この写像はハイパープレーンに含まれることになります

しかしこれは、$r=1$ の場合にすでに確立された命題 (i) と (ii) の妥当性($\text{dim } S’ \le k+1$)と矛盾すると結論付けられています

この矛盾により、任意の次元 $r$ においても $\text{dim } S’ \le k+1$ であることが示唆されます

——————————————————————————–

 

 

 

 

7月-10月日記

ダイクストラのアルゴリズムっていう、グラフ探索のアルゴリズムを知った。

行列の積に関してのStrassenのアルゴリズムっていうのを知った。なんかレーザー法とかいうのを使うと、早くなるらしい。素のStrassenのアルゴリズムだと、N^{2.83…}くらいのオーダーだけど、レーザー法やいろんなパワーでN^{2.37…}

くらいまで早くできるらしい。(工学の人:サンプル1が言うには、疎行列別に使うし、、、って言ってきたので、ロマンがわかってないっすね。) ちなみに, AとBの積の計算をいったん別の行列の列$P_{1},\;dots, P_{7}$で表してそれの加除で求めたいABを得るんだけど、その一端別の行列の列が$7$個未満にできないことが、代数幾何のスキーム論から示せる?らしい。

( Segre produt ってなんだよ!(;・∀・))

LeetCodeっていうコーディングのサイト知った。

Differential Topology by Morris Hirsch

Let 1< r < 0. Every $C^r$ manifold is $C^r$ diffeomorphic to a $C^{\infty}$ manifold. であることが Hurch p.52 Theorem 2.10にあることを思い出した。

[9月]https://community.openai.com/t/does-the-tokenizer-https-platform-openai-com-tokenizer-not-handle-whitespace-correctly/340718/2 や 特に、ここにgpt4_vocab_listがあっておもしろいね\(^o^)/  トークナイザーで分割されたトークンが含まれるヴォキャブラリーがgit hubにはってあるやつ(一例)

Git のリポジトリを作る際に .gitignore の内容をどうするかは悩みどころだが(大抵は他所からコピってくるのだが), gibo というツールを使えば .gitignore のひな型をいい感じに生成してくれる。

らしい。

9/28:読んでる教科書がwindows準拠なので、windows環境でTableauを始めてみた。

10/6:

【2024年最新版】Spring Boot Initializrマスターガイド:初心者からプロまで使いこなす7つの極意

:Spring Bootの開発環境を一気に作れるから便利。

./gradlew bootRun --info 

しか勝たん!

企業会計基準第 29 号 収益認識に関する会計基準の存在をちゃんと認識した。

改正企業会計基準第29号「収益認識に関する会計基準」等の公表

 

[2019年5月31日より、公共交通オープンデータセンターの運用を開始しました。](https://www.odpt.org/)
ほーん。
[全国の直轄国道の交通量データを取得可能なAPI を公開開始します
~xROADクロスロード の取組として、道路関係データのオープン化を推進~
令和7年5月12日](https://www.mlit.go.jp/report/press/road01_hh_001930.html)

10/16: Pumlや数理統計のシミュレーションしてる人のはてなブログを見つけた。
(とくにpuml :UMLを練習する、アクティビティー図 ベータ版-15
ロジスティック回帰のまとめ・その1

Macにおいてcommand + ドラッグで、右上のアイコンの位置変えられる(あと消せる)

 

TeXでT勘定を書くためのtips

 

10/17: Program#3: Smith標準形(単因子標準形)を求めるプログラム
を見た。

 

MKDocs: Python製のドキュメントサイトジェネレータ puml, mermaidに使える。

[この記事では、GitHub Actionsを用いたドキュメントの作成からGitHub pagesでの公開までの自動化も含めて、mkdocsとGitHub Actionsについてまとめています](https://taxintt.hatenablog.com/entry/2020/06/07/225215)

Levy-Ito-Nishioの補題について

なんかブラウン運動を構成するところの章とか見ると、多分舟木とかカラザスーシュリーヴとかはハール関数を使って構成しててどっかに(あれかな?重川確率解析かな?忘れた)Ito-Nishioの補題っていうのがあって、それ使うと、一般の正規直交基底でもいいよ っていうのが分かるのがあるので、ここで紹介しておきます。この定理を使って、イキリンコからのブリジュラスで優勝してください。

Bは実可分Banach sp.とし, $\{X_n\}_{n\geq 1}$を独立な対称的な$B$-値確率変数の列とする。また, $S_n = \sum_{j=1}^n X_j$とする.
Theorem. 次の主張は全て同値である:
$\{S_n\}_{n\in \mathbb{N}}$はB-値確率変数$S$にa.s.収束する.
$\{S_n\}_{n\in \mathbb{N}}$はB-値確率変数$S$にprob. 収束する.
$\mu_n$を$S_n$に関する確率分布とする。この時, 分布収束の意味で$\mu_n {\to} \mu $するような$B$上の確率測度が存在する(唯一とは限らない.).
任意の$f\in B^{*}$に対して,
\[
\int_{S} \exp\{i(f,x)\}d\mu_n \to \int_{S} \exp\{i(f,x)\}d\mu
\]
が成立する. ただし, $(f,x)$は$x\in B$での$f$の値を意味する.
(証明)Banach-Mazurの定理から, Bは$C([0,1])$内の或る閉部分空間に等長同型であることがわかる。ただし, $C([0,1])$は, $\sup$-normを備えた$[0,1]$上の連続関数の空間である. $B$をこのように表現する.

(1)ならば(2)は確率論の基礎で示す場合と全く同じである.

$\mu$ は$C([0,1])$上の確率速度とする.

A random variable X with values in B is called symmetric if X and – X have the same distribution. Equivalently, X has the same distribution as c:X where c: denotes a symmetric Bernoulli or Rademacher random variable taking values ±1 with probability 1/2 which is independent of X. (Although the name of Bernoulli is historically more appropriate, we will speak of Rademacher variables since this is the most commonly used terminology in the field.)

Xが対称的なのは、XとーXの分布が一致すること。

A random process $X = (X_t)_{t\in T}$ defined on $(\Omega, A, P)$ is said to be separable if there exist a negligible set $N \subset \Omega$ and a countable set $S$ in $T$ such that, for every $\omega \notin N$, every $t in T$ and $\varepsilon > 0$,
$X_t(\omega) \in \overline{\{Xs(\omega); s \in S, d(s, t) < c\} } $where the closure is taken in $\mathbb{R} \cup \{\infty\}$.

Proposition 2.3. Let $(X_i)$ be a symmetric sequence of random variables with values in B. For every k, set $S_k =\sum_{i=1}^{k}X_i$. Then, for every integer $N$ and every $t > 0$, (2.6)
and
(2.7)
If $(S_k)$ converges in probability to $S$, the inequalities extend to the limit as $P\{\sup ||Sk|| > t\} \leq  2P\{||S|| > t\}$
and similarly for (2.7). As a consequence of Proposition 2.3, note also that by integration by parts, for every $0 < p < \infty$,
$E\max_{k\leq N} ||S_k||^p  \leq 2 E||S_N||^p$.
and similarly with $X_k$ instead of $S_k$.
(Proof)
We only detail (2.6), (2.7) being established exactly in the same way.
Let $\tau = \inf\{k \leq  N ; ||S_k|| > t\}. We have
$P\{IIS_NII > t\} = \sum_{k=1}^N \{IIS_NII > t, \tau = k\}.$

Now, since, for every k, $(X_l, … ,X_k,-X_{k+1}, … ,-X_N) $has the same distribution as $(X_1, … ,X_N)$, and ${\tau = k}$ only depends on $X_1, … ,X_k$, we also have that
$P\{||S_N|| > t\} = \sum_{k=1}^N P\{||S_k – R_k||> t, \tau = k\} $
where $R_k = S_N – S_k$, $k \leq N$. Using the triangle inequality
$2||S_k||\leq ||S_k + R_k||+ ||S_k – R_k|| = ||S_N|| + ||S_k-R_k||$
Then, summing the two preceding probabilities yields
$ 2P\{||S_N|| > t\} \geq \sum_{i=1}^{k} P{\tau = k} = P\{\max_{k\geq N} ||Sk|| > t\} . k=1 -$
The proof of Proposition 2.3 is complete.

Choquet-Denyの定理について

abelian topological (Hausdorff) semi-group (アーベル位相半群)上の確率速度についても、Choquet-Denyの定理が成り立つらしい。
Szekey, Zeng や PrunaruのA short proof of a Choquet-Deny theorem for abelian topological semigroups にある.

Theorem .  Let \( (S, +) \) be an abelian topological (Hausdorff) semigroup and let \( \mu \) be a regular Borel probability measure on \( S \). Suppose that \( h : S \to \mathbb{C} \) is a bounded Borel measurable function such that

\[
h(x) = \int_S h(x + y) \, \mu(dy) \quad \text{for all} \, x \in S.
\]

Then, for each \( x \in S \), \( h(x) = h(x + y) \) for \( \mu \)-almost all \( y \in S \).