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くらいは使って最適化したらもっと早いんじゃないかなーということで
妄想ひろがりんぐ