意思無能力に関する判決(大判明38.5.11 民録706頁)

約束手形金請求の件

判決要旨

一 手形が外観上法定の要件を具備するときは手形として形式上有効なれども若し其質実に於いて手形行為の成立を妨ぐべき瑕疵あるときは其手形行為は無効に帰すべきものとす(判旨第一点)

一 商法第四百三十八条の規定は手形に署名したる者は其文言に従い責任を負うべきものなるが故に手形当事者中偶々無能力の故を以て其債務を取消すものあるも之が為め他の署名者の債務に影響を及ぼさざることを示したるものにして全然意思能力を有せざる無能力者の手形行為を以て有効なりとするの法意に非ず(同上)

(参照)無能力者が手形より生じたる債務を取消したるときと雖も他の手形上の権利義務に影響を及ぼさず(商法第四百三十八条)

一 法律が禁治産者等の無能力者を特定し其行為の取消を許容したるは無能力者の利益を保護せんが為め意思欠缺の事実を証明することなく当然之が取消を為すことを得せしめたるものにして此等無能力者に非ざるものの行為は絶対に其効力を有するの旨趣に非ず(判旨第三点)

第一審
浦和地方裁判所熊谷支部
第二審
東京控訴院
上告人
株式会社日出銀行
法定代理人
吉田丹次兵衛
訴訟代理人
岸本辰雄・井本常治
被上告人
倉林周助
法定代理人
倉林セン

右当事者間の約束手形金請求事件に付き東京控訴院が明治三十八年二月二十八日言渡したる判決に対し上告人より全部破毀を求る申立を為したり

本件上告は之を棄却す

理由

上告論旨第一点は原判決は法則の適用を誤りたる不法あるものなり原判決に於いては「前略被控訴人の先代倉林太郎兵衛は本件手形振出の当時(明治三十五年二月頃)意思能力を有せざりしものと認定するに余りあり故に本件手形の振出行為は当然無効にして本訴の請求は理由なしと云はざるを得ず」との判断を付せり然れども本件約束手形振出行為のありしことは原院の認むる所なるのみならず其形式も亦完備せるを以て手形は外観上有効に振出されたること明らかなりとす既に手形の振出行為にして有効なる以上は原院が認めたる如く手形振出の当時法律行為をなす意思能力を有せざりしものとするも当事者は唯手形債務の取消を為し得るに止まり(民法第七条第八条第九条商法第四百三十八条参看)当然無効の行為となすを得べからず即ち本件に付ては商法の規定に従い其効力を定むべきものにして民法第百十九条の主旨に従い当然無効となし得べきものにあらず又原判決に於ては被上告人先代が無能力者たる故に依り適法に取消を為したる事実を認めあらざるが故民法第百二十一条を適用せし判旨なりとも解するに由なし然るに原院が本件手形振出行為を以て当然無効の行為なりと判断したるは法則の適用を誤れる不法の判決なりと思料すと云うに在り

按ずるに手形が外観上法定の要件を具備するときは手形として形式上有効なりと雖も若し其実質に於て手形行為の成立を妨ぐべき瑕疵あるときは其手形行為は無効に帰すべきものとす何となれば法律行為の要素として当事者が意思能力を有せざるべからざることは茲に多言を要せざる所にして而して手形振出行為の法律行為なることは是又弁を待たざる所なるが故に若し手堅振出人が其振出の当時意思能力を有せざるに於ては縦令其手形は外観的要件を具備し形式上手形として有効なるも実質上其振出行為の無効たるべきは毫末の疑いを容れざる所にして而して此法律行為に意思能力を要するの原則は民法商法に通じて更に差別あることなければなり而して上告人の援用する商法第四百三十八条の法意は畢竟手形に署名したるものは其文言に従い責任を負担すべきものなるが故に手形当事者中の偶々無能力者の故を以て其債務を取消すものあるも之がために他の署名者の債務に影響するものにあらざることを示し以て証券的債権なる手形の流通力を確保したるに外ならざるものにして之を其反面より観察して全然意思能力を有せざる無能力者の為したる手形行為たりとも之が取消を為さざる以上は有効なりとの法意を含むものと誤解すべからざるや勿論なり是故に原院が被上告人先代倉林太郎兵衛が本件手形振出の当時意思能力を有せざりしものと認め依て本件振出行為を無効なりと判決したるは固より相当にして本論旨は全く民法商法の原理たる法律行為の効力を誤解したるものとす

上告論旨第二点は原判決は民事訴訟法に違背したる不法あり被上告人の先代太郎兵衛(第一審の被告)は第一審判決に接着せる口頭弁論前(明治三十七年四月二十日前)すでに死亡したるものなり故に民事訴訟法第百七十八条により訴訟手続きは中断せらるべき筋合いなり然るに第一審に於ては之れが中断を為さずして判決を為し原院に於ても亦之れを看過し控訴を棄却したるは民事訴訟法に違背せる不法の裁判なりと思料すと云うに在り

然れども訴訟代理人を以て訴訟を為す場合に於ては原告若しくは被告がしぼうしたるときは其委任消滅の通知に因り訴訟手続きを中断すべきものにして死亡の事実に因り直に中断の効力を生ずるものに非ざることは民事訴訟法第百八十三条の規定する所なり而して本件第一審被告たる被上告人先代太郎兵衛は第一審判決前死亡したりと雖も其訴訟代理人鈴木済美の委任消滅の通知ありたる事跡毫も存ぜざるが故に第一審裁判所が訴訟手続きを中断せず其判決を為したるは相当にして本論旨其理由なし

上告論旨第三点は原判決は法則を不当に適用したる不法あり原判決に於ては「按ずるに被控訴人は甲第一、二号証中倉林太郎名下の印影を是認したるを以て同号証により本件手形は何れも被控訴人の先代たる右太郎兵衛に於て之を降り出したるものと認定す」と説明したるに拘らず証人の証言並に鑑定人の鑑定の結果を斟酌したる末「被控訴人の先代倉林太郎兵衛は本件手形振出の当時(明治三十五年二月頃)意思能力を有せざりしものと認定するに余りあり故に本件手形の振出行為は当然無効にして本件の請求は理由なしと謂はざるを得ず」との判断を付し上告人の請求を排斥せられたり然れども之を法則に按ずるに凡そ人格を具有する者が相互の間になす法律行為は之を有効と為すを以て本則とし之れが無効若くは瑕疵は特に明文を以て限定せらるる所たり而して法律に於て絶対に無効と定たるものは民法第九十条同第九十三条同第九十四条同第九十五条等の場合に過ぎず本件の事案に関係せる法則は商法第四百三十八条に於て無能力者が手形より生じたる債務を負担せる場合に於て之れが取消を為し得べき旨を定めあり而して所謂手形より生じたる債務を取消し得べき無能力者の如何なるやは之を民法総則の規定に俟て定ざる可からず依て民法総則の規定を按ずるに其第四条第七条第十一条第十四条に於て之が人格を限定せり而して所謂意思能力に関する絶対の無能力者は法律上の推定に於ける未成年者並禁治産者とし総ての法律行為に関して取消権を認め準禁治産者並に妻の行為に関しては或る特権の行為に限り(民法第十二条)之れが取消権を認めあり右民法の規定たるや其精神無能力者を保護せんとするにあるや勿論なりと雖も而も又他の一面に於て之れと相対する一般公衆の利害に慮り善意の第三者をして敢て或は甚しき損害を被らしめさらんとするの主旨をも包容せるや論を俟たず而して民法第七条に於て心神喪失の常況に在るもの(即ち意思無能力者)に就いては裁判所は請求に依り禁治産を宣告し得べきことを定め同第八条に禁治産者は之を後見に付すべき旨を定め同第九条に禁治産者の行為は之を取消すことを得と定めたる所より之を按ずれば未成年者にあらずして完全の人格を具備するものは仮令意思能力欠缺し即ち心神喪失の常況にありとするも苟も民法の規定に従い禁治産の宣告を受くるにあらざれば其自ら為せし法律行為の取消を主張し相手方もしくは第三者の利益を妨ぐることを得せしめざるの法意たることは明白疑うべき余地を存ぜず即ち未成年者にあらずして四肢五官を具備し完全の人格を具備するものの行為は妻及び準禁治産者の故により或特種の法律行為又禁治産者の故により其総ての法律行為の取消を主張し得るの外苟も妻たらず準禁治産者禁治産者たる宣告を受けざるものにありては之が取消を為し得べき権利なきものと論定せざるべからず況んや其行為に関し絶対に之が無効を主張するが如きは此等法則の規定に参案し不倫の甚太しきものにして全く法則の規定を度外に付せし暴論なりと云はざるべからず本件に於て被上告人先代太郎兵衛が本件約束手形振出の当時即ち明治三十五年二月中禁治産者たるの宣告を受け居らざりし事実は当事者間に争無き所にして原判決においても被上告人の事実上の供述として手形振出後に禁治産者の宣告を受けし旨の開陳ありし旨を摘示せらるる所たり故に本件約束手形の振出行為は原判決に於て認めらるる如く該当行為の当時被上告人先代が心神喪失の常況に在り完全なる意思能力を具備せざりし事実なりとするも爾後輾転善意を以て裏書きにより手形債権を取得したる上告人に対しては之れが取消権をも尚お之れを行いうべからざる筋合にして即ち上告人は民法及び商法の明文により被上告人が取消を為したる行為尚お其効力を有せざることを信じ極力之を争い置きたる所たり然るに原判決に於て此等法則の規定存在するに拘わらず本件の行為を以て全然之を無効なりと判断し上告人の請求を排斥せられたるは法則の適用を誤りたる不法の判決なりと思料すと云うに在りて結局其論旨は禁治産者又は準禁治産者等法律に於て無能力と定められたる者に在りては其行為を取消すことを得るも其他のものにありては意思能力欠缺の理由を以て之れが取消を為すことを許さず況んや其行為に対し絶対的に無効を主張するが如きは法律の許さざる所なりと云うに帰着す

依て審按するに法律が禁治産者等無能力者を特定し其行為を取消すことを許したるは無能力者を保護せんが為め意思欠缺の事実を証明することなく当然之が取消を為すことを得せしめたるものにして此等無能力者に非ざるものの行為は絶対に其効力を有するの趣旨に非ず故に例えば禁治産者宣告前の行為たりとも事実上意思能力を有せざりしときは其行為は無効たるべく又之と等く縦令禁治産中に為したる行為たりとも全く意思能力を有せざる事実あるに於ては何等取消の意思を表示することなく当然無効たるべきは誠に明白なる法理なりとす故に原院が非上告人先代太郎兵衛が本件手形振出の当時即ち彼が未だ禁治産者たるの宣告を受けざる以前全く意思能力を有せざりしものと認め随て其振出行為は全然無効なりと判決したるは更に間然する所なく本論旨は全く如上の法理を誤解したるものとす其他上告人が本論旨に於て主張する所は前記第一点の論旨を再演するに過ぎざるものにして其理由なきことは已に第一点に於て説示するが如し

以上説明するが如く本上告は其理由なきを以て民事訴訟法第四百三十九条第一項の規定に従い主文の如く判決するものなり


  • カタカナを平仮名に改めた
  • 仮名遣いを現代の用法に改めた
  • 旧字を新字又は対応字に改めた

偏微分の変数変換

座標を$\{x_{i}\}_{i}$から$\{y_{j}\}_{j}$に取り替えた時の偏微分の変換は、

$$ \frac{\partial f}{\partial y_{j}} = \frac{\partial f}{\partial x_{i}}\frac{\partial x_{i}}{\partial y_{j}} $$

と書かれることが多い。

この公式を見つめると、次のことが気になる。

  • 座標の変換によって変化しない$x_{i}$はどう扱われているのか。
  • 座標の変換によって座標の次元が変化するとどうなるのか。

これについて考察する。

固定される変数

偏微分では、微分する変数以外は固定して考える。例えば、

$$ f(x, y) = \sqrt{x^{2}+y^{2}} $$

では、$x$で偏微分するときは$y$を固定する。

この記事では、これを明示するために、

$$ \left[\frac{\partial f}{\partial x}\right]_{y} $$

と書く。これは、大括弧の右下に書く変数が固定されているという意味である。

座標変換

座標が$\{x_{i}\}_{i}$から$\{y_{j}\}_{j}$に変わった時は、

$$ \left[\frac{\partial f}{\partial y_{a}}\right]_{y_{j} \ (j \neq a)} = \left[\frac{\partial f}{\partial x_{k}}\right] _{x_{i} \ (i \neq k)} \left[\frac{\partial x_{k}}{\partial y_{a}}\right]_{y_{j} \ (j \neq a)} $$

と変換される。ここで、

  • 座標の変換によって変化しない$x_{i}$があってもよい。
  • 座標の変換によって座標の次元が変化してもよい。

偏微分に固定されていない変数が含まれる時

二変数関数の偏微分

$$ \left[\frac{\partial}{\partial x}f(x, y)\right]_{z} $$

を考える。$y$が固定されていないので、普通に計算できない。

この場合は、

$$ \left[\frac{\partial}{\partial x}f(x, y)\right]_{z} = \left[\frac{\partial}{\partial x}f(x, y)\right]_{y}\left[\frac{\partial x}{\partial x}\right]_{z} + \left[\frac{\partial}{\partial y}f(x, y)\right]_{x}\left[\frac{\partial y}{\partial x}\right]_{z} $$

というように、固定する変数を変更して計算する。

chain ruleでも同じような式が出てきた。

$$ \frac{\partial f}{\partial y_{j}} = \frac{\partial f}{\partial x_{i}}\frac{\partial x_{i}}{\partial y_{j}} $$

の$\frac{\partial x_{i}}{\partial y}$では、固定する変数を変えていたのだ。

$$ f(x, y) = log\sqrt{x^{2}+y^{2}} $$

を考える。

$r = \sqrt{x^{2}+y^{2}}$とおくと、

$$ f(r) = \log r $$

と一変数関数になる。

よって、$x$で一回偏微分すると、

$$ \begin{aligned} \left[\frac{\partial f}{\partial x}\right]_{y} &= \frac{df}{dr}\left[\frac{\partial r}{\partial x}\right]_{y} \\ &= \frac{1}{r}\frac{x}{r} \\ &= \frac{x}{r^{2}} \end{aligned} $$

ここで、変数を固定しない微分は全微分であること。すなわち、

$$ \left[\frac{\partial f}{\partial r}\right] = \frac{df}{dr} $$

を用いた。

もう一度、$x$で偏微分すると、

$$ \begin{aligned} \left[\frac{\partial}{\partial x} \frac{x}{r^{2}}\right]_{y} &= \left[\frac{\partial}{\partial r}\frac{x}{r^{2}}\right]_{x}\left[\frac{\partial r}{\partial x}\right]_{y} + \left[\frac{\partial}{\partial x}\frac{x}{r^{2}}\right]_{r}\left[\frac{\partial x}{\partial x}\right]_{y} \\ &= -\frac{2x}{r^{3}}\frac{x}{r}+\frac{1}{r^{2}}1 \\ &= -\frac{2x^{2}}{r^{4}} + \frac{1}{r^{2}} \end{aligned} $$

$y$で偏微分すると、

$$ \begin{aligned} \left[\frac{\partial}{\partial y} \frac{x}{r^{2}}\right]_{x} &= \left[\frac{\partial}{\partial r}\frac{x}{r^{2}}\right]_{x}\left[\frac{\partial r}{\partial y}\right]_{x} + \left[\frac{\partial}{\partial x}\frac{x}{r^{2}}\right]_{r}\left[\frac{\partial x}{\partial y}\right]_{x} \\ &= -\frac{2x}{r^{3}}\frac{y}{r}+\frac{1}{r^{2}}0 \\ &= -\frac{2xy}{r^{4}} \end{aligned} $$

$\left[\frac{\partial}{\partial y} \frac{x}{r^{2}}\right]_{x} \neq 0$に注意。$x$は固定されているが、$r$が固定されていない。

双対空間と計量テンソル

双対空間については前回の記事を参照。

babyron64.hatenablog.com

この記事では前回の記事と同様に、

  • $V$: n次元ベクトル空間
  • $V^{*}$: Vの双対空間
  • $\mathbb{R}^{n}$: n次元実数ベクトル空間
  • $E = \{e_{i}\}_{i=1 \dots n}$: $\mathbb{R}^{n}$の自然な基底

とする。

また、前回の記事で定義した、

  • $V$の基底$W=\{w_{i}\}_{i=1 \dots n}$
  • 同型写像$\pi_{W}: V \to \mathbb{R}^{n}$
  • 同型写像$\phi: \mathbb{R}^{n} \to \mathbb{R}^{n*}$
  • 同型写像$\pi^{*}_{W}: \mathbb{R}^{n*} \to V^{*}$
  • 基底$W$が導く内積$<,>_{W}$

も断りなく用いる。

同型写像については特に、

$$ V \overset{\pi_{W}}{\cong} \mathbb{R}^{n} \overset{\phi}{\cong} \mathbb{R}^{n*} \overset{\pi^{*}_{W}}{\cong} V^{*} $$

となっている。

さらに、ベクトル空間の内積は実数となるものに限る。

計量テンソル

内積 -> 計量テンソル

$V$の元$x$と$y$の内積を考える。

$$ \begin{aligned} x &= a^{i}w_{i}\\ y &= b^{i}w_{i} \end{aligned} $$

となっている時、

$$ \begin{aligned} <x, y> &= <a^{i}w_{i}, b^{j}w_{j}> \\ &= a^{i}b^{j}<w_{i}, w_{j}> \end{aligned} $$

と変形できる。

ここで、$g_{ij} := <w_{i}, w_{j}>$によってテンソル$G = (g_{ij})_{ij}$を定めると、

$$ <x, y> = a^{i}b^{j}g_{ij} $$

となる。

このテンソル$G$を計量テンソルという。

ここで定義した計量テンソル$G$は、内積$<,>$に依存することに注意。つまり、ベクトル空間に対して計量テンソルが一意に定まるわけではない。

計量テンソル -> 内積

計量テンソルから内積を導くこともできる。

計量テンソル$G$が与えられた時、内積$<,>_{G}$を、

$$ <a^{i}w_{i}, b^{j}w_{j}>_{G} = a^{i}b^{i}g_{ij} $$

これを、計量テンソル$G$から導かれた内積ということにする。

双対空間との関係

$x \in V$について、写像$f_{x}: V \to \mathbb{R}$を、

$$ f_{x}(y) = <x, y> $$

で定める。すると、$f_{x}$は線型汎函数となるので、$f_{x} \in V^{*}$である。

$x \in V$を$V^{*}$に写す自然な写像$\theta: V \to V^{*}$は、

$$ \theta = \pi^{*-1}_{W} \circ \phi \circ \pi_{W} $$

と書ける。これは構成から明らかに同型写像である。

ここで、内積として$<,>_{W}$を考えると、

$$ \begin{aligned} \pi^{*-1}_{W} \circ \phi \circ \pi_{W}(a^{i}w_{i}) &= \pi^{*-1}_{W} \circ \phi(a^{i}e_{i}) \\ &= \pi^{*-1}_{W}(f) \\ &= f \circ \pi_{W} \\ &= g \\ where \ \forall i \ g(w_{i}) = a^{i} \end{aligned} $$

となるが、

$$ \begin{aligned} &\forall i, j \ \theta(w_{i})(w_{j}) = f_{w_{i}}(w_{j}) \\ \Rightarrow &\forall i \ \theta(w_{i}) = f_{w_{i}} \end{aligned} $$

より、

$$ \theta(x) = f_{x} $$

である。

ARMのセミホスティング(--specs=ridmon.specsオプション)

https://qiita.com/takahashim/items/120d69a44a80d08b70e7から始めよう。この記事によると、ridmonとはRDI(Remote Debug Interface) MONitorの略らしい。そしてこの記事の中にあるリンク[ https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=libgloss/arm/syscalls.c;hb=HEAD ]を辿る。このコードの中の、writeシステムコールに対応すると思われる_writeサブルーチンがどう実行されるのかを調べる。

/* fd, is a user file descriptor. */
int __attribute__((weak))
_write (int    fd,
     const void * ptr,
     size_t    len)
{
    int res;
    struct fdent *pfd;

    pfd = findslot (fd);
    if (pfd == NULL)
    {
       errno = EBADF;
       return -1;
    }

    res = _swiwrite (pfd->handle, ptr,len);

    /* Clearly an error. */
    if (res < 0)
        return -1;

    pfd->pos += len - res;

    /* We wrote 0 bytes? 
      Retrieve errno just in case. */
    if ((len - res) == 0)
        return error (0);

    return (len - res);
}

fdとはFile Descriptor、fdentはFile Descriptor ENTryのことだろう。fdent構造体は、以下のように定義されている。

/* Struct used to keep track of the file position, just so we
    can implement fseek(fh,x,SEEK_CUR).  */
struct fdent
{
    int handle;
    int pos;
};

findslotサブルーチンは、

/* Return a pointer to the structure associated with
the user file descriptor fd. */ 
static struct fdent*
findslot (int fd)
{
    CHECK_INIT(_REENT);

    /* User file descriptor is out of range. */
    if ((unsigned int)fd >= MAX_OPEN_FILES)
        return NULL;

    /* User file descriptor is open? */
    if (openfiles[fd].handle == -1)
        return NULL;

    /* Valid. */
    return &openfiles[fd];
}

となっているが、openfiles配列が何を格納しているかわからないと読み解けない。openfiles配列は、

void
initialise_monitor_handles (void)
{
    int i;

    /* Open the standard file descriptors by opening the special
    * teletype device, ":tt", read-only to obtain a descritpor for
    * standard input and write-only to obtain a descriptor for standard
    * output. Finally, open ":tt" in append mode to obtain a descriptor
    * for standard error. Since this is a write mode, most kernels will
    * probably return the same value as for standard output, but the
    * kernel can differentiate the two using the mode flag and return a
    * different descriptor for standard error.
    */

    int volatile block[3];

    block[0] = (int) ":tt";
    block[2] = 3;     /* length of filename */
    block[1] = 0;     /* mode "r" */
    monitor_stdin = do_AngelSWI (AngelSWI_Reason_Open, (void *) block);

    for (i = 0; i < MAX_OPEN_FILES; i ++)
        openfiles[i].handle = -1;

    if (_has_ext_stdout_stderr ())
    {
        block[0] = (int) ":tt";
        block[2] = 3;     /* length of filename */
        block[1] = 4;     /* mode "w" */
        monitor_stdout = do_AngelSWI (AngelSWI_Reason_Open, (void *) block);

        block[0] = (int) ":tt";
        block[2] = 3;     /* length of filename */
        block[1] = 8;     /* mode "a" */
        monitor_stderr = do_AngelSWI (AngelSWI_Reason_Open, (void *) block);
    }

    /* If we failed to open stderr, redirect to stdout. */
    if (monitor_stderr == -1)
        monitor_stderr = monitor_stdout;

    openfiles[0].handle = monitor_stdin;
    openfiles[0].pos = 0;

    if (_has_ext_stdout_stderr ())
    {
        openfiles[1].handle = monitor_stdout;
        openfiles[1].pos = 0;
        openfiles[2].handle = monitor_stderr;
        openfiles[2].pos = 0;
    }
}

どうやら、do_AngelSWIでファイルを開いているようだ。標準入出力および標準エラー出力のfile descriptorは0、1、2となっていて、普通のunixと同じだ。また、それぞれにはfdent構造体のインスタンスが割り当てられ、そのhandleはdo_AngelSWIの返り値となっている。do_AngelSWIについては、後で中身を追って見る。

話を戻そう。_writeのなかには、

pfd = findslot (fd);
...
res = _swiwrite (pfd->handle, ptr,len);

という部分がある。どうやらここがwriteの処理のようだ。今までの話から、pdf->handleはfdによって示されたファイルのhandlerであると思われる。ptrはおそらく書き込む内容が格納されているアドレス、lenは書き込むバイト長だろう。これを頭において、_swiwriteの中身を見て見る。

/* fh, is a valid internal file handle.
    Returns the number of bytes *not* written. */
int
_swiwrite (
            int    fh,
            const void * ptr,
            size_t    len)
{
    int block[3];

    block[0] = fh;
    block[1] = (int) ptr;
    block[2] = (int) len;

    return checkerror (do_AngelSWI (AngelSWI_Reason_Write, block));
}

またしても、do_AngelSWIが現れた。do_AngelSWIのSWIとは、ARMの命令セットから推測するに、SoftWare Interruptの略だろう。このように仮定すると、block配列はおそらくdo_AngelSWIによって呼び出される割り込みハンドラに渡す引数を格納しているのだろう。

さて、do_AngelSWIを読むとしますか。do_AngelSWIは別ファイル[ https://chromium.googlesource.com/native_client/nacl-newlib/+/590577e/newlib/libc/sys/arm/syscalls.c#106 ]にある。

static inline int
do_AngelSWI (int reason, void * arg)
{
    int value;
    asm volatile ("mov r0, %1; mov r1, %2; " AngelSWIInsn " %a3; mov %0, r0"
         : "=r" (value) /* Outputs */
         : "r" (reason), "r" (arg), "i" (AngelSWI) /* Inputs */
         : "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
          /* Clobbers r0 and r1, and lr if in supervisor mode */);
                  /* Accordingly to page 13-77 of ARM DUI 0040D other registers
                     can also be clobbered.  Some memory positions may also be
                     changed by a system call, so they should not be kept in
                     registers. Note: we are assuming the manual is right and
                     Angel is respecting the APCS.  */
    return value;
}

インラインアセンブリが出てきた。この書き方はgcc拡張[ https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html ]だ。先ほど見た呼び出し部によると、reason = AngelSWI_Reason_Write, arg = blockだった。

アセンブリの内容を見る前に、AngelSWIInsnとAngelSWIが何を指しているのか調べる。その定義は[ http://jsdkk.net/download/jde/jde5x/JDE544/samples/Checked_by_v54/H8S2215-P10/printf/include/swi.h ]に書いてある。thumbを使っていないとすると、

#define AngelSWI_ARM            0x123456
#define AngelSWI           AngelSWI_ARM

だそうだ。つまり、AngelSWI = 0x123456。またおかしな数字が出てきた。AngelSWIInsnの方は、

#define AngelSWIInsn            "swi"

だった。同じファイルにAngelSWI_Reason_Writeも定義してあり、

#define AngelSWI_Reason_Write       0x05

であった。つまり、実際に実行されるアセンブリは、

mov r0, 0x05
mov r1, block
swi 0x123456
mov value, r0

といった感じか。そして、value (=r0)が返される。これはおそらく、割り込みルーチンの返り値だろう。実際、この値は_swiwrite内で、

return checkerror (do_AngelSWI (AngelSWI_Reason_Write, block));

というように、checkerrorに渡される。checkerrorは、[ https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=libgloss/arm/syscalls.c;hb=HEAD ]において、

/* Check the return and set errno appropriately. */
static int
checkerror (int result)
{
    if (result == -1)
        return error (-1);
    return result;
}

と定義されているので、割り込みルーチンの返り値が、慣例的にエラーを表す-1でないことを確かめている。さて、次はswi命令について見ていこう。ARMのマニュアル[ http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0210c/CIHFJDDH.html ]によると、

The Software Interrupt instruction (SWI) is used to enter Supervisor mode, usually to request a particular supervisor function.

また、ARMの命令セットのマニュアル[ http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/BABFCEEG.html ]によると、

Syntax SWI immed_8 where: immed_8 is a numeric expression evaluating to an integerin the range 0-255. Usage The SWI instruction causes a SWI exception. This means that the processor state changes to ARM, the processor mode changes to Supervisor, the CPSR is saved to the Supervisor Mode SPSR, and execution branches to the SWI vector (see the Handling Processor Exceptions chapter in ADS Developer Guide). immed_8 is ignored by the processor. However, it is present in bits[7:0] of the instruction opcode. It can be retrieved by the exception handler to determine what service is being requested.

とのことだ。文中のCPSRとは、カレントプログラム状態レジスタ、SPSRとは、セーブドプログラム状態レジスタのことだ([ http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ij/CEGIBCCG.html ]参照)。swiの詳しい実行過程については、[ http://www.riscos.com/support/developers/prm/swis.html ]にかいてある(以下)。

Although in general you don't need to know how a SWI is decoded and executed, there are some more advanced cases where you will need to know more. This is what happens:

  1. The contents of R15 are saved in R14_svc (the SVC mode subroutine link register).
  2. The M0 and M1 bits of R15 are set (the processor is forced to SVC mode) and the I bit is also set (IRQ is disabled).
  3. The PC bits of R15 are forced to &08.
  4. The instruction at &08 is fetched and executed. It is normally a branch to the code that RISC OS uses to decode SWIs.

0x8番アドレスには、NMI_Handleが置かれている。--ridmon.specsオプションをつけると、NMI_Handleの定義がリンクされて、SWIがうまくハンドルされるのだろう。先ほど値を格納していたr0、r1は、割り込みルーチンの第一、第二引数となるようだ。割り込みルーチンの仕様は、[ http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471c/Bgbjhiea.html ]に書いてある通り、r0ではoperation typeを渡す。また、r1にblockを格納する理由は、[ http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471c/Bgbjhiea.html ]に書いてあるように、semi-hostingの仕様のためである。

The semihosting interface is common across all debug agents provided by ARM.

(from) [ http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471c/Bgbjhiea.html ]

なんか、中途半端な感じになってしまったが、ここで今日は終わり。詳しい情報は、newlibとかsemi-hostingとかでググると得られる。

双対空間

この記事では、

  • $V$: n次元ベクトル空間*1
  • $V^{*}$: Vの双対空間
  • $\mathbb{R}^{n}$: n次元実数ベクトル空間
  • $E = \{e_{i}\}_{i=1 \dots n}$: $\mathbb{R}^{n}$の自然な基底

表現ベクトル

$V$と$\mathbb{R}^{n}$は同型である。 そのため、$V$の元に$\mathbb{R}$の元の表示$(a^{1}, \dots , a^{n})$を対応させることができる。

$V$と$\mathbb{R}^{n}$が同型であることの証明

$W = \{w_{i}\}_{i=1 \dots n}$を$V$の基底とする。

$x \in V$は基底を用いて、

$$ x = a^{i}w_{i} $$

と表せる。

写像$\pi_{W}: V \to \mathbb{R}^{n}$を、

$$ \pi_{W}(a^{i}w_{i}) = a^{i}e_{i} $$

で定める。すると、$\pi_{W}$は同型写像となる。

$\pi_{W}$が同型写像であることの証明

  • 加法を保つ

$$ \begin{aligned} \pi_{W}(a^{i}w_{i}+b^{i}w_{i}) &= \pi_{W}( (a^{i}+b^{i})w_{i}) \\ &= (a^{i}+b^{i})e_{i} \\ &= a^{i}e_{i} + b^{i}e_{i} \end{aligned} $$

$$ \begin{aligned} \pi_{W}(c(a^{i}w_{i})) &= \pi_{W}( (ca^{i})w_{i}) \\ &= (ca^{i})e_{i} \\ &= c(a^{i}e_{i}) \end{aligned} $$

$\pi_{W}$が全単射であることは明らかなので、$\pi_{W}$は同型写像である。

表現ベクトル

このように、$V$の基底$W$から同型写像$\pi_{W}: V \to \mathbb{R}^{n}$が自然に導かれる。 $V$の元$x$に対し$\pi_{W}$によって得られる$\mathbb{R}^{n}$の元を、$W$が導く$x$の表現ベクトルということにする。

表現ベクトルから導かれる内積

表現ベクトルは数ベクトルなので、自然な内積がある。これを$V$の内積とみたものを、$W$が導く$V$の内積ということにし、$<,>_{W}$で表す。

すなわち、$x, y \in V$について、

$$ <x, y>_{W} := <\pi_{W}(x), \pi_{W}(y)> $$

双対空間

$V$の線型汎函数全体の集合を$V$の双対空間といい、$V^{*}$と書く。

線型汎函数

ベクトル空間の元を係数体に写す線形写像を、線型汎函数という。

例えば、

$$ \begin{aligned} &f: \mathbb{R}^{n} \to \mathbb{R} \ &st. a^{i}e_{i} \mapsto a^{1} \end{aligned} $$

とか。

双対空間がベクトル空間であることの証明

$V^{*}$上の演算の定義

$x \in V$、$f, g \in V^{*}$について、

  • 加法 $$ (f+g)(x) = f(x) + g(x) $$

  • スカラー倍 $$ (af)(x) = af(x) $$

$V^{*}$がベクトル空間であることの証明

$x, y \in V$、$f, g \in V^{*}$をとる。

$$ \begin{aligned} (af+bg)(px+qy) &= (af)(px+qy)+(bg)(px+qy) \\ &= af(px+qy)+bg(px+qy) \\ &= apf(x) + aqf(y) + bpf(x) + bqf(y) \\ &= p(af(x)+bg(x)) + q(af(y)+bg(y)) \\ &= p( (af)(x)+(bg)(x) ) + q( (af)(y)+(bg)(y) ) \\ &= p(af+bg)(x) + q(af+bg)(y) \end{aligned} $$

$V$と$V^{*}$が同型であることの証明

ベクトル空間$V$をそのまま扱うのは大変なので、$\mathbb{R}^{n}$で話を進める。$V$と$\mathbb{R}^{n}$が同型であることは示したので、$\mathbb{R}^{n}$で成立したことは、$V$でも成立することが分かる。

例えば、$V^{*}$と$\mathbb{R}^{n*}$は同型である。一応証明すると、

$V^{*}$と$\mathbb{R}^{n*}$が同型であることの証明

写像$\pi^{*}_{W}: V^{*} \to \mathbb{R}^{n*}$を、

$$ \pi^{*}_{W}(f) = f \circ \pi^{-1}_{W} $$

で定める。$f$と$\pi_{W}$は共に線形なので、$f \circ \pi_{W}$は$\mathbb{R}^{n*}$の元になっている(well-defined)。

準同型であることは明らか。

$$ \pi^{*-1}_{W}(v) = v \circ \pi_{W} $$

という逆写像が存在するので、$\pi^{*}_{W}$は全単射

よって、$\pi^{*}_{W}$は同型写像である。

$\mathbb{R}^{n}$と$\mathbb{R}^{n*}$が同型であることの証明

$f, g \in \mathbb{R}^{n*}$について、$f, g$は線形なので、

$$ \forall i = 1 \dots n f(e_{i}) = g(e_{i}) \Rightarrow f = g $$

写像$\phi: \mathbb{R}^{n*} \to \mathbb{R}^{n}$を、

$$ \phi(f) = f(e_{i})e_{i} $$

で定義する。

$\phi$が同型写像であることの証明

$f \in \mathbb{R}^{n*}$に対して、$v = \phi(f)$とすれば、

$$ \forall i = 1 \dots n ve_{i} = f(e_{i}) $$

より、$f(x) = vx$が成り立つので、準同型写像であることは明らか。

また、$\phi$が単射であることも明らか。数ベクトルの内積は線形なので、全射も明らか。

よって、$\phi$は同型写像である。

以上の議論により、

$$ V \overset{\pi_{W}}{\cong} \mathbb{R}^{n} \overset{\phi}{\cong} \mathbb{R}^{n*} \overset{\pi^{*}_{W}}{\cong} V^{*} $$

*1:数ベクトルとは限らないことに注意。つまり、$(a_{1}, \dots, a_{n})$とかではない。

多変数関数の微分

この記事では、Einsteinの縮約規則を使っています。

微分

$f: \mathbb{R} \to \mathbb{R}$の場合

$$ df = \frac{df}{dx}dx $$

tでの微分を考える

$$ \frac{df}{dt} = \frac{df}{dx}\frac{dx}{dt} $$

これは、chain rule。

$f: \mathbb{R}^{n} \to \mathbb{R}$の場合

$$ df = \frac{\partial f}{\partial x_{i}} dx_{i} $$

一階テンソルを使うと、

$$ df = \left[ \begin{array}{ccc} \frac{\partial f}{\partial x_{1}} & \dots & \frac{\partial f}{\partial x_{n}} \end{array} \right] \left[ \begin{array}{c} dx_{1} \\ \vdots \\ dx_{n} \end{array} \right] $$

ベクトル解析の記号を使うと、

$$ \begin{aligned} df &= \nabla f \cdot d\mathbf{x} \\ &= grad f \cdot d\mathbf{x} \end{aligned} $$

$f: \mathbb{R}^{n} \to \mathbb{R}^{m}$の場合

各成分は独立して計算できるから、

$$ df_{i} = \frac{\partial f_{i}}{\partial x_{j}} dx_{j} $$

二階テンソルを使うと、

$$ \left[ \begin{array}{c} df_{1} \\ \vdots \\ df_{m} \end{array} \right] = \left[ \begin{array}{ccc} \frac{\partial f_{1}}{\partial x_{1}} & \dots & \frac{\partial f_{1}}{\partial x_{n}} \\ \vdots & \ddots & \vdots \\ \frac{\partial f_{m}}{\partial x_{1}} & \dots & \frac{\partial f_{m}}{\partial x_{n}} \\ \end{array} \right] \left[ \begin{array}{c} dx_{1} \\ \vdots \\ dx_{n} \end{array} \right] $$

ここで、

$$ \left[ \begin{array}{ccc} \frac{\partial f_{1}}{\partial x_{1}} & \dots & \frac{\partial f_{1}}{\partial x_{n}} \\ \vdots & \ddots & \vdots \\ \frac{\partial f_{m}}{\partial x_{1}} & \dots & \frac{\partial f_{m}}{\partial x_{n}} \\ \end{array} \right] $$

はヤコビ行列

象徴的に書くと、

$$ d\mathbf{f} = J d\mathbf{x} $$

ベクトル解析の記号を使うと、

$$ df_{i} = \nabla f_{i} \cdot d\mathbf{x} $$

なので、

$$ df = \nabla \mathbf{f} d\mathbf{x} $$

となる。

上の式と比較して、

$$ J = \nabla \mathbf{f} $$

ここで、$\nabla$は$\mathbf{f}$を(ベクトルではない)値とみて作用させている

Talor展開

$f: \mathbb{R} \to \mathbb{R}$の場合

$$ \begin{aligned} f(x+\Delta x) &= \sum_{n=0}^{\infty}\frac{1}{n!}\frac{d^{n}}{dx^{n}}f(x)\Delta x^{n} \\ &= \sum_{n=0}^{\infty}\frac{1}{n!}\frac{d^{n}}{dx \dots dx}f(x) \Delta x \dots \Delta x \\ &= \sum_{n=0}^{\infty}\frac{1}{n!}\left(\Delta x \frac{d}{dx}\right)^{n}f(x) \end{aligned} $$

一次の項を取り出すと、

$$ df = dx\frac{df}{dx} $$

微分と一致

$f: \mathbb{R}^{n} \to \mathbb{R}$の場合

$f: \mathbb{R} \to \mathbb{R}$の場合を自然に拡張して、

$$ \begin{aligned} f(\mathbf{x}+\Delta \mathbf{x}) &= \sum_{n=0}^{\infty}\frac{1}{n!}\frac{\partial^{n}}{\partial x_{i_{1}} \dots \partial x_{i_{n}}}f(\mathbf{x}) \Delta x_{i_{1}} \dots \Delta x_{i_{n}} \\ &= \sum_{n=0}^{\infty}\frac{1}{n!}\left(\Delta x_{i}\frac{\partial}{\partial x_{i}}\right)^{n}f(\mathbf{x}) \\ &= \sum_{n=0}^{\infty}\frac{1}{n!}\left(\Delta \mathbf{x}\cdot\nabla\right)^{n}f(\mathbf{x}) \end{aligned} $$

一次の項を取り出すと、

$$ df = d\mathbf{x}\cdot\nabla f $$

微分と一致

$f: \mathbb{R}^{n} \to \mathbb{R}^{m}$の場合

$$ f_{i}(\mathbf{x}+\Delta \mathbf{x}) = \sum_{n=0}^{\infty}\frac{1}{n!}\left(\Delta \mathbf{x}\cdot\nabla\right)^{n}f_{i}(\mathbf{x}) $$

一次の項を取り出すと、

$$ df_{i} = d\mathbf{x}\cdot\nabla f_{i} $$

微分と一致

まとめ

$$ f(x+dx) = \sum_{n=0}^{\infty} \frac{1}{n!} d^{n}f(x) $$

ここで、$d^{n}f(x)$は$x$における$f$の$n$階全微分を表す。

例えば、多変数関数において、

$$ d^{2}f(\mathbf{x}) = \frac{\partial^{2}}{\partial x_{i}\partial x_{j}}f(\mathbf{x})dx_{i}dx_{j} $$

となる。ちなみに、$\left(\frac{\partial^{2}}{\partial x_{i}\partial x_{j}}f\right)_{i,j}$はHessian行列。

惑星の位置から時刻を求める

f:id:babyron64:20180828030304p:plain

上の図において、惑星が位置Pにいるときの時刻の求め方を紹介する。前提として、惑星の軌道は分かっているものとする。方針としては、元期以降に惑星の動径が掃いた面積を求め、それを面積速度で割ることで元期からの時間の経過を計算する。図中の点Oは楕円と円の中心、点Fは楕円の焦点である。さらに、惑星は反時計回りに公転するものとする。以降、焦点距離OFをfと書く。簡単のために、元期において惑星は長半径上の位置Sにいたとする。また、惑星の公転周期をTとし、軌道の離心率をeとする。

考察

図において灰色で塗られた部分が、惑星の動径が掃いた面積にあたるので、これを求める。楕円の性質から、頂点FPSで囲まれた灰色の部分の面積は、頂点FQSで囲まれた部分の面積の \frac{b}{a}倍である。また、頂点FQSで囲まれた部分の面積は、扇型OQSから三角形OQFを引いたものである。そして、三角形OQFの二辺は長さがaとfであり、そのなす角はEなので、面積は \frac{1}{2}af \sin E。最後にEは( 0 \leq E \leq \piに限るなら)、 \cos^{-1}(\frac{OH}{OQ})で求まる。

逆にたどると、

  1. 角E =  \cos^{-1}(\frac{OH}{OQ})
  2. 三角形OQF =  \frac{1}{2}af\sin E
  3. 扇型OQS =  \frac{1}{2}a^{2}E
  4. 偏扇型FQS = 扇型OQS - 三角形OQF =   \frac{1}{2}a^{2}E - \frac{1}{2}af\sin E
  5. 偏扇型FPS =  \frac{b}{a} x 偏扇型FQS =  \frac{1}{2}abE - \frac{1}{2}bf\sin E

となる。つぎに、Eの条件を外して一般化する。

一般的な解法

図において原点O、水平x軸(右が正)、鉛直y軸(上が正)とする座標を導入し、その座標でPが(x, y)となるとする。 まず、角Eを正確に求める。

  • yが負の時

角E =  -\cos^{-1}(\frac{OH}{OQ}) =  -\cos^{-1}(\frac{y}{a})

  • yが正の時

角E =  \cos^{-1}(\frac{OH}{OQ}) =  \cos^{-1}(\frac{y}{a})

後の計算は場合分けが不要なので、一気に求める。

偏扇型FPS =  \frac{1}{2}abE - \frac{1}{2}bf\sin E =  \frac{1}{2}ab(E - e \sin E)

惑星の面積速度は \frac{ab\pi}{T}なので、元期からの時間差dTは

dT =  \frac{1}{2}ab(E - e  \sin E)  \frac{T}{ab\pi} =  \frac{E - e \sin E}{2\pi}T

と求まる。

余談

この記事で求めた式

dT =  \frac{1}{2}ab(E - e  \sin E)  \frac{T}{ab\pi} =  \frac{E - e \sin E}{2\pi}T

というのは、これはケプラーの方程式

 M = E - e \sin E

の時間項を移項したものである。