ブログトップ 記事一覧 ログイン 無料ブログ開設

ヨーキョクデイ RSSフィード Twitter

2008-01-24 Thu

2 次正方行列の累乗の次数減らし

A=¥begin{pmatrix}a&b¥¥c&d¥end{pmatrix} なる 2 次正方行列があるとして、ケイリー・ハミルトンの定理 を使って A^n の次数を減らそうという試み。

¥alpha = a+d, ¥beta = ad-bc とすると、ケイリー・ハミルトンの定理より、

¥begin{align}A^2 &= (a+d)A-(ad-bc)E ¥¥ &= ¥alpha A-¥beta E ¥¥ ¥end{align}

¥begin{align}A^3 &= ¥alpha A^2-¥beta A ¥¥ &= ¥alpha(¥alpha A-¥beta E)-¥beta A ¥¥ &= (¥alpha^2 - ¥beta)A-¥alpha¥beta E ¥¥ ¥end{align}

¥begin{align}A^4 &= (¥alpha^2 - ¥beta)(¥alpha A-¥beta E)-¥alpha¥beta A ¥¥ &= (¥alpha^3-2¥alpha¥beta)A-(¥alpha^2 - ¥beta)¥beta E¥¥ ¥end{align}

¥begin{align}A^5 &= (¥alpha^3-2¥alpha¥beta)(¥alpha A-¥beta E)-(¥alpha^2 - ¥beta)¥beta A ¥¥ &= (¥alpha^4-3¥alpha^2¥beta+¥beta^2)A-(¥alpha^3-2¥alpha¥beta)¥beta E¥¥ ¥end{align}

¥begin{align}A^6 &= (¥alpha^4-3¥alpha^2¥beta+¥beta^2)(¥alpha A-¥beta E)-(¥alpha^3-2¥alpha¥beta)¥beta A ¥¥ &= (¥alpha^5-4¥alpha^3¥beta+3¥alpha¥beta^2)A-(¥alpha^4-3¥alpha^2¥beta+¥beta^2)¥beta E¥¥ ¥end{align}

¥begin{align}A^7 &= (¥alpha^5-4¥alpha^3¥beta+3¥alpha¥beta^2)(¥alpha A-¥beta E)-(¥alpha^4-3¥alpha^2¥beta+¥beta^2)¥beta A ¥¥ &= (¥alpha^6-5¥alpha^4¥beta+6¥alpha^2¥beta^2-¥beta^3)A-(¥alpha^5-4¥alpha^3¥beta+3¥alpha¥beta^2)¥beta E¥¥ ¥end{align}

¥begin{align}A^8 &= (¥alpha^6-5¥alpha^4¥beta+6¥alpha^2¥beta^2-¥beta^3)(¥alpha A-¥beta E)-(¥alpha^5-4¥alpha^3¥beta+3¥alpha¥beta^2)¥beta A ¥¥ &= (¥alpha^7-6¥alpha^5¥beta+10¥alpha^3¥beta^2-4¥alpha¥beta^3)A-(¥alpha^6-5¥alpha^4¥beta+6¥alpha^2¥beta^2-¥beta^3)¥beta E¥¥ ¥end{align}

となり、以上から類推すると

(A^n の E の係数)=(A^(n-1) の A の係数)β

が成り立ちそう。

また、

n 乗A の係数
8¥alpha^7-6¥alpha^5¥beta+10¥alpha^3¥beta^2-4¥alpha¥beta^3
7¥alpha^6-5¥alpha^4¥beta+6¥alpha^2¥beta^2-1¥cdot1¥beta^3
6¥alpha^5-4¥alpha^3¥beta+3¥alpha¥beta^2
5¥alpha^4-3¥alpha^2¥beta+1¥cdot1¥beta^2
4¥alpha^3-2¥alpha¥beta
3¥alpha^2-1¥cdot1¥beta
2¥alpha

を左下から右上方向に斜めに見ると二項定理っぽい。これから類推して、A^n の A の係数は

{}_{n-1}{¥rm C}_0¥alpha^{n-1} - {}_{n-2}{¥rm C}_1¥alpha^{n-3}¥beta + {}_{n-3}{¥rm C}_2¥alpha^{n-5}¥beta^2 - {}_{n-4}{¥rm C}_3¥alpha^{n-7}¥beta^3 + ¥cdots ¥¥ = ¥sum_{k=1} _{n-k}{¥rm C}_{k-1}¥alpha^{n-(2k-1)}(-¥beta)^{k-1}

総和の上限について、n-k ¥geq k-1 より ¥frac{n+1}{2} ¥geq k だから、

t_n = ¥sum_{k=1}^{¥lfloor ¥frac{n+1}{2} ¥rfloor} _{n-k}{¥rm C}_{k-1}¥alpha^{n-(2k-1)}(-¥beta)^{k-1}

とおくと、以上より次のようになりそうだ。

A^n=t_n A - t_{n-1}¥beta E

証明略。

という公式のようなものをかつて作ったときのノートを発掘したので、TeX 記法の練習を兼ねてここに書いてみたのだ。当時、A^3 のようなものも逐一 3 乗せずに C.H. の定理で次数を減らせということが盛んに叫ばれていたので、このように A^n の場合に一般化してみたんだった気がする。こういう役に立たない数列的な公式作りが高 3 当時の趣味で、周囲からは変な人だと思われていたのだろうけど、Graviness Blog を見ていたら当時の楽しさを思い出した次第。TeX まんどくせ。

Foxage2ch 改造

スレッド情報の mozStorage 化 ということで、bbs2chreaderスレッド情報の取得方法が変わり、従来よりも楽になった。これに伴って Foxage2ch の bbs2chreader との連携強化についての改造箇所も減った。Foxage2ch 2.6.2 でテスト。

--- foxage2ch.js.orig	2007-12-22 01:41:20.000000000 +0900
+++ foxage2ch.js	2008-01-23 00:34:22.000000000 +0900
@@ -581,19 +581,40 @@
 		while (resEnum.hasMoreElements()) {
 			var threadRes = resEnum.getNext().QueryInterface(Ci.nsIRDFResource);
 			var datName = foxage2chUtils.parseToDAT(threadRes.Value);
 			if (datName in aSubject) {
-				var lastNum = parseInt(foxage2chData.getProperty(threadRes, "lastNum") || 0);
+				var lastNum;
+				if ( foxage2ch.prefs.bbs2chreader ) {
+					var b2rStorageService = Cc["@bbs2ch.sourceforge.jp/b2r-storage-service;1"].getService(Ci.b2rIStorageService);
+					var boardURL = Cc['@mozilla.org/network/standard-url;1'].createInstance(Ci.nsIURL);
+					boardURL.spec = foxage2chUtils.parseToURL(aBoardRes);
+					var threadData = b2rStorageService.getThreadData(boardURL, datName);
+					lastNum = threadData ? threadData.lineCount : 0;
+				} else {
+					lastNum = parseInt(foxage2chData.getProperty(threadRes, "lastNum") || 0);
+				}
 				var newNum  = parseInt(aSubject[datName][1]);
 				foxage2chData.setProperty(threadRes, "lastNum", newNum.toString());
 				if (newNum > lastNum) {
 					foxage2chData.setProperty(threadRes, "status", "updated");
 					var title = foxage2chUtils.getRealTitle(foxage2chData.getProperty(threadRes, "title"));
-					var readNum = parseInt(foxage2chData.getProperty(threadRes, "readNum") || 0);
+					var readNum = foxage2ch.prefs.bbs2chreader ? lastNum : parseInt(foxage2chData.getProperty(threadRes, "readNum") || 0);
 					foxage2chData.setProperty(threadRes, "title", "[" + (newNum - readNum) + "] " + title);
 					foxage2chData.moveItem(threadRes, aBoardRes, aBoardRes, 1);
 					hit++;
+					continue;
+				} else if ( foxage2ch.prefs.bbs2chreader &&
+						(lastNum != parseInt(foxage2chData.getProperty(threadRes, "readNum") || 0))) {
+					foxage2chData.setProperty(threadRes, "readNum", lastNum);
+				}
+				if ( foxage2ch.prefs.bbs2chreader &&
+						(lastNum >= parseInt(foxage2chData.getProperty(threadRes, "readNum") || 0)) &&
+						(foxage2chData.getProperty(threadRes, "status") == "updated")) {
+					var title = foxage2chUtils.getRealTitle(foxage2chData.getProperty(threadRes, "title"));
+					foxage2chData.setProperty(threadRes, "status", "");
+					foxage2chData.setProperty(threadRes, "title", title);
 				}
+				foxage2ch.updateThreadCount(aBoardRes);
 			}
 			else {
 				foxage2chData.setProperty(threadRes, "status", "datout");
 			}

こんなんでいいはず。