ソラマメブログ

2008年06月25日

エラトステネスの篩(その2)

LSL NSieve Bits Benchmark - Second Life Wiki
-----
の 篩にビット列を使う方 も試してみました
-----

-----
若干速い? w
-----
リストもあげておきます
//
// File: NSieve2.lsl
// Date Author number of nodes
// 2008/6/25 walkinglint 68
//
//
// The Great Computer Language Shootout
// http://shootout.alioth.debian.org/
//
// contributed by Isaac Gouy
// modified by Babbage Linden
//
string hexc = "0123456789ABCDEF";
string setBitArray(integer numbits) {
string result = "";
integer i;
for (i = 0; i < numbits; i += 4) {
result += "F";
}
result += "F";
return result;
}
string replace(string s, integer index, string char) {
string result = "";
if (index >= 1) {
result += llGetSubString(s, 0, index - 1);
}
result += char;
if (index < (llStringLength(s) - 1)) {
result += llGetSubString(s, index + 1, -1);
}
return result;
}
integer get(string s, integer index) {
integer charIndex = index / 4;
integer bitIndex = index % 4;
integer bits = (integer)("0x" + llGetSubString(s, charIndex, charIndex));
return bits & (1 << bitIndex);
}
string set(string s, integer index) {
integer charIndex = index / 4;
integer bitIndex = index % 4;
integer bits = (integer)("0x" + llGetSubString(s, charIndex, charIndex));
bits = bits | (1 << bitIndex);
return replace(s, charIndex, llGetSubString(hexc, bits, bits));
}
string unset(string s, integer index) {
integer charIndex = index / 4;
integer bitIndex = index % 4;
integer bits = (integer)("0x" + llGetSubString(s, charIndex, charIndex));
integer mask = 0xF & ~(1 << bitIndex);
bits = bits & mask;
return replace(s, charIndex, llGetSubString(hexc, bits, bits));
}
test() {
integer m = 128;
string bits = setBitArray(m);
integer count = 0;
integer i;
for (i = 2; i <= m; i++) {
if (get(bits, i)) {
integer k;
for (k = i + i; k <= m; k += i) {
bits = unset(bits, k);
}
count++;
}
}
llSay(0, "Primes up to " + (string)m + " " + (string)count);
}
time() {
llResetTime();
llSay(0, "Starting tests...");
test();
llSay(0, "Finished tests in " + (string)llGetTime() + "s");
}
default {
state_entry() {
time();
}
touch_start(integer num) {
time();
}
}
あれ? なんで 4? とか思ってしまった...
-----
0 1 からなる情報をコンパクトに持ちたい時 流用できそうですね w

同じカテゴリー(walking のスクリプティング講座)の記事
 プロフィール写真の表示に問題 (2009-11-30 20:55)
 ミニ太陽系 (2009-03-21 06:03)
 関数から文字列を返したら何か問題になる? (2009-03-18 18:02)
 llListFindList って型って関係ないんだったっけ (2009-03-18 14:02)
 夏時間(PDT)の実験 (2009-03-08 22:04)
 15パズルの作り方(その3) (2009-03-08 06:03)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。