其他分享
首页 > 其他分享> > 数论

数论

作者:互联网

矩阵乘法

可以把矩阵理解为二维数组,数存在里面,矩阵乘法的规则:A*B=C

实现代码如下:

const int N=50;
int c[N][N];
void multi(int a[N][N],int b[N][N],int n);
{
    memset(c,0,sizeof(c));
    for(int i=1;i<=n;i++)
    {
        for(int k=1;k<=n;k++)
        {
            if(a[i][k]==0) continue;
            for(int j=1;j<=n;j++)
            {
                c[i][j]+=a[i][k]*b[k][j];
            }
        }
    }

}

快速幂和矩阵快速幂

if(i&1)
{
    奇数....
}
else
{
    偶数...
}

exit(1):非正常运行导致退出程序;

return():返回函数,若在主函数中,则会退出函数并返回一值。

快速幂

long long res = 1;
// 进行快速幂运算,n 为当前的指数值,n 为 0 的时候运算结束
while (n) {
    // 用位运算的方式判断 n 是否为奇数,速度更快,等价于 n%2 
    if (n & 1) {
        // 如果 n 是奇数,那么需要将 x 存入运算结果中
        res *= x;
    }
    // 更新当前的 x 的值
    x *= x;
    // 用位运算的方式进行 n/2,速度更快,等价于 n/=2
    n >>= 1;
}

完整的代码如下:

#include <iostream>
#include <cstdlib>
using namespace std;

// 使用快速幂求出 x^n 的值并返回,不考虑高精度,请控制参数范围
double myPow(double x, int n) {
    // 任何不是 0 的数的 0 次幂为 1 
    if (x && n == 0) {
        return 1;
    } else if (x == 0 && n == 0) {
        exit(1);
    }
    // 如果 n 是负数,那么返回结果要进行处理 
    bool judge = false;
    if (n < 0) {
        judge = true;
        n = -n;
    }

    double res = 1;
    while (n) {
        // 用位运算的方式判断 n 是否为奇数,速度更快,等价于 n%2 
        if (n & 1) {
            res =res*res%p;
        }
        x = x*x%p;
        // 用位运算的方式进行 n/2,速度更快,等价于 n/=2
        n >>= 1;
    }
    // n 是负数?1.0/res 否则 res 
    if(judge)
    {
        return 1.0/res;
    }
    else
    {
        return res;
    }
} 

int main() {
    double x;
    int n;

    while (cin >> x >> n) {
        cout << myPow(x, n) << endl << endl; 
    } 

    return 0;
} 

矩阵快速幂代码如下


const int N=10;
int tmp[N][N];
void multi(int a[][N],int b[][N],int n)
{
    memset(tmp,0,sizeof tmp);
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        for(int k=0;k<n;k++)
        tmp[i][j]+=a[i][k]*b[k][j];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        a[i][j]=tmp[i][j];
}
int res[N][N];
void Pow(int a[][N],int n)
{
    memset(res,0,sizeof res);//n是幂,N是矩阵大小
    for(int i=0;i<N;i++) res[i][i]=1;
    while(n)
    {
        if(n&1)
            multi(res,a,N);//res=res*a;复制直接在multi里面实现了;
        multi(a,a,N);//a=a*a
        n>>=1;
    }

(代码借用了https://blog.csdn.net/wust_zzwh/article/details/52058209)

标签:return,运算,奇数,数论,res,int,用位
来源: https://www.cnblogs.com/LITTLESUNwl/p/10953125.html