LSL NSieve Bits Benchmark
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
//
// 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();
}
}