This isn't as hard as it sounds. You start with a large equilatteral tetrahedron.
Here's some quick pseudocode to write a script and insert. Function names and parameters are approximate. This pseudocode assumes that the base is flat on the Z plane, and the forward lower edge is parallel with the Y axis.
on_rez(integer iParm)
{
if ( iParm == 0 )
return;
vector mySize = getScale()
setScale( <mysize.x/2, mysize.y/2, mysize.z/2>

;
lPos = llGetPos();
if ( iParm == 1 )
{
llSetPos( lPos + <0,0,mySize.z/4> );
}
else if ( iParm == 2 )
{
llSetPos ( lPos + < mySize.x/4, 0, -(mySize.z/4) > );
}
else if ( iParm == 3)
{
llSetPos ( lPos + < -(mySize.x/4), (mySize.y/4), -(mySize.z/4) > );
}
else
{
llSetPos ( lPos + < -(mySize.x/4), -(mySize.y/4), -(mySize.z/4) > );
}
if ( existsInInventory(llGetObjectName()) )
{
llRezObject(llGetObjectName(),<0,0,0>,<0,0,0>,1);
llRezObject(llGetObjectName(),<0,0,0>,<0,0,0>,2);
llRezObject(llGetObjectName(),<0,0,0>,<0,0,0>,3);
llRezObject(llGetObjectName(),<0,0,0>,<0,0,0>,4);
llDie();
}
}
Someone please correct me if my -4's are wrong, I don't have time to test this myself right now.
Now the fun part. Recursively place the tetrahedron into the inventory of itself for each iteration that you want the program to go through. So your parent would have a copy of itself in inventory, and that object, when rez'd would have one in ITS inventory, etc. The program stops when it reaches the bottom level object which has no copy in inventory.
Also, this isn't TERRIBLY prim intensive. Each iteration quadruples the number of prims, so the interations will go 1, 4, 16, 64, 256...
However, after five interations on a ten meter tall tetrahedron, the resulting prims will be .625 meters tall. Not microscopic, but detailed enough to make an interesting effect.