首页 > 编程语言 >欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理

欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理

时间:2024-03-27 21:03:03浏览次数:24  
标签:return int res 欧几里得 exgcd 算法 long LL 欧拉

 数据结构、算法总述:数据结构/算法 C/C++-CSDN博客


欧拉函数

欧拉函数(Euler's totient function)是一个与正整数n相关的数论函数,通常用φ(n)表示。定义为小于或等于n的正整数中与n互质的数的个数

int phi(int x)
{
    int res = x;
    for (int i = 2; i <= x / i; i ++ )
        if (x % i == 0)
        {
            res = res / i * (i - 1);
            while (x % i == 0) x /= i;
        }
    if (x > 1) res = res / x * (x - 1);

    return res;
}

筛法求欧拉函数

int primes[N], cnt;     // primes[]存储所有素数
int euler[N];           // 存储每个数的欧拉函数
bool st[N];         // st[x]存储x是否被筛掉


void get_eulers(int n)
{
    euler[1] = 1;
    for (int i = 2; i <= n; i ++ )
    {
        if (!st[i])
        {
            primes[cnt ++ ] = i;
            euler[i] = i - 1;
        }
        for (int j = 0; primes[j] <= n / i; j ++ )
        {
            int t = primes[j] * i;
            st[t] = true;
            if (i % primes[j] == 0)
            {
                euler[t] = euler[i] * primes[j];
                break;
            }
            euler[t] = euler[i] * (primes[j] - 1);
        }
    }
}

快速幂

求 m^k mod p,时间复杂度 O(logk)。

int qmi(int m, int k, int p)
{
    int res = 1 % p, t = m;
    while (k)
    {
        if (k&1) res = res * t % p;
        t = t * t % p;
        k >>= 1;
    }
    return res;
}

扩展欧几里得算法

// 求x, y,使得ax + by = gcd(a, b)
int exgcd(int a, int b, int &x, int &y)
{
    if (!b)
    {
        x = 1; y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y -= (a/b) * x;
    return d;
}

中国剩余定理及其扩展

typedef long long LL;

LL exgcd(LL a,LL b,LL &x,LL &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    LL d=exgcd(b,a%b,y,x);
    y -= (a/b) * x;
    return d;
}

LL CRT(LL m[],LL r[])
{
    LL m=1,ans=0;
    for(int i=1;i<=n;i++)  M*=m[i];
    for(int i=1;i<=n;i++)
    {
        LL c=M/m[i],x,y;
        exgcd(c,m[i],x,y);
        ans=(ans+r[i]*c*x%M)%M;
    }
    return (ans%M+M)%M;
}

typedef long long LL;

LL exgcd(LL a,LL b,LL &x,LL &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    LL d=exgcd(b,a%b,y,x);
    y -= (a/b) * x;
    return d;
}

LL EXCRT(LL m[],LL r[])
{
    LL m1,m2,r1,r2,p,q;
    m1=m[1],r1=r[1];
    for(int i=2;i<=n;i++)
    {
        m2=m[i],r2=r[i];
        LL d = exgcd(m1,m2,p,q);
        if((r2-r1)%d)  return -1;
        p=p*(r2-r1)/d;//特解
        p=(p%(m2/d)+m2/d)%(m2/d);
        r1=m1*p+r1;
        m1=m1*m2/d;
    }

    return (r1%m1+m1)%m1;
}

 

标签:return,int,res,欧几里得,exgcd,算法,long,LL,欧拉
From: https://blog.csdn.net/weixin_73225182/article/details/137088014

相关文章

  • DDPG强化学习算法应用到TORCS仿真平台
    一、DDPG算法介绍1.前身DQN算法在介绍DDPG算法之前,需要首先明确它的前身DQN算法。DQN(DeepQ-Network)是一种用于强化学习的深度学习算法,由DeepMind公司开发。它结合了深度学习和Q-learning算法,旨在解决复杂环境下的强化学习问题。DQN算法在解决复杂环境下的强化学习问题方面取......
  • 3.27 算法补全:行列式(扩展)
    行列式Ex海森堡矩阵行列式上海森堡阵是满足其次对角线下的值都为\(0\),即只有\(i\lej+1\)处的\(a_{i,j}\)的矩阵。上海森堡阵的行列式可以\(O(n^2)\)DP求解,因为在这个矩阵中选择一个不含\(0\)的排列,一定满足会形成如下形式:\(x,1,2,\dots,x-1\midy,x+1,\dots,y-1\mi......
  • 文心一言 VS 讯飞星火 VS chatgpt (223)-- 算法导论16.3 5题
    五、证明:如果我们将字母表中字符按频率单调递减排序,那么存在一个最优编码,其码字长度是单调递增的。文心一言:为了证明这个结论,我们可以使用霍夫曼编码(HuffmanCoding)作为示例,它是一种广泛使用的最优前缀编码方法。霍夫曼编码满足题目中的要求:如果我们将字母表中字符按频率......
  • Java开发千万别错过的好课程:Java版数据结构和算法+AI算法课程13
    AI人工智能时代,Java从业者必学科目精品课程推荐:Java版数据结构和算法+AI算法课程【点击开始学习】工作机会推荐和资源分享群:819391432学习地址:https://class.imooc.com/sale/fullstackalgo在当今数字时代,数据已成为驱动创新和决策的关键资源。为了在这个竞争激烈的世界......
  • 动态规划刷题(算法竞赛、蓝桥杯)--数字三角形(线性DP)
    1、题目链接:[USACO1.5][IOI1994]数字三角形NumberTriangles-洛谷#include<bits/stdc++.h>usingnamespacestd;intr;constintN=1010;inta[N][N];intmain(){ cin>>r; for(inti=1;i<=r;i++){ for(intj=1;j<=i;j++){ cin>>a[i][j]; ......
  • 网上的一个用C语言实现FFT算法
     用C语言实现FFT算法/*****************fftprograme*********************/#include"typedef.h"#include"math.h"structcompxEE(structcompxb1,structcompxb2){structcompxb3;b3.real=b1.real*b2.real-b1.imag*b2.imag;b3.imag=b1.real*b2.imag+b1.imag*b2.real;......
  • 网上看到的一个IIR算法,记录一下
    本帖最后由monkeynav于2013-8-2118:09编辑原帖刊载于ourdev:http://www.amobbs.com/thread-4165021-1-1.html原帖代码搞错,也无法编辑,很多人又找不到后面的更正,为了不误导更多人,就在这里重新发一遍。这里提供用于AVR和STM32的IIR滤波器代码下载,保证可用,不需要额外修改:------......
  • 学算法要读《算法导论》吗?
    这篇文章是我学习算法的心得,希望它能够给一些将要学习算法且准备要读大部头算法书籍的朋友一些参考,节省一些时间,也为了给经典的“黑皮书”祛魅,我觉得这些书籍在大部分互联网从业者心中已经不再是进步的阶梯,而是恐惧的阴影了,因为当一些学习路线中列出这些书目时,评论区多是调侃少是......
  • 支持向量机算法
    文章目录谷歌笔记本(可选)SMO高效优化算法谷歌笔记本(可选)fromgoogle.colabimportdrivedrive.mount("/content/drive")Mountedat/content/driveSMO高效优化算法importrandomdefloadDataSet(fileName):dataMat=[]labelMat=[]fr=open(fileN......
  • 极高创新性!基于斑马算法优化并行卷积神经网络注意力机制结合支持向量机ZOA-PCNN-AT-SV
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......