BVector 0.2

いくつかのメソッドを追加しました。今回は結果を $\TeX$ で出力し、MathJax で整形しています。

実行結果

ソース

"expand source" を押すと展開されます。元に戻すには、このページを再ロードしてください。

bvector02.html

前回 JavaScript のソースファイルにあった テストに関する部分を抜き出して、HTML に埋め込みました。
<h2>実行結果</h2>
<div class="result">
<script type="text/javascript">
/**
 * 結果表示用の関数です。HTMLとして展開します。
 * @since 0.1
 */
function writeln(str) {
	document.writeln(str + "
"); } /** * テストの実行と表示を行う関数です。 * @since 0.1 */ function test(caption, exp, tex) { writeln(""); writeln(caption + " " + exp); writeln(""); var ans = eval(exp); if (isNaN(ans)) { writeln("$$" + tex + "=" + ans.toTeX() + "$$"); } else { writeln("$$" + tex + "=" + ans + "$$"); } } // テストのメインです。 test("コンストラクタ", "a = new BVector(0, 0, 1, 1)", "\\boldsymbol{a}"); test("コンストラクタ", "b = new BVector(0, 1, 0, 1)", "\\boldsymbol{b}"); test("要素", "a.getValue(3)", "(\\boldsymbol{a})_3"); test("論理和", "a.or(b)", "\\boldsymbol{a} \\vee \\boldsymbol{b}"); test("論理積", "a.and(b)", "\\boldsymbol{a} \\wedge \\boldsymbol{b}"); test("絶対値", "a.abs()", "\\left| \\boldsymbol{a} \\right|"); test("反転", "a.inv()", "\\overline{\\boldsymbol{a}}"); test("論理差", "a.diff(b)", "\\boldsymbol{a} - \\boldsymbol{b}"); test("排他的論理和", "a.xor(b)", "\\boldsymbol{a} \\oplus \\boldsymbol{b}"); test("ドット積", "a.dot(b)", "\\boldsymbol{a} \\cdot \\boldsymbol{b} = \\; ^t\\boldsymbol{a} \\boldsymbol{b}"); test("スカラとの積", "a.mul(0)", "\\boldsymbol{a} \\times 0"); </script> </div>

bvector02.js

ビット操作のためのマスクの配列 mask です。前回作った setValue 関数は不要であることが分かったので削除しました。
/**
 * BVector - 2進ベクトルオブジェクトの定義
 * @version 0.2
 * @author たかはしのんき
 * 
 */

// ビット操作のためのマスクを定義します。
var mask = new Array (
	0x80000000, 0x40000000, 0x20000000, 0x10000000,
	0x08000000, 0x04000000, 0x02000000, 0x01000000,
	0x00800000, 0x00400000, 0x00200000, 0x00100000,
	0x00080000, 0x00040000, 0x00020000, 0x00010000,
	0x00008000, 0x00004000, 0x00002000, 0x00001000,
	0x00000800, 0x00000400, 0x00000200, 0x00000100,
	0x00000080, 0x00000040, 0x00000020, 0x00000010,
	0x00000008, 0x00000004, 0x00000002, 0x00000001
	);
2進ベクトルオブジェクト BVector の定義です。メソッド clear と setValue を呼び出すようにしました。
/**
 * 2進ベクトルオブジェクト BVector を定義します。
 * @since 0.1
 */
BVector = function() {
	this.order = arguments.length;
	if (arguments.length == 1)
		this.order = arguments[0];
	this.bits = new Array(Math.ceil(this.order / 32.0));
	if (arguments.length == 1)
		this.clear();
	else
		for (var i = 1; i <= this.order; i++)
			this.setValue(i, arguments[i - 1]);
};

2進ベクトルをゼロクリアするメソッド BVector.clear() です。今回追加しました。
/**
 * 2進ベクトルをゼロクリアします。
 * @since 0.2
 */
BVector.prototype.clear = function() {
	for (var i = 0; i < this.bits.length; i++)
		this.bits[i] = 0;
};

ベクトルの指定した要素に値を設定するメソッド BVector.setValue() です。この中で処理するようにしました。
/**
 * 2進ベクトルオブジェクト BVector の要素 i に 0 か 1 の value を設定するメソッド
 * BVector.setValue(i, value) を定義します。
 * @param i 要素番号
 * @param value 設定する値
 * @since 0.1
 */
BVector.prototype.setValue = function(i, value) {
	var i0 = i - 1;		// 0 originに変換
	var i1 = i0 % 32;	// 剰余
	var i2 = Math.floor(i0 / 32);
	if (value == 1)
		this.bits[i2] |= mask[i1];
	else if (value == 0)
		this.bits[i2] &= ~mask[i1];
};

ベクトルの指定した要素 の値を取り出すメソッド BVector.getValue() です。変更ありません。
/**
 * 2進ベクトルオブジェクト BVector の要素 i の値を取り出すメソッド
 * BVector.getValue(i) を定義します。
 * @param i 要素番号
 * @return 値
 * @since 0.1
 */
BVector.prototype.getValue = function(i) {
	var i0 = i - 1;		// 0 originに変換
	var i1 = i0 % 32;	// 剰余
	var i2 = Math.floor(i0 / 32);
	return ((this.bits[i2] & mask[i1]) == 0) ? 0 : 1;
};

ベクトルオブジェクトをコピーするメソッド BVector.clone() です。変更ありません。
/**
 * 2進ベクトルオブジェクト BVector をコピーするメソッド
 * BVector.clone() を定義します。
 * @return 2進ベクトルのコピーを返します。
 * @since 0.1
 */
BVector.prototype.clone = function() {
	var bv = new BVector(this.order);
	for (var i = 0; i < this.bits.length; i++)
		bv.bits[i] = this.bits[i];
	return bv;
};

値が1の要素を数えるメソッド BVector.abs() です。今回追加しました。
/**
 * 2進ベクトルの値が1の要素を数え上げます。
 * @return 値が1の要素を数え上げた数を返します。
 * @since 0.2
 */
BVector.prototype.abs = function() {
	var n = 0;
	for (var i = 1; i &= this.order; i++)
		if (this.getValue(i) == 1)
			n++;
	return n;
};

反転したベクトルを返すメソッド BVector.inv() です。今回追加しました。
/**
 * 2進ベクトルを反転して(invert)返します。
 * @return ベクトルの反転を返します。
 * @since 0.2
 */
BVector.prototype.inv = function() {
	var bv = new BVector(this.order);
	var m1 = (this.order - 1) % 32;			// 剰余
	var mask1 = mask[m1];
	for (var mask2 = 0; mask1 != 0; mask1 <<= 1) {
		mask2 |= mask1;
		for (var i = 0; i < this.bits.length - 1; i++)
			bv.bits[i] = ~this.bits[i];
		bv.bits[i] = ~this.bits[i] & mask2;
	}
	return bv;
};

2つのベクトルが等しいかチェックするメソッド BVector.equals() です。今回追加しました。
/**
 * 2つの2進ベクトルが等しければtrueを返します。同じでないかエラーの場合はfalseを返します。
 * @param bv2 比較対象のベクトル
 * @return 2つのベクトルが等しければtrueを返します。
 * @since 0.2
 */
BVector.prototype.equals = function(bv2) {
{
	if (this.order != bv2.order)
		return false;				// 次元が異なる
	for (var i = 0; i < this.bits.length; i++)
		if (this.bits[i] != bv2.bits[i])
			return false;			// 値が異なる
	}
	return true;
};

ベクトル同士の論理和をとるメソッド BVector.or() です。変更ありません。
/**
 * 2進ベクトルオブジェクト bv2 との論理和をとるメソッド
 * BVector.or(bv2) を定義します。
 * @param bv2 論理和の第2オペランドを指定します。
 * @return bv2 との論理和を返します。
 * @since 0.1
 */
BVector.prototype.or = function(bv2) {
	if (this.order != bv2.order)
		return null;
	var bv = this.clone();
	for (var i = 0; i < this.bits.length; i++)
		bv.bits[i] |= bv2.bits[i];
	return bv;
};	

ベクトル同士の論理積をとるメソッド BVector.and() です。変更ありません。
/**
 * 2進ベクトルオブジェクト bv2 との論理積をとるメソッド
 * BVector.and(bv2) を定義します。
 * @param bv2 論理積の第2オペランドを指定します。
 * @return bv2 との論理積を返します。
 * @since 0.1
 */
BVector.prototype.and = function(bv2) {
	if (this.order != bv2.order)
		return null;
	var bv = this.clone();
	for (var i = 0; i < this.bits.length; i++)
		bv.bits[i] &= bv2.bits[i];
	return bv;
};	

論理差をとるメソッド BVector.diff() です。今回追加しました。
/**
 * 2進ベクトル同士の論理差を返します。エラーの場合はnullを返します。
 * @param bv2 論理差の第2オペランド
 * @return 2つのベクトルの論理差を返します。
 * @since 0.2
 */
BVector.prototype.diff = function(bv2) {
	if (this.order != bv2.order)
		return null;
	var bv = this.clone();
	for (var i = 0; i < this.bits.length; i++)
		bv.bits[i] &= ~bv2.bits[i];
	return bv;
};

ベクトル同士の排他的論理和をとるメソッド BVector.xor() です。今回追加しました。
/**
 * 2進行列同士の排他的論理和を返します。エラーの場合はnullを返します。
 * @param bv2 排他的論理和の第2オペランド
 * @return 2つの行列の排他的論理和を返します。
 * @since 0.2
 */
BVector.prototype.xor = function(bv2) {
	if (this.order != bv2.order)
		return null;
	var bv = this.clone();
	for (var i = 0; i < this.bits.length; i++)
		bv.bits[i] ^= bv2.bits[i];
	return bv;
};

ベクトルにスカラを掛けるメソッド BVector.mul() です。今回追加しました。
/**
 * ベクトルとスカラ(0か1)の積を返します。エラーの場合はnullを返します。
 * @param b2 積の第2オペランド
 * @return ベクトルとスカラの積を返します。
 * @since 0.2
 */
BVector.prototype.mul = function(b2) {
	if (b2 != 0 && b2 != 1)
		return null;
	var bv = new BVector(this.order);
	if (b2 == 0)
		return bv;	// 0 ベクトル
	else
		return this.clone();
};

ベクトル同士のドット積をとるメソッド BVector.dot() です。今回追加しました。一般ベクトルのドット積(内積)は $$\boldsymbol{a} \cdot \boldsymbol{b} = \sum_{i=1}^n \boldsymbol{a}_i \boldsymbol{b}_i$$ ですが、この2進ベクトルの場合のドット積は $$\boldsymbol{a} \cdot \boldsymbol{b} = \bigvee_{i=1}^n (\boldsymbol{a}_i \wedge \boldsymbol{b}_i)$$ になります。
/**
 * 2進ベクトル同士の積を返します。エラーの場合は-1を返します。
 * @param bv2 積の第2オペランド
 * @return 2つのベクトルの積を返します。
 * @since 0.2
 */
BVector.prototype.dot = function(bv2) {
	if (this.order != bv2.order)
		return -1;
	var b = 0;
	for (var i = 1; i <= this.order; i++)
		b |= (this.getValue(i) & bv2.getValue(i));
	return b;
};

ベクトル同士のクロス積をとるメソッド BVector.cross() です。今回追加しました。一般ベクトルのクロス積(外積)は $$(\boldsymbol{a} \times \boldsymbol{b})_{i,j} = \boldsymbol{a}_i \boldsymbol{b}_j$$ ですが、この2進ベクトルの場合のクロス積は $$(\boldsymbol{a} \times \boldsymbol{b})_{i,j} = \boldsymbol{a}_i \wedge \boldsymbol{b}_j$$ になります。
/**
 * 2進ベクトルと2進ベクトルの転置との積(クロス積)を返します。エラーの場合はnullを返します。
 * @param bv2 積の第2オペランド
 * @return 2つのベクトルのクロス積を返します。
 * @since 0.2
 */
BVector.prototype.cross = function(bv2) {
	if (this.order != bv2.order)
		return null;
	var bm = new BMatrix(this.order, this.order);
	for (var i = 1; i <= this.order; i++)
		for (var j = 1; j <= this.order; j++) {
			var b = this.getValue(i) & bv2.getValue(j);
			bm.setValue(i, j, b);
		}
	return bm;
};

ベクトルを文字列に変換するメソッド BVector.toString() です。変更ありません。
/**
 * 2進ベクトルオブジェクト BVector を文字列に変換するメソッド
 * BVector.toString() を定義します。
 * @return 文字列を返します。
 * @since 0.1
 */
BVector.prototype.toString = function() {
	var str = "(";
	for (var i = 0; i < this.order; i++) {
		str = str + this.getValue(i + 1);	// 1 origin に変換
		if (i < this.order - 1)
			str = str + ",";
	}
	str = str + ")";
	return str;
};

ベクトルを TeX 形式に変換するメソッド BVector.toTeX() です。今回追加しました。
/**
 * 2進ベクトルオブジェクト BVector をTeX形式に変換します。
 * @since 0.2
 */
BVector.prototype.toTeX = function() {
	var str = "\\begin{pmatrix}";
	for (var i = 0; i < this.order; i++) {
		str = str + this.getValue(i + 1);	// 1 origin に変換
		if (i < this.order - 1)
			str = str + "\\\\";
	}
	str = str + "\\end{pmatrix}";
	return str;
};

Powered by
SyntaxHighlighter MathJax W3C HTML5