算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理

这篇具有很好参考价值的文章主要介绍了算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

欧拉函数

算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理,算法,c++,蓝桥杯,欧几里德,欧拉函数

算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理,算法,c++,蓝桥杯,欧几里德,欧拉函数

互质就是两个数的最大公因数只有1,体现到代码里面就是a和b互质,则b mod a = 1 mod a (目前我不是很理解,但是可以这样理解:a和b的最大公因数是1,即1作为除数和b作为除数时,对于被除数a来说余数是一样的,即1/a的余数和b/a是一样的,即b mod a = 1 mod a)
欧拉函数的作用是求1-n与n互质的个数

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#include <unordered_map>
using namespace std;

void get_eura(int x)
{
    int res = x;
    for (int i = 2; i <= x / i; ++ i)
    {
        if (x % i == 0)
        {
            //res = res * (1 - 1/i);或者res = res * (i - 1) / i;都不行,前者是浮点数1 后者会溢出
            res = res / i * (i - 1);
            while (x % i == 0)
            {
                x /= i;
            }
        }
    }
    if (x > 1) res = res / x * (x - 1);
    cout << res << endl;
}
void solve()
{
    int n;
    cin >> n;
    while (n -- )
    {
        int x;
        cin >> x;
        get_eura(x);
    }
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

AcWing 874. 筛法求欧拉函数

线性筛 + 欧拉函数(有一点推公式)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#include <unordered_map>
using namespace std;
const int N = 1e6 + 10;
int primes[N], st[N], eulers[N];
int cnt;
void get_eulers(int x)
{
    eulers[1] = 1;  
    for (int i = 2; i <= x; ++ i)//只是在线性筛的过程中顺便求了一下每个数的欧拉函数
    {
        if (!st[i])//1-n的质数
        {
            primes[cnt++] = i;
            eulers[i] = i - 1;
        }
        for (int j = 0; primes[j] <= x / i; ++ j)//1-n的合数//任何合数都含有质因数,4 = 1 * 2 * 1 * 2;
        {
            st[primes[j] * i] = 1;
            if (i % primes[j] == 0)
            {
                eulers[i * primes[j]] = eulers[i] * primes[j];
                break;//其实也相当于一个else
            }
            //eulers[i * primes[j]] = eulers[i] * primes[j] / primes[j] * (primes[j] - 1);
            eulers[i * primes[j]] = eulers[i] * (primes[j] - 1);
        }
    }
}
void solve()
{
    int n;
    cin >> n;
    get_eulers(n);
    long long res = 0; 
    for (int i = 1; i <= n; ++ i) res += eulers[i];
    cout << res;
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

快速幂

1 2 4 8成指数倍增长 log的时间复杂度

AcWing 875. 快速幂

long long qmi(int a, int b, int p)
{
    long long res = 1;
    while (b)
    {
        if (b & 1)
        {
            res = res * a % p;
        }
        a = a * (long long)a % p;
        b >>= 1;
    }
    return res;
}

AcWing 876. 快速幂求逆元

算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理,算法,c++,蓝桥杯,欧几里德,欧拉函数
欧拉函数 =>费马定理 =>快速幂实现费马定理计算结果

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#include <unordered_map>
using namespace std;

long long qmi(int a, int b, int p)
{
    long long res = 1;
    while (b)
    {
        if (b & 1) res = res * a % p;
        a = (long long)a * a % p;
        b >>= 1;
    }
    return res;
}
void solve()
{
    int n;
    cin >> n;
    while (n --)
    {
        int a, p;
        cin >> a >> p;
        if (a % p == 0) cout << "impossible" << endl;
        else cout << qmi(a, p - 2, p) << endl;//a需要与m互质,否则a不存在乘法逆元
    }
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

扩展欧几里德(裴蜀定理)

AcWing 877. 扩展欧几里得算法

ll gcd(ll x,ll y)
{
    if(y==0)    {return x;}
    return gcd(y,x%y);
}

这是一个求最大公约数(Greatest Common Divisor,简称GCD)的函数实现。

该函数的参数为两个整数x和y,返回值为它们的最大公约数。在函数中,我们使用递归的方式来求解最大公约数。

具体地,我们先判断y是否为0。如果y等于0,那么x就是最大公约数,直接返回x即可。否则,我们将x对y取模,得到余数r,然后递归调用gcd(y, r)来求解y和r的最大公约数。由于r一定小于y,因此每次递归调用时,y都会不断减小,直到y等于0,此时x就是最大公约数。

例如,当x=12,y=18时,我们可以按照如下步骤来求解它们的最大公约数:

gcd(12, 18)
-> gcd(18, 12)
-> gcd(12, 6)
-> gcd(6, 0)
最终结果为6,即12和18的最大公约数为6。
这个函数的实现基于欧几里得算法,也叫辗转相除法。这个算法的基本思想是,两个整数的最大公约数等于其中较小的数和两数之差的最大公约数。通过不断地将较大的数对较小的数取模,我们可以将两个数的大小逐渐缩小,直到其中一个数为0,此时另一个数就是最大公约数。这个算法的时间复杂度为O(logn),其中n为两个整数的较大值
理解递归的本质:
算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理,算法,c++,蓝桥杯,欧几里德,欧拉函数
裴蜀定理和线性同余方程的证明:
算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理,算法,c++,蓝桥杯,欧几里德,欧拉函数

#include <cstdio>
#include <iostream>

using namespace std;

int exgcd(int a, int b, int &x, int &y)
{
    if (b == 0)
    {
        x = 1, y = 0;
        return a;
    }
    //d就是最大公约数,本题其实用不到
    int d = exgcd(b, a % b, y, x);//本题的精髓
    /*
    只是为了方便更改x和y的值,如果用
    d = exgcd(b, a % b, x, y);
    最后就解得 新x = y 新y = x - a / b * y
    那么代码就得这么写
    int t = y;
    y = x - a / b * y;
    x = t;
    显然比只要写一句 新y -= a / b * x; 麻烦
    */
    y -= a / b * x;
    return d;
}
void solve()
{
    int n;
    cin >> n;
    while (n -- )
    {
        int a, b, x, y;
        cin >> a >> b;
        exgcd(a, b, x, y);
        cout << x << " " << y << endl;
    }
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

AcWing 878. 线性同余方程

线性同余方程用扩展欧几里德定理求解
本题推导过程在上面
为什么要% m
算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理,算法,c++,蓝桥杯,欧几里德,欧拉函数文章来源地址https://www.toymoban.com/news/detail-703785.html

#include <cstdio>
#include <iostream>

using namespace std;

int exgcd(int a, int b, int &x, int &y)
{
    if (b == 0)
    {
        x = 1, y = 0;
        return a;
    }
    else//其实不用else,上面满足直接return了,上面不满足也会走到下面 
    {
        int d = exgcd(b, a % b, y, x);
        y -= a / b * x;
        return d;
    }
}
void solve()
{
    int n;
    cin >> n;
    while (n -- )
    {
        int a, b, m, x, y;
        cin >> a >> b >> m;
        int d = exgcd(a, -m, x, y);
        if (b % d != 0) cout << "impossible" << endl;
        else cout << (long long)b / d * x % m << endl;
    }
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

中国剩余定理

到了这里,关于算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【高等数学基础知识篇】——一元函数微分学的应用

    【高等数学基础知识篇】——一元函数微分学的应用

    本文仅用于个人学习记录,使用的教材为汤家凤老师的《高等数学辅导讲义》。本文无任何盈利或者赚取个人声望的目的,如有侵权,请联系删除! 极值点包括极大值点和极小值点。 设y = f(x)在x = a处取极值,则f’(a) = 0或f’(a)不存在,反之不对。 设f(x)可导且在x = a处取极值

    2024年02月11日
    浏览(13)
  • 安全算法(一):安全技术、加密的基础知识、哈希函数的简单介绍

    安全算法(一):安全技术、加密的基础知识、哈希函数的简单介绍

    通过互联网交换数据时,数据要经过各种各样的网络和设备才能传到对方那里。数据在传输过程中有可能会经过某些恶意用户的设备,从而导致内容被盗取。 因此,要想安全地使用互联网,安全技术是不可或缺的。 传输数据时的四个问题:窃听、假冒、篡改、事后否认 窃听

    2024年02月04日
    浏览(13)
  • [Python物联网]Python基础知识和语法--控制流和函数--Python快速上手开发物联网上位机程序

    目录 一、前言         二、条件语句 三、循环语句         1.for循环         2.while循环 四、函数 五、总结         Python的控制流语句允许程序根据特定条件执行不同的代码块。Python中的常见控制流语句包括 条件语句 和 循环语句 。在本篇文章中,我们将讨论

    2024年02月04日
    浏览(17)
  • 【人工智能】实验四:遗传算法求函数最大值实验与基础知识

    【人工智能】实验四:遗传算法求函数最大值实验与基础知识

    实验目的 熟悉和掌握遗传算法的原理、流程和编码策略,并利用遗传算法求解函数优化问题,理解求解流程并测试主要参数对结果的影响。 实验内容 采用遗传算法求解函数最大值。 实验要求 1. 用遗传算法求解下列函数的最大值,设定求解精度到15位小数。 (1)给出适应度

    2024年02月03日
    浏览(38)
  • 欧拉定理 & 扩展欧拉定理

    观前提醒 :「文章仅供学习和参考,如有问题请在评论区提出」 目录 前置 剩余类(同余类) 完全剩余系(完系) 简化剩余系(缩系) 欧拉函数 欧拉定理 扩展欧拉定理 参考资料 给定一个正整数 (n) ,把所有的整数根据 模 (n) 的余数 (rin [0, n - 1]) 分为 (n) 类,每一类

    2024年02月13日
    浏览(11)
  • 高等数学(预备知识之反函数)

    高等数学(预备知识之反函数)

    正弦函数 y = sin ⁡ x y=sin x y = sin x quad ( x ∈ [ − π 2 , π 2 ] xin[-frac{π}{2},frac{π}{2}] x ∈ [ − 2 π ​ , 2 π ​ ] )的反函数叫 反正弦函数 记作 y = arcsin ⁡ x y=arcsin x y = arcsin x , ( x ∈ [ − 1 , 1 ] xin[-1,1] x ∈ [ − 1 , 1 ] , y ∈ [ − π 2 , π 2 ] yin[-frac{π}{2},frac{π}{2}] y ∈ [ − 2 π

    2024年02月07日
    浏览(13)
  • 高等数学(预备知识之幂函数)

    高等数学(预备知识之幂函数)

    幂函数 y=x a (a为常数, x为自变量) 例题1 : 判断下列是否为幂函数 (1) y=x 4 (2) y=2x 2 (3) y=2x (4) y=x 3 +2 (5) y=-x 2 只有第一个是对的, 严格意义上来讲,自变量前面不能有前缀和后缀 quad quad 性质: (1) : 图像都过(1,1)点 (2) : y=x a (a1或 a0) 当a为奇数时,y为奇函数, 当a为偶数时, y为偶函数

    2024年02月16日
    浏览(11)
  • 高等数学(预备知识之三角函数)

    高等数学(预备知识之三角函数)

    正弦函数, 余弦函数, 正切函数都是 以角为自变量 , 以单位圆上的 坐标或坐标的比值为函数值 的函数, 我们将他们称为 三角函数 sin ⁡ sin sin α alpha α = y cos ⁡ cos cos α alpha α = x tan ⁡ tan tan α alpha α = y x frac{y}{x} x y ​ 正弦函数: y= sin ⁡ sin sin x quad x ∈ in ∈ R 余弦函数

    2024年02月13日
    浏览(10)
  • 《ElementUI 基础知识》png 图片扩展 icon用法

    《ElementUI 基础知识》png 图片扩展 icon用法

    UI 设计给的切图是 .png 格式。但想与 Element UI icon 用法类似,方案如下。 准备图片 新建文件,可使用 CSS 预处理语言 styl 或 scss 。 stylus 方式 文件 icon.styl scss 方式 文件 icon.scss 全局导入。在 Vue 框架中直接导入即可。

    2024年04月23日
    浏览(20)
  • PHP8内置函数中的数学函数-PHP8知识详解

    PHP8内置函数中的数学函数-PHP8知识详解

    php8中提供了大量的内置函数,以便程序员直接使用常见的内置函数包括数学函数、变量函数、字符串函数、时间和日期函数等。今天介绍内置函数中的数学函数。 本文讲到了数学函数中的随机数函数rand()、舍去法取整函数floor()、向上取整函数 ceil()、对浮点数进行四舍五入

    2024年02月10日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包