/** 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"] }