Solution to Exercise 1.25:
Both the original and Alyssa’s version of expmod
give the same result, but Alyssa’s version has much poorer performance. Here is a table comparing times spent (in milliseconds) calculating fast-prime?
with the two different versions:
Prime number | Original | Alyssa’s |
---|---|---|
1009 | 608 | 2937 |
1013 | 578 | 3094 |
1019 | 687 | 2877 |
10007 | 874 | 93900 |
10009 | 875 | 92301 |
10037 | 749 | 94035 |
Times for Alyssa’s version are much higher than those for the original. Why is that?
As I couldn’t figure out how to get DrScheme’s profiler to measure time spent in built-in procedures such as remainder
and *
, I have to guess where the inefficiency is.
The original expmod
calculates its result incrementally, calling remainder
many times on relatively small values. Alyssa’s expmod
, on the other hand, builds up a huge intermediate value, which is then passed to remainder
once. My guess: because the numbers have grown so large in Alyssa’s version, the built-in operations, remainder
, *
, and /
are consuming much more time than they do in the original.
Moral of the story: arbitrary precision arithmetic can be expensive.