编译处理大数的时间斐波那契

时间:2015-07-19 18:58:24

标签: c++ metaprogramming fibonacci

我正在玩这个compile time implementation

我使用ttmath.org来处理大数字。 ttmath::UInt<SIZE>适用于运行时fib()功能,但是 我不知道如何为我的元函数处理大数字,因为我必须更改非模板参数size_t

#include <iostream>
#include <omp.h>
#include <ctime>
#include "ttmath/ttmath.h"
#include <type_traits>

#define SIZE 1090

// how can I use ttmath here ?
template<size_t N>
struct fibonacci : std::integral_constant<size_t, fibonacci<N-1>{} + fibonacci<N-2>{}> {};

template<> struct fibonacci<1> : std::integral_constant<size_t,1> {};
template<> struct fibonacci<0> : std::integral_constant<size_t,0> {};


// ttmath here works well at run time !
ttmath::UInt<SIZE> fib(size_t n)
{
    ttmath::UInt<SIZE> a,b,c;
    a = 1, b = 1;
    for (size_t i = 3; i <= n; i++) {
        ttmath::UInt<SIZE> c = a + b;
        a = b;
        b = c;
    }           
    return b;
}

int main() {
    const size_t N = 500;
    if(1)
    {
    clock_t start = clock();
    std::cout <<  "Fibonacci(" << N << ") = " << fib(N) << std::endl;
    std::cout << "Time : " << (double)(clock() - start)/CLOCKS_PER_SEC << " s" << std::endl;
    }
    if(1)
    {
    clock_t start = clock();
    std::cout <<  "Fibonacci(" << N << ") = " << fibonacci<N>() << std::endl;
    std::cout << "Time : " << (double)(clock() - start)/CLOCKS_PER_SEC << " s" << std::endl;
    }
}

结果是:

  

Fibonacci(500)=   139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125个
  时间:0.003006 s
  斐波纳契(500)= 2171430676560690477
  时间:1.5e-05 s

那么有可能很容易为meta fibonacci提供ttmath吗?或者我应该采取不同的做法?

1 个答案:

答案 0 :(得分:1)

如果查看ttmath源代码,有一个long id = -1; try{ tcx = session.beginTransaction(); id = (Long) session.save(pBlindStructure); tcx.commit(); } catch( Throwable e){ tcx.rollback(); } finally{ session.close(); } return id; 的定义,它迭代uint数组UInt<N>::Add,代表table值,添加每个元素对并将溢出带到下一个迭代。基于此迭代,可以定义递归模板化实现,如下所示:

UInt<N>

添加就是斐波纳契所需要的一切