
2) Don't limit yourself to cryptographic applications. Big numbers have applications in identification and other scientific fields. As such one might be perfectly content with fixed sized stack allocated [unsigned] int types. Ex. std::bitset<512> -> uint<512>
I agree on this
3) Think pluggable. Start with a standard C++ implementation even if it is slow as long as it work and then gradually, on latter releases, replace or allow choosing faster implementations. Who knows this might allow others to plug GMP or other implementations into it. THis may end up as a test case for the general numerical functions
library I'm trying to generate out of my Boost.SIMD proposal. In a large scope, it provides a large number of stub functions that are tag dispatched rather efficiently based on "arithmetic"-like value types. So basically, it defines 150+ functions that looks at their parameters and decide which implementation to use at compile-time. I use that to discriminate between scalar and SIMD functions, but if you "tag" this bignum class correctly and follow my extension mecanism, then we can statically choose between implementation. Roughly : bignum<> x; bignum<impl::gmp> y; x = abs(x); <-- call the "standard bignum" implementation y = abs(y); <-- call the GMP implementation
[Consider virtual functions, function pointers, facets. Most in past conversations have offered strong resistance to virtual functions.] The more is done at CT, the better so traits+ tag-disptach is the way to go compared to virtual functions.
-- ___________________________________________ Joel Falcou - Assistant Professor PARALL Team - LRI - Universite Paris Sud XI Tel : (+33)1 69 15 66 35