Mpl風味POW
template <unsigned long Val,unsigned long n,unsigned long s> struct SPow { enum { Value=SPow<Val*(n&1?s:1),n>>1,s*s>::Value }; }; template <unsigned long Val,unsigned long s> struct SPow<Val,1,s> { enum { Value=Val*s }; }; template <unsigned long Val,unsigned long s> struct SPow<Val,0,s> { enum { Value=Val }; }; //Value^nを求める template <unsigned long Value,unsigned long n> struct StaticPow { enum { Value=SPow<1,n,Value>::Value }; }; int _tmain(int argc, _TCHAR* argv[]) { unsigned long i=SaticPow<2,31>::Value; printf("%d\n",i); return 0; }
自乗乗算法の簡単なMPLとか作ってみる。
もちろんちゃんと即値に。
00401000 push 80000000h 00401005 push offset string "%d\n" (4060FCh) 0040100A call printf (401015h)
んで、これを何に使うかというと多倍長整数。
しかもFFTの条件となる桁数2^nを計算するだけw
動的に桁が増える多倍長整数はできあがってて
ただ、ランダムで選んだ256桁整数1つを素数チェックするのに2,3秒かかるので
遅すぎて使い物にならないぽい。
最終的にはRSAに使う鍵を生成するとして、10進256桁とすると
大体128桁くらいの素数を探せばいいのだろうから
やれないこともないと思うが、パフォーマンスをあげることを考えると
ある程度静的に固定した多倍長整数を作ったほうがいいかなーということで
しかもSSE2くらいは使って最適化したらもっと早いんじゃないかなーということで
妄想ひろがりんぐ