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