tanh(x/xi)ベースの擬連続論理ゲート・比較演算子ライブラリ
Project description
kappalogic (v0.35)
v0.30で、命題11・13・15を1つの一般理論(「NOT合成塔」)に統合できた (命題16)。ユーザーが当初から目指していた「統一理論」に、現時点で 一番近い成果だと思う。
v0.23で、v0.13から続いていたTODOの本丸(OR_nのnaive fold-vs-fuse 一致条件)に、閉じた形の十分条件と定量的な誤差上界を与えることが できた(命題10、下の節参照)。
PyPIに公開済み: pip install kappalogic(パッケージング・公開作業は
ユーザー側で管理。このリポジトリ側は変更不要)。
kappa(x/ξ)(デフォルトはtanh、erf/algebraicにも切り替え可能)を
基本ブロックにして、離散的な論理演算・比較演算・場合分けを「実数上の
滑らかな式」として書き直すためのライブラリ。
v0.13からkappa(x/xi)をk(x)と書けるようになった(sgnの完全な別名。
from kappalogic import k でそのまま使える)。v0.14では、TODO.mdの
「ゲージ理論的発想」(ξの局所/大域変換)に着手し、並進・ディレーション
がアフィン群Aff(1,R)("ax+b group")のリー環をなし、かつ(x,ξ)半平面上の
双曲計量のキリングベクトル場に一致する、という構造を発見・検証した
(gauge.py)。v0.15では、その構造とAND/OR系の命題4(勾配の非対称性)
を橋渡しする命題5をtheory.pyに追加した。v0.16では、AND_n融合の
安全条件(命題3)に実は反例があることを発見・修正し、定量的な誤差上界
n*4*exp(-2C)を導出・検証した(下の節参照)。
開発の経緯・迷った点・見つけたことの詳しい記録は dev_notes.md を参照
(こちらは要約と現状の参照用)。今後の研究方向は TODO.md にまとめてある。
pip install -e .
構成
| モジュール | 内容 |
|---|---|
core.py |
sgn/reg/AND/OR/XOR/比較演算子など基本ゲート、n項融合版AND_n/OR_n |
funcs.py |
int/par(整数・奇偶判定)、max/min/clamp、mod演算子・ディラックのデルタ函数近似(v0.21新規) |
kernels.py |
tanh/erf/algebraicカーネルの切り替え |
applications.py |
クロネッカーのデルタ、コラッツ漸化式、板チョコのPoisson源項 |
heat.py |
ξと拡散時間tの対応、熱核によるソフトな一致度報酬 |
search.py |
勾配ベース探索専用の"softモード"とアニーリング解法(anneal_solve, l2_penalty, find_dont_care_variables) |
quantum_well.py |
有限区間の熱核・無限井戸型ポテンシャルの量子プロパゲータ(鏡像法) |
field_theory.py |
φ^4理論のキンクソリトン(sgnが厳密解であることの証明付き) |
stat_mech.py |
熱核による分配関数、SUSY QMのWitten指数(McKean-Singer型) |
info_theory.py |
de Bruijnの恒等式(熱拡散のエントロピー変化率とフィッシャー情報量) |
topology.py |
モース理論によるオイラー標数の計算 |
spacetime.py |
光円錐の指示関数 |
bridge.py |
Σ(離散和)と∫(連続積分)の橋渡し、階乗とΓ関数、離散積Πの橋渡し(v0.35新規) |
electronic_structure.py |
フェルミ・ディラック占有数=sgn(x,2kT)、DFTの電子スメアリング |
theory.py |
reg/AND/OR系の勾配構造の厳密な命題群(証明付き。命題1〜6、v0.16でAND側のバグ修正、v0.17でOR側の対数スケール則を追加) |
identities.py |
k(x)=tanh(x/xi)が満たす加法定理・n倍角公式・連分数・部分分数展開・無限積・Gudermannian函数(kernel="tanh"限定、v0.13新規)、積分形(v0.22新規) |
gauge.py |
ξの大域/局所変換の生成子・交換子・アフィン群構造・(x,ξ)半平面のキリングベクトル場・測地線の保存量・局所ゲージ接続(v0.14新規) |
dynamics.py |
強引に埋め込んだ不動点でのKoenigs座標・アベル関数・連続反復(分数反復)の構成 |
torch_backend.py |
PyTorchによるautograd版のk/reg/AND/OR等(オプション依存、pip install kappalogic[torch]。v0.18新規) |
examples/ |
実行できるデモ4本 |
使用例
from kappalogic import gt, AND, par, collatz_sequence, choc_bar_source
from kappalogic import xi_of_time, heat_step_profile, anneal_solve, soft_gt, l2_penalty
from kappalogic import kink_profile, kink_energy_exact, fermi_occupation
from kappalogic import sgn, k, rapidity, addition, or_gradient_closed_form
gt(5, 3) # 1.0
kink_energy_exact(xi=1.0) # 4/3 (ソリトンの厳密な質量)
fermi_occupation(eps=0.3, mu=0.5, kT=0.1) # フェルミ・ディラック分布と機械精度で一致
k(5) == sgn(5) # True (kはsgnの別名。kernel="tanh"限定の恒等式群はkを前提にする)
rapidity(1.0, xi=0.5) # (1+k(x))/(1-k(x)) = exp(2x/xi)
検証済みの主な結果
v0.1で見つかった原案のバグ3件(修正済み、回帰テストあり)
(A>B),(A<B):reg()が符号を2乗で消すため、実際には(A≠B)と同じ値になっていたpar(x): 偶数で-1を返していた(int(x)-int(x/2)に修正)- コラッツ漸化式: 「ステップ番号の偶奇」でなく「値自体の偶奇」で分岐するよう修正
v0.16で見つかった命題3のバグ(修正済み、回帰テストあり)
- 当初(v0.7)の命題3・
fusion_is_safeは「畳み込みの部分積s_kが 全部Cxiを超えれば安全」と主張していたが、これは誤りだった。 反例:values=[100,100,0.01,50](xi=1,C=3)は部分積が全部 Cxiを超えるため「安全」と判定されるが、実際は naive_fold≈2.5e-5, AND_n(融合版)=1.0とほぼ正反対の値になる (乱数2万試行では、旧条件が「安全」と判定したケースの約12%で 実際には不一致が起きていた。Cを3→5→8と大きくしても改善しない 構造的なバグだった)。正しい条件は「個々の値a_1,...,anが 全部C*xiを超える」ことであり、この修正版では乱数検証で不一致が 1件も見つからなかった。加えて|naive_fold-AND_n| <= n*4*exp(-2C)という定量的な誤差上界も導出・検証した(fusion_error_bound)。 経緯はdev_notes.md v0.16参照。
検証済みの技術的な発見
kernel="erf"が階段状初期条件の熱拡散の厳密解と一致(有限差分と誤差5.7e-5)- 有限区間の熱核・無限井戸型ポテンシャルの量子プロパゲータが鏡像法+εプリスクリプションで固有関数展開と機械精度(diff~1e-13)で一致
- SUSY QMのWitten指数がβ=0.01〜10で厳密に1.000000(McKean-Singer型)
- de Bruijnの恒等式(熱拡散のエントロピー変化率=フィッシャー情報量)が誤差1e-10で一致
- モース理論によるオイラー標数がトーラス(0)・球面(2)で教科書通り
- フェルミ・ディラック分布が
sgn(x,2kT)と機械精度で一致(DFTの電子スメアリングと同一構造) - Σ_{n=0}^N n! と∫_0^{N+1}(floor(x))!dxが相対誤差6e-5で一致
- キンクソリトン
tanh(x/ξ)がφ^4理論のEOMを厳密に(sympyの記号微分で)満たし、厳密エネルギーE=4/(3ξ)を導出 AND_n融合とnaive foldの不一致は「個々の値がξと同スケールになったとき」に起きることを確認し、|naive_fold-AND_n| <= n*4*exp(-2C)という誤差上界を導出・検証した(fusion_is_safe,fusion_error_bound、v0.16で条件を修正)OR(a,b;ξ)は、a,bが両方とも非ゼロなのに広い範囲で誤って0(偽)を返してしまうことを発見し、その誤分類境界がu+v=(1/2)ln(1/ξ)+K(u=a/ξ,v=b/ξ)という対数閾値の直線に収束することを閉形式で導出・検証した(v0.19、or_misclassification_boundary_sum)- L2正則化で0に張り付く"don't care"変数を、符号反転に対する充足度の不変性で検出できる(
find_dont_care_variables、誤検出なしを確認) - 自然には不動点を持たない場所に
gaussian_matchで不動点を強引に埋め込み、Koenigsの関数方程式・アベルの関数方程式を相対誤差1e-6〜1e-11で構成(force_fixed_point,abel_function) - アベル関数から連続反復(分数反復)
g^t(x)を構成し、半反復を2回合成すると元の写像に一致(diff~1e-9)、分数反復の加法性も確認(fractional_iterate)
v0.13: k(x)=tanh(x/ξ)の恒等式集(identities.py)
「既存の激ムズ離散問題を、同値性・保存量を保ったままkappalogicで
連続化し、用意した公式で簡略化・高速化して、あとは解析学の
既存手法に丸投げする」という方針(コラッツ予想やP対NP問題のような
難問を、運が良ければ1つでも解ければ勝ち、という位置づけ)のための
"道具箱"として、tanhが双曲線関数であることから出てくる古典的な
恒等式を整理・数値検証した。すべてkernel="tanh"のときにしか
成り立たない(erf/algebraicカーネルには一般には拡張されない。
テストのtest_identities_are_specific_to_tanh_kernelで明示的に
反例を確認済み)。
| 恒等式 | 式 | 検証結果 |
|---|---|---|
| ラピディティ(Cayley)恒等式 | (1+k(x))/(1-k(x)) = exp(2x/ξ) |
相対誤差 ~1e-13(機械精度) |
| 加法定理 | k(x+y) = (k(x)+k(y))/(1+k(x)k(y)) |
絶対誤差 ~1e-13 |
| n倍角公式 | k(nx) = ((1+k)^n-(1-k)^n)/((1+k)^n+(1-k)^n) |
n=2,3,5,7,11で機械精度 |
| Lambertの連分数(1768年) | 四則演算のみでk(x)を再構成 | depth=10で誤差<2e-9 |
| Mittag-Leffler展開(極の和) | tanhの極(松原振動数と同型)を全部足す | N=1e5項で誤差~1e-5(収束は遅い) |
| Weierstrass無限積 | 同じ零点・極を掛け合わせる双対表現 | N=1000項で誤差~1e-6 |
| Gudermannian函数 | k(x) = sin(gd(x/ξ)) |
誤差0(完全一致) |
誠実な評価: これらはいずれも数学的に既知(tanhが三角関数の
双曲線版であることの帰結、Lambertの連分数は1768年のπの無理数性の
証明そのもの)。新発見ではない。ここでの作業は「kappalogicの
k(x)という書き方に翻訳し、実際に手を動かして数値検証し、
ライブラリの他の部分(フェルミ・ディラック分布=松原振動数の構造、
"algebraic"カーネル=連分数の設計思想との類似)との接続点を整理した
こと」に限られる。加法定理・n倍角公式をAND_n/OR_nの融合処理に
直接転用できるかは未検証(今後の課題、TODO.md参照)。
v0.13: OR系の証明の空白地帯(theory.py命題4)
theory.pyの命題1〜3はいずれもAND系だけを扱っており、OR系には
対応する命題が存在しなかった。実際にAND/ORの勾配地形を比較すると、
質的に違う挙動が観測された(gradient_landscape_statsで再現可能。
ξ=1e-3、a,bをξの±8倍の範囲でサンプリング、5万〜20万件):
| 指標 | AND | OR |
|---|---|---|
| 勾配がほぼ0(<1e-3)になる割合 | ~6% | ~53% |
| 観測された最大勾配 | ~1.0 | ~1000超 |
導出した閉形式(or_gradient_closed_form、数値微分との中央値相対誤差
~2.6e-6で一致):
p := (1-reg(a))(1-reg(b))
d/da OR(a,b) = reg'(a) * (1-reg(b)) * reg'(p)
命題1の「reg'(x)はx=x*≈0.658ξ付近でしか大きくならない鋭いバンプ
関数」という性質が、この式には**"a"と"p(a,bの合成量)"という2つの
独立な引数に掛け算の形で登場する。つまりOR(a,b)の勾配が有効に
効くには「aがx付近」かつ「pもx付近」という2つの共鳴条件を同時に
満たす**必要がある(ANDの勾配b*reg'(ab)は共鳴条件が1つだけ)。
この「共鳴条件が1個 vs 2個」という違いが、上の表の非対称性の
構造的な理由になっている。
さらに、この違いはfold/fuseの不一致の"質"にも表れる。AND_nの
不一致(命題3)は基本的に「ぼやけ」だが、OR_nの不一致は勾配地形が
「ほぼ平坦、局所的に激烈」という二値的な構造をしているせいで、
naive foldとOR_n(融合版)が0/1のように正反対に割れることがある
(or_fusion_disagreement_rate、7項・乱数2万試行でOR側は0.2%前後の
頻度で発生、AND側は同条件で発生ゼロ)。
正直な限界: 閉形式そのものは数値検証込みで確信を持って正しいと 言えるが、命題3のような「n項版の安全条件(単純な閾値1つで判定できる 指標)」にはまだ落とし込めていない。ORの条件は「aとp」という異なる スケールにまたがるため、命題3の"部分積"のような単純な指標には 収まらない可能性が高い。文献調査はしていないので新規性の断定は 避けるが、少なくとも本ライブラリのソース上にはこれまで記載されて いなかった具体的な観察と、それを説明する検証済みの式である。
v0.14: ξの局所/大域変換とゲージ理論的構造(gauge.py)
TODO.mdのA項「局所的なξ変換」「大域的なξ変換」「交換子」「リー群」 「保存量」「キリングベクトル場」を、実際に手を動かして(sympyで 記号的に、scipyで数値的に)全部検証した。結論から言うと、 「並進」と「ξのディレーション」という2つの操作は、 アフィン群Aff(1,R)="ax+b group"のリー環をなし、これは(x,ξ)を 座標とする半平面上の双曲計量のキリングベクトル場と厳密に一致する。
1. 大域的ξ変換の正体
k(x; λξ) = k(x/λ; ξ) が厳密に成り立つ(機械精度で確認)。つまり
「ξをλ倍する」ことと「xを1/λ倍する」ことは同一の操作である。
無限小生成子で見ると、ξ→e^θξの生成子(d/dθ|_0)は、xのディレーション
生成子 X=x·d/dx のちょうどマイナスに一致する(数値微分で確認、
誤差~1e-6)。
2. 交換子とリー環
並進 T=d/dx とディレーション D=x·d/dx の交換子は
[D, T] = -T
これはまさにアフィン群Aff(1,R) = {x → a·x+b : a>0}(通称
"ax+b group")のリー環 aff(1) の定義関係そのもの(sympyで記号的に
確認、厳密に-1)。この群は2次元・非可換・可解で、実は連続ウェーブレット
変換の対称性としても知られる標準的な群(ウェーブレット変換は
「位置(並進)・スケール(ディレーション)」で母関数を動かして作るが、
これはkappalogicのk((x-x0)/ξ)という(位置x0、スケールξ)の
パラメータ化と全く同じ構造)。
3. キリングベクトル場と保存量
(x, ξ)を座標とする上半平面(ξ>0)に、双曲計量
ds^2 = (dx^2 + dξ^2) / ξ^2
を入れると、並進V1=d/dxとディレーションV2=x·d/dx+ξ·d/dξは どちらもこの計量のキリングベクトル場(リー微分L_Vg=0)になる ことをsympyで確認した(零行列に厳密一致)。さらにこの半平面上の 測地線を数値積分すると、キリングベクトル場に対応する「運動量」 p1=g(V1,γ'), p2=g(V2,γ')が、標準的なネーターの定理どおり測地線に 沿って厳密に保存することを確認した(標準偏差~1e-15、機械精度)。
この双曲計量+アフィン群という組み合わせは、実は物理でよく知られた 構造そのもの:上半平面のアフィン部分群(Aff(1,R)_+)はPSL(2,R)の 「ボレル部分群」であり、AdS2/CFT1のようなホログラフィックな 繰り込み群(RG)フローの言語(境界座標=x、RGスケール=ξ)とも 自然に対応する。これはTODO.md C項「ξの意味論を統一する」への 一つの答えの候補になる: ξ = RGスケール、x = 境界(理論の)座標、 という解釈。
4. 局所ξ変換とゲージ接続
ξを場ξ(x)にする(位置ごとに変える)と、φ(x):=x/ξ(x)の微分は
φ'(x) = (1/ξ(x)) * (1 - x·A(x)), A(x) := (log ξ(x))'(x)
と書ける。ゲージ変換ξ(x)→λ(x)ξ(x)の下でA(x)は
A(x) → A(x) + (log λ(x))'(x)
と、通常のU(1)ゲージ場(電磁場のA_μ→A_μ+∂_μα)と全く同じ 「完全微分だけずれる」変換則に従う(sympyで確認)。つまり 「ξを局所化すると、微分を辻褄合わせするための接続場A(x)が自然に 必要になる」という、ゲージ理論の基本発想がそのまま成り立つ。
正直な評価
上記の構造(アフィン群、双曲計量とそのキリングベクトル場、 局所化で現れる接続場)はすべて数学的には古典的である (双曲幾何の教科書、ウェーブレット変換の表現論、Weyl変換/dilaton 場の物理でそれぞれ独立に知られている)。ここでの新規性は、 kappalogicの「位置x・スケールξ」というパラメータ化が、これら 3つの古典的構造の具体例になっていることを実際に手を動かして 確認し、TODO.mdの疑問(交換子は?リー群をなすか?保存量は? キリングベクトル場は?)に全部具体的な答えを与えたことに限られる。 「新しい定理」と呼べるレベルの主張はまだできていない ——測地線の保存量が、AND/OR/勾配消失といったkappalogic自身の "論理ゲート"の挙動と具体的にどう結びつくかは、今回はまだ 繋げられていない(次にやるとしたら、ここが本丸)。
v0.15: gauge.pyとtheory.pyの橋渡し(命題5)
v0.14のgauge.pyで見つけた「大域的ディレーション不変性」
k(x;λξ)=k(x/λ;ξ)が、命題4(ORの二重共鳴)をもう一段深く説明する。
AND(a,b;ξ) = reg(a*b;ξ) = tanh(a*b/ξ)^2 は a*b/ξという
単一の比だけの関数である。したがって
AND(λ*a, b; λ*ξ) = AND(a, b; ξ)
が全てのλ>0で厳密に成り立つ(sympyで確認)。一方
OR(a,b;ξ) = NOT(NOT(a;ξ)*NOT(b;ξ);ξ) は、aとbをそれぞれ別々に
tanhへ通してから合成する構造のため、単一の比には還元できず、
OR(λ*a,b;λ*ξ) ≠ OR(a,b;ξ) が一般に成り立つ(具体例:
a=1.3,b=-0.8,ξ=0.37,λ=2.7でOR(a,b;ξ)=0.99999976 →
OR(λa,b;λξ)=0.99999608と値が変わる)。
つまり命題4の「AND=共鳴条件1個、OR=共鳴条件2個」という 非対称性は、「ANDは1変数(a*b/ξ)に還元できるが、ORは2変数 (a/ξ, b/ξ)を本質的に必要とする」というより根本的な事実の帰結、 と理解できる。これ自体は定義から追える事実の言い換えに過ぎず 新しい定理ではないが、v0.14で「gauge.pyの構造とtheory.pyの命題4の 橋渡しがまだない」と明記していた穴に、部分的な橋を架けられた。
v0.16: 命題3(AND_n融合の安全条件)の反例と修正
v0.7時点の命題3は誤りだった。 当初の主張は「畳み込みの "部分積" s_k=a1*...ak が全部Cξを超えれば、naive foldと AND_n(融合版)が一致する」というものだったが、次の反例が見つかった:
values = [100, 100, 0.01, 50] (ξ=1, C=3)
部分積 s_k = [100, 10000, 100, 5000] ← 全部 C*ξ=3 を超える → 「安全」と誤判定
naive_fold ≈ 2.5e-5
AND_n(融合版) = 1.0 ← ほぼ正反対の値
乱数2万試行で検証したところ、旧条件が「安全」と判定したケースの **約12%**で実際には不一致(gap>0.1)が起きていた。しかもこの12% という失敗率はC=3,5,8のどれでも変わらない——Cを大きくしても 直らない構造的な誤りだった。
原因: naive foldはacc_k = reg(acc_{k-1}*a_k)という漸化式。
acc_{k-1}が一度reg()を通ると値域は[0,1)に飽和し、それ以前の
部分積の大きさの情報は失われる。次段の結果は実質的に
reg(a_k)程度で決まるので、「部分積が大きいか」ではなく
**「直近の個々の値a_kが大きいか」**が本質だった。
修正後の正しい条件: 個々の値 a_1,...,a_n がすべて
|a_k| > C*ξ を満たすこと(部分積ではなく個別の値についての条件)。
この修正条件下では乱数検証(n=3〜100、C=3,5,8,10)で不一致が
1件も見つからなかった。さらに定量的な誤差上界も導出・検証した:
|naive_fold - AND_n(融合版)| <= n * 4*exp(-2C)
(導出: 1-reg(x) <= 4*exp(-2*x/ξ) (x>0側、命題1のreg'の話と同根の
指数飽和)。各段でこの未飽和度が高々4exp(-2C)ずつ新たに混入すると
考えるとn段でn*4exp(-2C)という上界になる。乱数検証では実際の
gapは常にこの上界の1/3以下に収まっていた。fusion_error_bound参照)。
この修正は、外部のAI相談者からの「経験則(99.95%)を、厳密な 不等式の証明に格上げできないか」という指摘がきっかけになった。 実際に手を動かして確認したところ、格上げする前に土台の条件式 自体に反例があることが先に見つかった形になる。指摘は正しかったが、 想定と違う場所に穴があった。
v0.17: ORの"第二共鳴"は対数補正つきでスケールする(命題6)
命題4で、OR(a,b)の勾配が効くには (i) aがx*=ξ·u付近、 (ii) p=(1-reg(a))(1-reg(b))もx付近、という2条件が同時に要る ことを見た。ここでaをc·ξ(c=a/ξは固定した定数)に固定したとき、 「(ii)を満たすために必要なbの位置」がξとともにどうスケールするか を調べた。
素朴には「x*=ξ·uと同じくbもO(ξ)だろう」と予想したくなるが、 実際にはbはO(ξ)ではなく、O(ξ·log(1/ξ))というよりゆっくり 減衰する形になる。d/db[NOT(b)·reg'(p)]=0を解くと、 b=v*·ξ(v*=b*/ξ)は、ξ→0の漸近極限で
v* = -(1/2)·ln(ξ) - (1/2)·ln(w0 / (4·(1-tanh(c)²)))
という閉形式に厳密に収束する。ここでw0は
tanh(w) + w·(1-3·tanh(w)²) = 0 の(u*より大きい側の)唯一解
w0 ≈ 1.0095565499という普遍定数(cによらない)。
対数係数「-1/2·ln(ξ)」の部分はcの値に依らず常に厳密に1/2
であること(c=0.3, u*, 1.0, 2.0の4通りで確認)、そして定数項は
上の式でcに依存して決まることを、数値的に確認した(ξ=1e-4〜1e-8で
実際の最適点をグリッド探索し、閉形式との差が1e-5〜1e-9のオーダーで
ξ→0とともに縮むことを確認、or_second_resonance_locationと
or_second_resonance_numeric_argmax参照)。
つまりAND側の唯一の共鳴点x*=ξ·u*が正確にξに比例するのに対し、 OR側の"第二の"共鳴点はξ·log(1/ξ)という対数補正つきでしかスケール しない——これは命題4の非対称性に、これまで知られていなかった 定量的な次元をもう一つ加える発見。
正直な限界: この閉形式はξ→0の漸近極限で導出したもので、有限のξ では(数値検証の通り)小さいがゼロでない誤差がある。cを固定した ときの話であり、a自体を動かした場合の(a,b)平面全体の"危険領域"の 形はまだ描けていない。
v0.18: PyTorchによる高速化(torch_backend.py、オプション依存)
ユーザーから「計算をラクにするため、トークンを消費しないために
PyTorchとか統合する?」という提案があり、TODO.md H項(PyTorch対応)
を兼ねてtorch_backend.pyを追加した。torchはオプション依存
(pip install kappalogic[torch])で、torchが無くてもkappalogic
本体は問題なく動く(kappalogic/__init__.pyはtorch_backendを
インポートしない)。
これまでの探索(命題4・6など)は、numpyの有限差分(中心差分、 誤差はhの選び方次第)や、数十万点のグリッド探索で最適点(共鳴点)を 探す、という力技に頼っていた。torch.autogradを使うと:
- 閉形式の検証が、有限差分の打ち切り誤差なしにできる
(
or_gradient_closed_formとの比較で、誤差ではなく完全に ビット単位で一致することを確認:abs diff: 0.0) - 最適点(argmax)を、グリッド探索ではなくAdamでの勾配上昇法で
数百ステップで見つけられる(
find_argmax_1d) - (a,b)平面のような2次元の"危険領域"の地図を、バッチでまとめて
計算できる(
or_danger_landscape: 300×300点の勾配地図が 0.013秒。同じものをnumpyの二重forループ+有限差分で計算すると 0.58秒——約45倍速い)
この高速化を使って、命題6(aを固定した1次元の断面)の先にある、 **(a,b)平面全体でのORの"危険地図"**を実際に描いてみた。すると、 命題6の元になった近似曲線
(1-reg(a))·(1-reg(b)) = ξ·u*
が、危険地図の"尾根"(|∇OR|が最大になる曲線)を数%〜十数%程度の
相対誤差でおおむね近似できていることを確認した(exact_danger_curve_residual、
or_danger_landscape参照。境界付近では誤差が大きくなる)。
正直な限界: この曲線は命題6と同じく近似であり、真の尾根には 命題6のw0のような補正項があるはずだが、2次元版のその補正項は 今回導出できていない。それでも、(a,b)平面全体の危険領域を 「ひとつの陰関数曲線」で近似できる、という具体的な見取り図が 得られたのは収穫で、次にこの曲線を精密化するのが自然な一手。
v0.19: ORが"非ゼロの入力なのに誤って偽を返す"領域(命題8)
命題6・v0.18の危険地図を追いかけていて、勾配ではなくOR(a,b)の 値そのものが、a,bが両方とも非ゼロなのに誤って0(偽)に近い値を 返してしまう領域が、実はとても広いことに気づいた。
具体例(ξ=1e-3、u=a/ξ, v=b/ξとして):
u,vがどちらも0.5〜2.0程度の"そこそこ非ゼロ"な組み合わせでは、
OR(a,b)はほぼ厳密に0.0を返す(例: u=v=2.0でもOR=0.000185)。
u=v=2.5になって初めてOR=0.63程度まで持ち直す。
つまり、a、bという2つの入力が両方とも「明らかに0ではない」のに、
OR(a,b;ξ)は「両方とも偽」と誤判定してしまう——直感に反する、
かなり広い誤分類領域が存在する。
閉形式(v0.19): OR(a,b;ξ)=0.5となる境界を u=a/ξ, v=b/ξ の 言葉で調べると、ξ→0の漸近極限で
u + v = (1/2)·ln(1/ξ) + K, K = (1/2)·ln(16/arctanh(1/√2)) ≈ 1.4494
という直線(u,vそれぞれではなく、その"和"だけで決まる)に 厳密に収束することを導出・検証した。u/v比を0.2〜5の範囲で 振っても、境界でのu+vの値は1%以内でほぼ一定(直線であることの 確認)。ξ=1e-4〜1e-12まで検証したところ、実際の境界と閉形式の 差は、ξを10倍小さくするたびにちょうど10分の1に縮んでいく (O(ξ)の収束を確認、ξ=1e-12で差~4.7e-7)。比が極端(0.01倍や 100倍)になると近似の精度は数%程度に落ちる(軸に近い領域は 今回の導出の前提=「両方とも大きいu,v」から外れるため)。
この命題の意味: AND(a,b)=reg(a·b;ξ)は、a,bが非ゼロで
固定されている限り、ξ→0とともに必ず正しく1に収束する
(a,bがどれだけ小さくても、ξがそれよりさらに小さくなればいずれ
検出される——線形の閾値)。しかしOR(a,b;ξ)は、a,bを固定した
ままξ→0すると、u=a/ξ, v=b/ξはどんどん大きくなる一方、
「両方の非ゼロ性を検出するのに必要なu+vの閾値」自体も
log(1/ξ)で際限なく大きくなっていく。この2つの発散のスピードの
兼ね合い次第では、"ξを小さくすればいずれ正しく判定できる"という
(このライブラリの他の多くの命題が暗黙に仮定している)直感が、
OR側では必ずしも成り立たない、という点を具体的に示せたのが収穫。
正直な限界: 境界の"形"(u+v=const、直線であること)は数値的な 観察であり、命題6のw0のような厳密な変分法での再導出はまだ 行っていない。対数の係数1/2と定数Kは、sech^2の漸近展開から 閉形式で導出し、桁ごとの収束を確認済みなのでこれ自体は確信を 持って正しいと言えるが、n項版(命題3・命題4の残課題と同じ形)への 一般化はまだ手を付けていない。
v0.20: 命題8のn項一般化(命題9)——融合版OR_nの誤分類境界
命題8(2引数)がn引数にきれいに一般化できるか調べた。融合版
OR_n(a_1,...,a_n;ξ) = 1 - reg(Π_k NOT(a_k); ξ) の"=0.5となる境界"を
u_k := a_k/ξ の言葉で調べると、命題8の「u+v=直線」が、そのまま
「総和Σu_kが一定」という形に一般化されることを見つけた:
Σ_k u_k = (1/2)·ln(1/ξ) + K(n), K(n) = (1/2)·ln(4ⁿ/A)
(A=arctanh(1/√2)。K(2)は命題8のK と厳密に一致する。)
数値検証: 全項が同じ大きさの対称なケースでn=2,3,5,8,12について、 ξを1e-10, 1e-30, 1e-60(多倍長精度で計算)まで小さくすると、 実際の境界と予測値の差が着実に縮むことを確認した(n=12, ξ=1e-60で 差~3e-5)。重みの配分(u_kの内訳)を変えても、総和Σu_kが同じ 境界にほぼ収まることも確認した(配分に依らず"総和"だけが本質的な 量であることの傍証)。
重要な但し書き: これは"融合版"OR_n自体が正しい値を返すか どうかの境界であり、命題3・命題4が扱っていた「naive fold(逐次 計算)と融合版が一致するか」という、TODO.mdの本丸だった問題とは 別物である。実際に調べたところ、「Σu_kが命題9の閾値を十分超えて いる」という条件だけでは、naive foldと融合版の一致は保証されない (乱数実験で、条件を満たしていてもnaive foldが0(偽)に壊滅的に 張り付いてしまうケースが約半数見つかった。おそらく畳み込みの 途中で"程よく非ゼロ"な値同士が連続して出会うタイミングに依存する ため)。**したがって、「naive foldとOR_n融合版が一致するための n項条件」は依然として未解決のまま残る。**命題9は、それとは 独立した(しかし関連の深い)「融合版OR_n自体がいつ正しいか」という 問いに答えたもの。
v0.21: 細かいTODO消化(MOD演算子、ディラックのデルタ函数、ドキュメント整備)
TODO.md B・H項の「簡単に終わりそうな」項目をまとめて片付けた回。
MOD演算子とディラックのデルタ函数(funcs.py)
modf(x, n):x mod n。par(x)(奇数判定)を一般化する形で 作った——「x ≡ r (mod n)」の検出はintf((x-r)/n)で書けるので、sum_{r=0}^{n-1} r * intf((x-r)/n)とすればx mod nの値そのものが 得られる。整数xについてPythonのx % nと完全一致することを確認済み (負の数にも対応)。delta_approx(x, xi): ディラックのデルタ函数δ(x)の近似。sgn(x;xi)をシグモイド形(sgn+1)/2に直した導関数を取るとNOT(x;xi)/(2*xi)という、既存のプリミティブだけで書ける形になる。 正規化(∫δ_xi(x)dx=1、誤差<1e-12)とふるい分け性質 (∫δ_xi(x)f(x)dx→f(0))を数値積分で確認済み。
differentiable programmingとの接続点
kappalogicのAND/OR/regは、ニューロシンボリックAI分野の 微分可能論理(differentiable/fuzzy logic)の研究、特に Logic Tensor Networks(Badreddine et al. 2022, "single-passing"の 概念の出典)やvan Krieken et al. (2022, t-normの勾配解析の手法)と 同じ問題意識(離散論理を勾配降下で最適化したい)を共有している。
大きな違いは、標準的なt-norm/t-conorm(積t-norm、Łukasiewicz
t-norm等)が[0,1]上の"真偽の度合い"を表す値に作用するのに対し、
kappalogicのreg(x)=tanh(x/ξ)²は実数直線全体を受け取り「ゼロか
非ゼロか」を判定する非単調な検出器であること(README冒頭・
theory.pyの背景を参照)。この違いのため、命題1〜9で見たような
(t-norm文献にはない)"共鳴"や"対数閾値の誤分類領域"のような現象が
起きる。difflogic(Petersen et al.、論理ゲートを直接学習する
ニューラルネットワーク)のような、シグモイドベースの緩和を使う
既存手法と比べたときの得失(勾配消失パターンの違いなど)は、
今回具体的な数値・閉形式で比較できる形にまとめた(命題4・6・8・9)。
誤差のオーダー早見表
このライブラリの各命題・恒等式が、どのオーダーの誤差で成り立つかを 一覧にしておく(詳細は各モジュールのdocstring参照)。
| 対象 | 誤差のオーダー | 該当箇所 |
|---|---|---|
単一ゲートの飽和誤差 1-reg(x) (|x|>Cξ) |
O(exp(-2C))(具体的に4*exp(-2C)以下) |
theory.py(命題1・3の基礎) |
| AND_n融合とnaive foldの誤差(個々の値が全部C·ξ超) | O(n*exp(-2C)) |
fusion_error_bound (命題3, v0.16) |
| OR(a,b)の勾配の閉形式と数値微分の一致 | 有限差分由来の誤差(torch使用時は0、機械精度で厳密一致) |
or_gradient_closed_form, torch_backend.py |
| ORの第二共鳴点の閉形式 | O(ξ)(ξ→0で線形に縮小、命題6) |
or_second_resonance_location |
| ORの誤分類境界(2引数・n引数) | O(ξ)(ξ→0で線形に縮小、命題8・9) |
or_misclassification_boundary_sum, or_n_misclassification_boundary_sum |
| Lambertの連分数(k(x)の近似) | depth=10で<2e-9、depth=20で機械精度 |
identities.py |
| Mittag-Leffler展開・Weierstrass積 | 収束が遅い(N=1e5項で~1e-5、N=1000項で~1e-6) |
identities.py |
| 双曲計量の測地線の保存量 | 機械精度(~1e-15) |
gauge.py |
v0.22: 積分形(identities.py、TODO.md A項)
微分形(命題1〜9)の先に手つかずで残っていた「積分形」に着手した。 tanhの原始関数が古典的に知られていることを使い、以下を導出・検証した (すべて数値微分との差<1e-10で確認):
∫k(x)dx = ξ·ln(cosh(x/ξ)) (k(x)=tanh(x/ξ))
∫reg(x)dx = x - ξ·k(x) (reg(x)=tanh(x/ξ)²)
∫NOT(x)dx = ξ·k(x) (NOT(x)=1-reg(x))
∫AND(a,b)da = a - (ξ/b)·k(a·b) (bは固定、b≠0)
∫sech(x/ξ)dx = ξ·gd(x/ξ) (gdはGudermannian函数)
reg+NOT=1なので、積分もintegral_of_reg+integral_of_NOT=xと厳密に 整合する(交差検証済み)。TODO.mdで「Gudermannian函数がヒントに なりそう」と書いていた点は、想定と少し違う形で当たっていた: gd(u)自身がk(x)の原始関数なのではなく、sech(x/ξ)(=NOTの平方根に 相当する量)の原始関数がgd(x/ξ)である、という関係だった。
物理対応(stat_mech.pyとの接続): ∫k(x)dx = ξ·ln(cosh(x/ξ))は、
1スピン・外部磁場hのIsing模型の分配関数Z=2cosh(h)の対数
ln Z = ln2 + ln cosh(h)そのものである。統計力学の標準的な関係
「磁化(=期待値)を積分すると対数分配関数になる」
(d(ln Z)/dh = tanh(h))の言い換えになっており、x/ξが
「場/温度」という、このライブラリで繰り返し出てくる対応の
もう一つの実例になっている。
正直な限界: これらの積分公式自体は微積分の基本(tanhの原始関数を 求めるだけ)であり、新しい数学ではない。新規性は、これらを kappalogicの枠組みに翻訳し、stat_mech.pyの分配関数との対応を 明示できたことに限られる。OR側の積分形(NOT/積/NOTの入れ子構造)は 今回まだ手を付けていない。
v0.23: ついに本丸——naive foldとOR_n融合版が一致するn項条件(命題10)
v0.13の命題4の直後からTODO.mdの本丸として残っていた課題 (「naive fold(逐次計算)とOR_n融合版が一致するn項条件を、 命題3(AND版)のような閉じた形で書けないか」)に、ついに答えが出た。
鍵となる観察
naive foldの漸化式acc_k = OR(acc_{k-1}, a_k)を、
m_k := NOT(acc_k)(「どれだけ偽か」を表す量、(0,1]の範囲)の
言葉で書き直すと、m_k = phi(phi(m_{k-1}*s_k))という二重NOTの
形になる(phi:=NOT、s_k:=NOT(a_k))。このphi(phi(w))という合成を
調べると、wがξより十分小さい(w≪ξ)ときにだけ極端に小さい値
(「真」)に収束し、そうでなければ1(「偽」)にほぼ張り付くという、
鋭い閾値挙動をすることが分かった。
m_{k-1}<=1は常に成り立つので、m_{k-1}*s_k <= s_k。つまり
s_k(=次の値a_kの"偽らしさ")自体がξより十分小さければ、
それまでの畳み込みがどれだけ怪しい状態だったか(m_{k-1}の値)に
関係なく、必ず正しく「真」に転じる。
定理(命題10)
s_kがξより十分小さくなる条件をu_k:=|a_k|/ξで解くと、
命題6・8・9と同じ「log(1/ξ)」型の閾値が出てくる:
C*(ξ) := (1/2)·ln(4/ξ)
n個の値のうち少なくとも1つが |a_k| > ξ·(C*(ξ) + M) を満たす
(Mは好きに選べる安全マージン)とき、naive foldとOR_n融合版の誤差は
|naive_fold − OR_n(融合版)| ≲ exp(−4M)
程度に収まる。
数値検証: ξ=1e-2〜1e-8、n=2〜50、M=0.5〜4の組み合わせで検証した
ところ、M≧2で(実測誤差)/(exp(-4M))の比が1.000にほぼ完全に収束
することを確認した。特にM=4のときは、ξやn、他の値の分布に関係なく
誤差がexp(-16)≈1.1e-7にぴったり一致する、という驚くほど綺麗な
普遍性を示した(or_n_fusion_is_safe, or_n_fold_error_bound参照)。
AND側(命題3)との対比
AND_n(命題3、v0.16で修正済み)は「全部の値が大きい」ことを
要求したが、OR_n(命題10)は(ORの"どれか一つ真なら真"という性質に
素直に対応する形で)「どれか一つの値が大きい」ことだけで足りる。
ただしその"大きい"の基準は、ANDが単純な定数閾値C·ξだったのに
対し、ORは命題6・8・9と同じlog(1/ξ)補正のかかった閾値
ξ·((1/2)ln(4/ξ)+M)になる、という違いがある。
| AND_n(命題3) | OR_n(命題10) | |
|---|---|---|
| 安全条件 | 全部の値が>C·ξ |
どれか1つの値が>ξ·((1/2)ln(4/ξ)+M) |
| 閾値の形 | 定数倍(O(ξ)) |
対数補正(O(ξ·log(1/ξ))) |
| 誤差上界 | n·4·exp(-2C) |
exp(-4M)(nに依存しない) |
正直な評価
これで「naive foldとOR_n融合版が一致するためのn項条件」という
TODOの本丸に、閉じた形の十分条件と定量的な誤差上界を与える
ことができた。ただし(1)これは十分条件であり、必要十分条件
(もっと緩い条件でも安全な場合があるかもしれない)までは詰めて
いない、(2)導出の途中(phi(phi(w))の閾値挙動)は漸近的な議論で
あり、機械的に厳密な不等式の証明までは行っていない——数値検証
(複数のξ・n・マージンで比が1.000に収束することを確認)による
裏付けにとどまる。文献調査もしていないので、微分可能論理ゲート
分野で本当に新規かどうかは断定しない。それでも、v0.13から続いて
いた具体的な空白を、閉じた形の式で埋められたことは、今回の
一番の収穫だと思う。
v0.24: 6ゲートの分類——AND型かOR型か(命題11)
TODO.mdで積み残していた「XOR/NAND/NORなど他ゲートが、AND型
(命題5のa*b/ξという1変数に還元できる)かOR型(できない)か」を
調べた。core.pyの6ゲート全部について、命題5の部分ディレーション
不変性(gate(λa,b;λξ)==gate(a,b;ξ))をsympyと数値の両方で
チェックした:
AND : 満たす(AND型)
NAND, OR, NOR, XOR, XNOR : いずれも満たさない
NAND=NOT(AND)のように、AND型のゲートに外側からNOTを1回被せる
だけで、この綺麗な不変性は壊れてしまう(NOT自身がξに依存する
"もう一段のreg"だから)。
ただし満たさない5つの中でもNANDだけは性質が違った。実際に a,bを動かして誤分類領域を調べたところ:
- OR, NOR, XOR, XNOR: 命題8と同じ「a,bが両方ともそこそこ非ゼロ
なのに広い範囲で誤判定する」領域を持つ(NORはORの誤分類領域を
そのまま裏返しただけ、XORは内部でOR型の合成を使うため同じ
問題を引き継ぐ——例えば
XOR(a,a)は常に0のはずが、a=1〜2ξ程度 の範囲で誤って1になる)。 - NAND: 単一の鋭い閾値を持ち、広い誤分類領域は持たない (AND型と同様に振る舞う)。ただしその閾値はAND自身の共鳴点 (命題1、O(ξ))とは異なる、新しいスケールになっている:
a·b ≈ sqrt(arctanh(1/√2)) · ξ^(3/2)
これは、AND(O(ξ))・OR(O(ξ·log(1/ξ)))に続く3つ目の独立した スケーリング則(ξ^1.5)である。ξ=1e-2〜1e-10で、実測境界と 予測の比が1.00000に収束することを数値検証済み。
正直な評価: 「単一の比に還元できるか」という命題5の判定基準 だけでは、NANDのような"AND型の親戚だが閾値のスケールは違う" ケースを見落としてしまうことがわかった。分類自体(部分ディレー ション不変性の有無)は厳密(sympyで確認)だが、NORやXOR/XNORの 誤分類領域の精密な閉形式(命題8のような)は今回導出していない (定性的な確認にとどまる)。NANDのξ^1.5則は導出・数値検証ともに 確信を持てる。
v0.25: NORの誤分類境界を閉形式化(命題12)
命題11で「NORはOR型(命題8のような広い誤分類領域を持つ)」と 定性的な確認にとどめていたが、命題8と同じ手法をそのまま適用する ことで、閉じた形の境界を導出できた。
u + v = (1/2)·ln(1/ξ) + K_NOR(ξ)
K_NOR(ξ) = (1/2)·ln(32/ln(4/(ξ·A))), A := arctanh(1/√2)
命題8のOR境界と同じ「u+v=一定」という直線の形だが、定数項 K_NORにξのlogのlogという珍しい二重対数補正がつく (NOR=NOT(OR)という一段の入れ子越しに命題8の式を適用したため)。
数値検証: ξ=1e-2〜1e-12で実測境界との差が着実に縮小(ξ=1e-12で 差~1.8e-6)。u/v比を0.2〜5で振ってもu+vはほぼ一定(9.40〜9.45、 ξ=1e-8)であることも確認した。
これはNOR=NOT(OR)なので、命題8のORの誤分類領域を単に"裏返した" ものに過ぎず、数学的に新しい現象ではない。それでも命題11で "定性的な確認にとどまる"と書いていた課題に、閉じた形の答えを 出せたのは収穫。XOR/XNORは対角線a=b上で単純な"0.5交差"という 形にならず(対称性のため別の構造を持つ)、今回は同じ手法を そのまま適用できなかった——引き続き未解決のまま残す。
v0.26: (a,b)平面の"真の危険地図"は、実は命題6がすでに解いていた
v0.18で「近似曲線(1-reg(a))(1-reg(b))=ξu*は、(a,b)平面上の
|∇OR|の"尾根"を数%〜十数%の誤差でしか近似できない」と書き、
「真の尾根の精密な閉形式(命題6のw0に相当する2次元版の補正項)は
まだ導出できていない」と積み残していた。
改めて確認したところ、これは誤解だった。命題6は当初「aを
c·ξに固定したときの、d/da OR(a,b)の一部h(v)=NOT(b)·reg'(p)を
最大化するv」を求めていたが、これをcの連続関数として使うと、
そのまま**|∇OR|=√((∂OR/∂a)²+(∂OR/∂b)²)という結合された勾配の
大きさそのものの"真の尾根"**になっていることが分かった
(or_full_gradient_magnitude_argmaxで|∇OR|²を直接
scipy.optimizeで最大化し、or_second_resonance_locationの
予測と比較したところ、ξ=1e-4で差0.016、ξ=1e-10で差1e-6という、
ξ→0で着実に縮小する精度で一致することを確認)。
つまり命題6は、当初思っていたより強い結果だった——「aを固定した 1次元の断面」の話ではなく、(a,b)平面全体の危険地図の形を (cを動かすことで)最初からすでに与えていた、ということになる。 v0.18の近似曲線が数%〜十数%の誤差を持っていたのは、その曲線が 命題6の閉形式を経由せず、より粗い近似(p=ξu*を直接解くだけ)を 使っていたため。
正直な評価: これは新しい数式を導出したわけではなく、既存の 命題6の適用範囲を正しく認識し直しただけ。それでも、v0.18から 明示的に「未解決」として残していた課題を、追加の理論なしに 閉じられたのは収穫だった。
v0.27: XORの断面(b=0)に4つ目のスケーリング則(命題13)
命題12(NOR)の対角線a=bの手法は、XORには使えなかった (XOR(a,a)は常に0のはずの対称な量なので、"0.5交差"という設定が そのままでは成立しない)。そこで別の断面——b=0固定——を試した。
b=0のとき、XOR(a,0;ξ) = NOT(NOT(reg(a;ξ);ξ);ξ) という"二重NOT"の 構造になる(NAND=NOT(AND)の"一重NOT"よりもう一段深い)。この境界を u=a/ξで解くと:
u ≈ sqrt( (1/2)·ξ·ln(4/(ξ·A)) ), A := arctanh(1/√2)
という、AND(O(ξ))・OR(O(ξ·log(1/ξ)))・NAND(O(ξ^1.5))に続く 4つ目の独立したスケーリング則が出てきた。ξ=1e-2〜1e-10で、 実測境界との比が1.00000に収束することを確認した。
面白いのは、この閾値がAND自身の共鳴点(命題1、O(ξ)、a=ξ·u*) よりもさらに小さいaで切り替わることである。これは"二重NOT"が AND単体よりも感度を上げる方向に働く(NAND・NORで見た"もう一段 NOTを重ねると閾値がシフトする"という現象の、また違う現れ方) ことを示している。
正直な限界: これはb=0に固定した特別な断面での結果であり、a,b 両方が非ゼロな一般の場合のXORの誤分類領域(命題8のような閉じた 2変数の式)はまだ導出できていない。XNORについても同様の手法が 使えるはずだが、今回は時間の都合で手を付けていない。
v0.28: XOR(a,a)の誤分類"帯"とLambert W函数の初登場(命題14)
命題13(b=0断面)の直後、対角線a=b自体も実は攻略できることに 気づいた。XOR(a,a;ξ)は定義上つねに0(偽)であるべき対称な量だが、 実際にはuがある帯の中にあるときだけ誤って1(真)に張り付く ことが分かった:
u_lower ≈ sqrt( ξ · (1/2) · ln(4/√(ξ·A)) ) (下側境界)
u_upper ≈ -W₋₁(-2·R(ξ)) / 2,
R(ξ) := (√ξ/4) · sqrt( (1/2)·ln(4/√(ξ·A)) ) (上側境界)
(A := arctanh(1/√2)、W₋₁はLambert W函数の下側分岐)
u<u_lowerとu>u_upperでは正しく0、その間の帯の中でだけ誤って1に
なる。導出はXOR(a,a;ξ)=OR(x,x;ξ)(x:=AND(a,NOT(a);ξ))という単純化
から始まり、「uが小さい極限」と「uが大きい極限」のどちらを使うかで
それぞれ違う閉形式が出る。上側境界の方程式u·e^(-2u)=R(ξ)は、
w:=-2uと置換するとw·e^w=-2R(ξ)というLambert W函数の定義式
そのものになった——このライブラリで初めてLambert W函数が登場
した。
数値検証: ξ=1e-3〜1e-10で、両方の境界とも実測値との比が1.00000に 収束することを確認した。
正直な評価: 対角線a=b上でのXORの挙動は(下側・上側とも)きれいに 閉じた形で説明できた。ただし一般の(a≠b、両方とも自由に動く)場合の 誤分類領域の全体像はまだ描けていない——命題13・14を包含する、 より大きな2変数の問題として残る。
v0.29: XNORの断面解析で、6ゲート全部の断面解析が完了(命題15)
XNOR(a,0;ξ)=NOT(XOR(a,0;ξ);ξ)を、命題13(XORのb=0断面)にもう一段 NOTを重ねた三重NOTとして解析した。命題8以降で繰り返し使って きた「NOT(z;ξ)=ξ·A(A:=arctanh(1/√2))という小さい目標値を逆算する」 という同じ操作を3回入れ子にするだけで、閉形式が出た:
y := NOT(reg(a;ξ);ξ)の目標値 ≈ ξ·(1/2)·ln(4/(ξ·A))
z := reg(a;ξ)の目標値 ≈ ξ·(1/2)·ln(4/y)
u = a/ξ ≈ √z
ξ=1e-2〜1e-12で、実測境界との比が1.000000に収束することを確認した。
これで、6ゲート(AND, OR, NAND, NOR, XOR, XNOR)すべてについて、 少なくとも1つの具体的な断面で誤分類境界の閉形式を与えられた:
| ゲート | 断面 | スケーリング則 |
|---|---|---|
| AND | (単一変数) | O(ξ)(命題1) |
| OR | u+v | O(ξ·log(1/ξ))(命題8) |
| NAND | a·b(対角線) | O(ξ^1.5)(命題11) |
| NOR | u+v | O(ξ·log(1/ξ))、二重対数補正(命題12) |
| XOR | b=0 | O(√(ξ·log(1/ξ)))(命題13) |
| XOR | 対角線 | 帯構造、上側境界にLambert W函数(命題14) |
| XNOR | b=0 | 三重入れ子のlog(命題15) |
正直な評価: これらはすべて特定の断面(対角線かb=0)での結果であり、 各ゲートの(a,b)平面全体の誤分類領域の完全な閉形式は、OR側の命題8 (v0.26でその2次元的な完全性を確認済み)を除いて、まだ描けていない。 それでも「NOTを重ねるたびに閾値のスケールが系統的にシフトして いく」という現象を、6ゲート全部について具体的な数式で確認できた のは、このシリーズ(命題5、11〜15)の一番の到達点だと思う。
v0.30: NOT合成塔の統一理論——命題11・13・15を1つに統合(命題16)
命題11(NAND)・13(XORのb=0断面)・15(XNORのb=0断面)を並べて見比べて
いて、これらが実はたった1つの一般理論の特殊ケースだったことに
気づいた。共通しているのは「reg(x;ξ)にNOTをn回繰り返し適用した
合成Ψ_n(x;ξ)が0.5になる閾値」という構造(n=1がNAND、n=2がXORの
b=0断面、n=3がXNORのb=0断面に対応する)。
これを一般のnについて解くと、次の"対数の塔"(log tower)が閉じた 形で現れる:
T_0(ξ) := ξ·A (A := arctanh(1/√2))
T_k(ξ) := ξ·(1/2)·ln(4/T_{k-1}(ξ)) for k=1,...,n-1
x*_n(ξ) := ξ·√(T_{n-1}(ξ)) (n≥1)
この一般公式は、n=1,2,3で命題11・13・15をそのまま(誤差ゼロで) 再現する。さらにn=4,5という、名前の付いた標準ゲートには対応 しない"より深いNOTの入れ子"についても、この一般公式がそのまま 正しく機能することを数値検証で確認した——これは新しいゲートを 設計する際の閾値予測に、そのまま使える一般理論になっている。
数値検証: n=1,3,5について、ξ=1e-2〜1e-6(float64)で実測値との比が 1に収束することを確認。開発中はmpmathの50〜60桁精度でξ=1e-40まで 検証し、比が1.00000000(小数点以下8桁まで完全に1)に収束することも 確認した(float64での検証はξ<1e-6あたりでNOTの繰り返し適用による 丸め誤差が蓄積し精度が落ちるため)。
正直な評価: これは「新しい現象の発見」というより「既に見つけていた 3つの結果(命題11・13・15)が、実は1つの一般理論の特殊ケースに 過ぎなかったと気づき、それをnについて閉じた形で解いた」という **統合(unification)**である。とはいえ、当初から目指していた 「統一理論」という言葉にもっとも近い成果になったと思う。n≥4の 場合の解釈(対応する具体的な論理ゲートがあるのか)は考えていない ——あくまで数式としての一般化にとどまる。
v0.31: NOT写像の自然な放物型不動点(命題17)
命題16(NOT合成塔)のnを連続化できないか(dynamics.pyの
fractional_iterateがそのまま使えるか)を調べていて、
NOT(z;ξ):=1-reg(z;ξ)という写像自体が、人工的なパッチを
当てなくても自然な不動点を持つことに気づいた
(z=0でNOT(0;ξ)=1>0、z→∞でNOT(z;ξ)→0<zなので、中間値の
定理により(0,1)の中に必ず不動点がある)。
ただし、この不動点での乗数(微分係数)は常に負(period-2的な 性質)であることが分かった——素朴に「実数tについて連続的に反復する」 という発想(命題16のnを連続化する)は、乗数が負だと非整数乗が 複素数になってしまうため、そのままでは実現できない。
その代わり、乗数がちょうど-1になる自然な放物型不動点を
見つけた。z0=NOT(z0;ξ)とNOT'(z0;ξ)=-1の連立方程式を解くと、
s:=√(1-z0)について
2·s·arctanh(s) = 1
という1変数の超越方程式に帰着し、これを解くと
z0_c = 1 - s², ξ_c = 2·s·(1-s²) = 2·s·z0_c
(数値: s≈0.647918229、z0_c≈0.580201968、ξ_c≈0.751846864)。
not_map_multiplier(ξ_c)が厳密に-1(誤差<1e-10)になることを
直接確認した。ξ_cより小さいξでは不動点が反発的(|λ|>1)、大きい
ξでは吸引的(|λ|<1)になる、という分岐点になっている。
この"自然な放物型不動点"は、dev_notes.md v0.12で行き詰まった 「人工的に埋め込んだ不動点の放物型収束」の問題とは別に、NOT写像 そのものが固有に持つ構造として見つかったもの。外部アドバイザーが 指摘していた「放物型繰り込み」(Inou-Shishikura理論)との関係を 調べる際の、具体的な足がかりになりうる。
正直な評価: 「連続的なn」という当初の目的は(負の乗数という 数学的な障害のため)達成できなかったが、副産物として見つかった この放物型不動点は、それ自体が具体的で検証済みの新しい事実である。 放物型繰り込み理論との接続はまだ何も調べていない——今後の課題。
v0.32: 放物型繰り込みへの接続——縮退した3次接触の不動点(命題18)
命題17(NOT写像の自然な放物型不動点、乗数-1)を、標準的な放物型
繰り込み理論(乗数+1を前提にすることが多い)に繋げるため、
F := NOT∘NOT(NOTを2回)という合成写像を考えた。F'(z0)=(-1)²=+1
で標準的な意味での放物型になるが、実際に調べたところ**F''(z0)が
恒等的に0**になり、通常の(2次で接する)放物型よりも縮退した
"3次で接する"放物型不動点になっていた。
これはNOT写像固有の偶然ではなく、一般的な事実であることを
sympyで確認した:「乗数-1を持つ任意の写像φ(φ(z0+ε)=z0-ε+cε²+dε³+...)
に対し、F:=φ∘φはF(z0+ε)-z0 = ε - 2(c²+d)ε³+O(ε⁴)となり、
ε²の係数は常に厳密に0になる」。つまり「乗数-1を持つ写像を
自分自身と合成すると、必ず(少なくとも)3次接触の放物型不動点に
なる」という一般法則。
力学的な帰結として、標準の放物型不動点の1/n減衰ではなく
1/√n減衰という、質的に遅い収束をすることも数値的に確認した
(ξ_cで100万回反復し、指数を最小二乗フィットして-0.495——理論値
-0.5と良く一致)。
正直な評価: 「縮退した3次接触の放物型不動点」自体は複素力学系 理論では知られた現象(通常の2次接触より高次の接触点、または "parabolic implosion"の文脈で研究される)であり、新しい数学では ない。新規性は、kappalogicのNOT写像が(乗数-1という性質のおかげで) この現象の具体例を自然に提供することを見つけ、確認したことに 限られる。Fatou座標の具体的な構成(標準理論の道具)や、外部 アドバイザーが指摘していたInou-Shishikura理論との詳細な対応は、 まだ何も手を付けていない——今後の課題として残す。
v0.33: 局所的なFatou座標は作れたが、大域的にはまだ未完成(命題18続き)
命題18(縮退した3次接触の放物型不動点)の続きとして、実際に Fatou座標(アベル座標)を構成してみた。3次接触の場合の素朴な 漸近形
φ(z) := -1 / (2b(z-z0)²)
(w:=z-z0についてdw/dn≈bw³という連続近似から、d(w⁻²)/dn≈-2bを
積分するだけで出る)を試したところ、局所的な性質
φ(F(z))-φ(z)→1(z→z0のとき)は数値的に確認できた
(z0+1e-4でφ(F(z))-φ(z)≈1.00002)。
しかし、これを使ってF^n(z)を10万回以上反復し、φ(F^n(z))-nが
一定値に収束するかを確認しようとしたところ、収束しなかった
(nが大きくなるにつれて系統的にずれていく)。つまりこの閉形式は
1ステップの局所的な振る舞いは正しく捉えているが、多数回反復した
"大域的な"Fatou座標としてはまだ不完全だった。
正直な評価: 標準的な放物型不動点の理論では、Fatou座標の正確な
漸近形には対数補正項がつくことが知られている
(φ(z) = -1/(a(z-z0)) + β·ln(...)/a + O(1))。今回の3次接触の
場合も同様の補正項が必要なはずだが、今回はまだ導出できていない
——正直に「局所的には確認できたが、大域的な構成は道半ば」という
状態で記録しておく。
v0.34: 命題10は十分条件だが必要条件ではないことを確認
命題10(v0.23、naive foldとOR_n融合版が一致するn項の十分条件)に ついて、「これは必要条件でもあるか」を調べた。全部の値を命題10の 閾値未満に強制して乱数生成しても、実際には高い確率(実測で7〜9割 程度)でnaive foldとOR_n融合版が一致してしまう(gapが小さい) ことを確認した——つまり命題10の条件は十分条件だが必要条件では ないことがはっきりした。
命題9(融合版OR_nの正しさの"総和"条件)のmarginとの相関も調べたが、 「良い一致」グループと「悪い不一致」グループでmarginの分布が 大きく重なっており、単純な閾値では両者をきれいに分離できない ことも確認した。
正直な評価: 「naive foldとOR_n融合版が一致するための必要十分条件」 は、個々の値の最大値や総和のような単純な集計量だけでは決まらず、 畳み込みの順序や個々の値の並び方に依存する、より複雑な条件である 可能性が高い、ということが今回の調査で明確になった。完全な解決には 至っていないが、「どこまでが分かっていて、どこからが分かって いないか」の境界をはっきりさせられたのは収穫。
v0.35: 離散積Π↔連続積分の橋渡し(TODO.md C項)
bridge.pyには既に「離散和Σ↔連続積分∫」の橋渡し(sum_via_integral、
n!とΓ関数の一致で検証済み)があったが、「離散積Πについても同様の
橋渡しができないか」というTODOが残っていた。
答えは簡単で、log(Π f(n)) = Σ log(f(n))という恒等式を使えば、
既存のsum_via_integralをそのまま(f(n)をlog(f(n))に差し替えるだけ)
再利用できる——新しい理論は不要だった:
Π_{n=0}^{N} f(n) = exp( ∫_0^{N+1} log(f(floor(x))) dx )
f(n)=nとしてN=3,5,7でこのproduct_via_integral関数を試したところ、
N!(階乗)と相対誤差~1e-3で一致した。さらに既存の
gamma_via_riemann_sum(オイラー積分によるN!)とも独立に一致する
ことを確認し、「離散積Π→(log/exp経由の)連続積分→Gamma関数」という
3通りの経路が相互に整合することを確かめた。
正直な評価: これは既存の橋渡し(Σ↔∫)の直接の応用であり、新しい 数学ではない。TODOに残っていた具体的な問い(離散積の橋渡しはできるか) に、既存の道具を組み合わせるだけで答えられたのは良い収穫。
先行研究との関係(誠実な位置づけ)
要素技術のほとんどは既存研究の再発明である:
| このライブラリの要素 | 対応する既存研究 |
|---|---|
| tanhベースの滑らかな指示関数 | 相分離理論(Allen-Cahn方程式、拡散界面法、1979年〜) |
| reg/ANDの勾配消失 | van Krieken et al. (2022, Artificial Intelligence)が命題として証明済み |
| 論理ゲート×連続緩和×アニーリング | Petersen et al. (2022, NeurIPS)、実装ライブラリdifflogicも既存 |
| ξ(t)=2√(Dt)のアニーリングスケジュール | 拡散モデルの"Variance Exploding SDE"と数学的に同一 |
| Dirac delta/Heaviside の微分可能な近似 | Smoothing methods for AD、mollifier理論、SPHカーネルとして既に成熟 |
| フェルミ・ディラック占有数=sgn(x,2kT) | DFT計算の電子スメアリング手法(実務で広く使われる既存技法) |
| k(x)=tanh(x/ξ)の加法定理・連分数・部分分数展開・無限積 | 双曲線関数論の古典的結果(Lambertの連分数は1768年) |
| 並進・ディレーションのアフィン群構造/双曲計量のキリングベクトル場 | 双曲幾何・連続ウェーブレット変換の表現論の古典的結果(ax+b group) |
見つけた本物の区別: 標準的なt-norm(van Krieken論文の分析対象)は
真偽度[0,1]の範囲で単調だが、reg(x)=tanh(x/xi)^2は任意の実数を
受け取り「0か非0か」を判定する非単調な"検出器"であり、t-normの
枠組みには存在しない。むしろmollifier/AD平滑化の系譜に近い。この
2つの研究コミュニティを明示的に繋いだ文献は検索した範囲では見当たらなかった。
新規性を主張できるとすれば、この細い糸のみ(詳細はdev_notes.md)。
率直な限界(誇張しないための注記)
- hardモード(reg/AND/OR)は離散的な場合分けをif文なしで解析式に埋め込む 用途には向くが、それ自体を勾配降下の目的関数にしてNP完全問題を 解くのには向かない(勾配消失のため)。
- softモード+アニーリングは「うまくいく場合がある局所探索の補助」で あって、P=NPを覆すようなものではない。
- 個々の要素技術はほぼ全て先行研究があり(一部はより厳密な形で)、 「大発見」と呼べる新定理・新予想は今のところ出ていない。
テスト・サンプル実行
pytest tests/ -v # 265 tests (torchが無い環境ではtest_v18_torch_backend.pyは自動でskip)
python examples/heat_equation_demo.py
python examples/karnaugh_fusion_benchmark.py
python examples/sat_3var_demo.py
python examples/infinite_well_demo.py
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kappalogic-0.35.0.tar.gz.
File metadata
- Download URL: kappalogic-0.35.0.tar.gz
- Upload date:
- Size: 160.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f9caf06ae1cbf0fb110030a96021f122bd7f478e68ccde4e11b1c9755fceeff3
|
|
| MD5 |
c4c08becffe5751f2ab51611bc016c62
|
|
| BLAKE2b-256 |
3bb270c8fced663248921bc557082b60644dc89eb279bd2f013ceac66e494a3b
|
Provenance
The following attestation bundles were made for kappalogic-0.35.0.tar.gz:
Publisher:
pypi.yml on Geppetto-s-Puppet/kappalogic
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kappalogic-0.35.0.tar.gz -
Subject digest:
f9caf06ae1cbf0fb110030a96021f122bd7f478e68ccde4e11b1c9755fceeff3 - Sigstore transparency entry: 2194745563
- Sigstore integration time:
-
Permalink:
Geppetto-s-Puppet/kappalogic@ceab3c6b0745a1440afecbe8bd52f140bf8826b1 -
Branch / Tag:
refs/tags/v0.35 - Owner: https://github.com/Geppetto-s-Puppet
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@ceab3c6b0745a1440afecbe8bd52f140bf8826b1 -
Trigger Event:
release
-
Statement type:
File details
Details for the file kappalogic-0.35.0-py3-none-any.whl.
File metadata
- Download URL: kappalogic-0.35.0-py3-none-any.whl
- Upload date:
- Size: 101.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
224d1a175039ebd8937617e48c6a1f230c11d9dca1d2da15c43e6cc8b3ce6e43
|
|
| MD5 |
cf1ce7749638fe7f90a7cdeb82ac2c5a
|
|
| BLAKE2b-256 |
774adba2b7009065a201072b22f3b31895112bcb34e6989f7ad878d1c9ed50e2
|
Provenance
The following attestation bundles were made for kappalogic-0.35.0-py3-none-any.whl:
Publisher:
pypi.yml on Geppetto-s-Puppet/kappalogic
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kappalogic-0.35.0-py3-none-any.whl -
Subject digest:
224d1a175039ebd8937617e48c6a1f230c11d9dca1d2da15c43e6cc8b3ce6e43 - Sigstore transparency entry: 2194745566
- Sigstore integration time:
-
Permalink:
Geppetto-s-Puppet/kappalogic@ceab3c6b0745a1440afecbe8bd52f140bf8826b1 -
Branch / Tag:
refs/tags/v0.35 - Owner: https://github.com/Geppetto-s-Puppet
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@ceab3c6b0745a1440afecbe8bd52f140bf8826b1 -
Trigger Event:
release
-
Statement type: