Math 如何计算2^n模100000007,n=10^9

Math 如何计算2^n模100000007,n=10^9,math,matrix,eigenvector,eigenvalue,exponentiation,Math,Matrix,Eigenvector,Eigenvalue,Exponentiation,什么是计算这个的最快方法,我看到一些人使用矩阵,当我在互联网上搜索时,他们谈论特征值和特征向量(不知道这些东西)…有一个问题归结为递归方程 f(n)=(2*f(n-1))+2和f(1)=1, n可能高达10^9。。。。 我已经尝试过使用DP,存储多达1000000个值,并使用常用的快速求幂方法,但都超时了 我在这些模问题上通常很弱,需要计算大的值 f(n) = (2*f(n-1)) + 2 with f(1)=1 相当于 (f(n)+2) = 2 * (f(n-1)+2) =

什么是计算这个的最快方法,我看到一些人使用矩阵,当我在互联网上搜索时,他们谈论特征值和特征向量(不知道这些东西)…有一个问题归结为递归方程 f(n)=(2*f(n-1))+2和f(1)=1, n可能高达10^9。。。。 我已经尝试过使用DP,存储多达1000000个值,并使用常用的快速求幂方法,但都超时了 我在这些模问题上通常很弱,需要计算大的值

f(n) = (2*f(n-1)) + 2 with f(1)=1
相当于

(f(n)+2) = 2 * (f(n-1)+2)
         = ...
         = 2^(n-1) * (f(1)+2) = 3 * 2^(n-1)
所以最后

f(n) = 3 * 2^(n-1) - 2

然后可以应用快速模幂法。

通过平方和乘法法进行模幂运算:

function powerMod(b, e, m)
    x := 1
    while e > 0
        if e%2 == 1
            x, e := (x*b)%m, e-1
        else b, e := (b*b)%m, e//2
    return x

计算2^n的C代码

    const int mod = 1e9+7;

    //Here base is assumed to be 2
    int cal_pow(int x){
        int res;
        if (x == 0) res=1;
        else if (x == 1)    res=2;
        else {
            res = cal_pow(x/2);
            if (x % 2 == 0) 
                res = (res * res) % mod;
            else
                res = (((res*res) % mod) * 2) % mod;
        }
        return res;
    }

什么语言/工具?通常,PowMod或ModPow函数执行此类计算。查看最快的方法是铅笔和纸:
140625001
这是一个反复出现的主题,只需搜索此特殊编号即可。例如,在对德语感兴趣的人的复制件中,我模糊地记得奥托·福斯特(Otto Forster)的教科书“Algorithmische Zahlentheorie”中所涉及的主题。这是一个惊人的解决方案,也许是的,但它仍然需要一些修改。对吗?没有检查结果,但是看到它的功能,您应该在进行所需更改时删除它,因为它不会产生直接结果!