2012-08-03

SCIP in C++11 ― 1.3.4節 その5


n乗根:問題1.45

平均緩和の繰り返しは、average-dampfunctionラッパで包めば、
repeatedが使える。そうやって調べてみると、数のn乗根に対し、
log2n回の平均緩和を必要とする模様( は床関数)。

すでに不動点探索で使った関数や、繰り返し関数は以前の通りなので略。
-----
const double nthRootFixed2(const double x,const int n)
{
    const function<function<double(double)>(function<double(double)>)>
        wrappedAverageDamp=averageDamp;
    const int nIteration(floor(log(static_cast<double>(n))/log(2.0)));
    return(fixedPointOfTransform([x,n](const double y){return(x/pow(y,n-1));},
                                 repeated(wrappedAverageDamp,nIteration),1.0));
}
const double sqrtFixed2(const double x)
{
    return(nthRootFixed2(x,2));
}
const double cbrtFixed2(const double x)
{
    return(nthRootFixed2(x,3));
}
const double qrrtFixed2(const double x)
{
    return(nthRootFixed2(x,4));
}

int main(int argc, char** argv)
{

    cout<<setprecision(16)<<"sqrt(2)="
        <<sqrtFixed2(2.0)<<endl;
    cout<<setprecision(16)<<"cbrt(2)="
        <<cbrtFixed2(2.0)<<endl;
    cout<<setprecision(16)<<"quartic-root(2)="
        <<qrrtFixed2(2.0)<<endl;

    const int n(128);
    cout<<setprecision(16)<<n<<"th-root(2)="
        <<nthRootFixed2(2.0,n)<<endl;

    return(0);
}
----
出力
----
sqrt(2)=1.414213562373095
cbrt(2)=1.259921032812682
quartic-root(2)=1.189207115002721
128th-root(2)=1.005429901112803

0 件のコメント :

コメントを投稿