/** This is an attempt to speed up Java's BigDecimal class, specifically the
createAndStripZerosToMatchScale method. This method counts the number of
trailing zeros (in base 10) from a BigInteger. However, it is potentially
inefficient when there are a lot of trailing zeroes, because it
successively divides by 10 many times, which can be very slow.
This behavior can be seen when dividing, say, 1/3 by 2/3 which will
return 0.5. This can be orders of magnitude slower than dividing, say,
1/7 by 3/7 (which comes out to 0.3333333...)
The solution here is motivated by a procedure from here:
http://mathforum.org/library/drmath/view/55908.html
and some discussion here:
https://stackoverflow.com/questions/12356442/binary-divisibility-by-10
*/
countPowersOf10[n] :=
{
powersOfTwo = getLowestSetBit[n]
if powersOfTwo < 1
return 0
count = 0
while n > 0
{
lowWord = bitAnd[n, 2^20-1]
count = count + lowWord
n = shiftRight[n, 20]
}
if (count mod 25) == 0
return min[count, powersOfTwo]
else
return 0
}
for n = 1 to 2000
{
count = countPowersOf10[n]
if count > 0
println["$n\tcount:$count"]
}