首页 > 其他分享 >【学习笔记】简单数论

【学习笔记】简单数论

时间:2023-08-11 17:36:48浏览次数:47  
标签:gcd 数论 bmod 笔记 times 学习 pmod int equiv

前言

开个大坑。

正文

质数

  • 质数的个数是无限的。
  • 试除法:若一个正整数 \(N\) 为合数,则存在一个能整除 \(N\) 的数 \(T\) ,其中 \(2 \le T \le \sqrt{N}\) 。
    • 时间复杂度为 \(O(\sqrt{n})\) 。
    • 代码实现
    bool isprime(int n)
    {
        if (n < 2)
            return false;
        for (int i = 2; i <= sqrt(n); i++)
            if (n % i == 0)
                return false;
        return true;
    }
    
  • 筛法
    • Eratosthenes 筛法(埃式筛法)
      • 时间复杂度 \(O(n \times \log \log n)\)
      • 例题
        #include <bits/stdc++.h>
        using namespace std;
        bool m[100000010];
        int main()
        {
            int n, i, j, ans = 0;
            cin >> n;
            m[1] = 1;
            for (i = 2; i <= sqrt(n); i++)
            {
                if (m[i] == 0)
                {
                    for (j = 2; i * j <= n; j++)
                    {
                        m[i * j] = 1;
                    }
                }
            }
            for (i = 2; i <= n; i++)
            {
                if (m[i] == 0)
                {
                    ans++;
                }
            }
            cout << ans;
            return 0;
        }
        
    • 线性筛法(欧拉筛法)
      • 时间复杂度 \(O(n)\)
      • 例题
        #include <bits/stdc++.h>
        using namespace std;
        #define ll long long
        #define sort stable_sort
        #define endl '\n'
        int prime[100000001], sum[10], len = 0;
        bool vis[100000001];
        void isprime(int n)
        {
            int i, j;
            memset(vis, false, sizeof(vis));
            for (i = 2; i <= n; i++)
            {
                if (vis[i] == false)
                {
                    len++;
                    prime[len] = i;
                }
                for (j = 1; j <= len && i * prime[j] <= n; j++)
                {
                    vis[i * prime[j]] = true;
                    if (i % prime[j] == 0)
                    {
                        break;
                    }
                }
            }
        }
        int main()
        {
            int n, q, i, k;
            cin >> n >> q;
            isprime(n);
            for (i = 1; i <= q; i++)
            {
                cin >> k;
                cout << prime[k] << endl;
            }
            return 0;
        }
        
  • 算术基本定理(唯一分解定理)
    • 任何一个大于 \(1\) 的正整数都能唯一分解成有限个的质数的乘积,可写作 \(N=p_1^{c_1}p_2^{c_2}……p_m^{c_m}\) ,其中 \(c_i\) 都是正整数, \(p_i\) 都是质数,且满足 \(p_1<p_2<……<p_m\) 。

同余

  • 自反性: \(a \equiv a \pmod{p}\)
  • 对称性:若 \(a \equiv b \pmod{p}\) ,则 \(b \equiv a \pmod{p}\) 。
  • 传递性:若 \(a \equiv b \pmod{p},b \equiv c \pmod{p}\) ,则 \(a \equiv c \pmod{p}\) 。
  • 同加性:若 \(a \equiv b \pmod{p}\) ,则 \(a+c \equiv b+c \pmod{p}\) 。
  • 同乘性:若 \(a \equiv b \pmod{p}\) ,则 \(a \times c \equiv b \times c \pmod{p}\) 。
  • 一般情况下不满足同除性。
    • 特例:当 \(\gcd(c,p)=1,a \times c\equiv b \times c \pmod{p}\) 时,则 \(a \equiv b \pmod{p}\) 。
  • 同幂性:若 \(a \equiv b \pmod{p}\) ,则 \(a^n \equiv b^n\pmod{p}\) 。
  • 若 \(p,q\) 互质,\(a \bmod p=x,a \bmod q=x\) ,则 \(a \bmod(p \times q)=x\) 。

最大公约数

  • 取模运算性质
    • \((a+b) \bmod p=((a \bmod p)+(b \mod p)) \mod p\) ,反之亦成立。
    • \((a-b) \bmod p=((a \bmod p)-(b \mod p)) \mod p\) ,反之亦成立。
    • \((a \times b) \bmod p=((a \bmod p) \times (b \mod p)) \mod p\) ,反之亦成立。
    • 引流两篇讲解负数取模的文章 link1 link2
  • 若 \(\forall a,b \in \mathbb{N}\) ,则 \(\gcd (a,b) \times \operatorname{lcm} (a,b)=a \times b\) 。
  • 九章算术·更相减损术
    • 若 \(\forall a,b \in \mathbb{N},a \le b\) ,则 \(\gcd (a,b)= \gcd (a,b-a)= \gcd (b,b-a)\) 。
      • 证明:设 \(d= \gcd (a,b),k_1= \frac{a}{d},k_2= \frac{b}{d}\) ,移项得 \(a=k_1 d,b=k_2 d\) ,又因为 \((b-a) \bmod d=0,b-a=(k_2-k_1)d\) ,故 $\gcd (a,b-a)= \gcd (k_1 d,(k_2-k_1)d)=d $ ,\(b\) 与 \(b-a\) 同理。
    • 若 \(\forall a,b \in \mathbb{N}\) ,则 \(\gcd (2a,2b)= 2\gcd (a,b)\) 。
  • 欧几里得算法
    • 若 \(\forall a,b \in \mathbb{N}\) ,则 \(\gcd (a,b)= \gcd(b,a \bmod b)\) 。
      • 证明
        • 若 $a<b $ ,则 \(\gcd(b,a \bmod b)=\gcd(b,a)=\gcd(a,b)\) 。
        • 若 \(a \ge b\) ,设 $ d= \gcd(a,b),a=q \times b+r(0 \le r <b)$ ,则 \(r=a \bmod b=a-q \times b\) ,又因为 $ d|a,d|b,d|(q \times b) $ ,则 \(d|(a-q \times b)\) ,即 \(d|r\) ,故 \(\gcd(a,b)=\gcd(b,r)=\gcd(b,a \bmod b)\) 。
    • 时间复杂度为 \(O(\log \max(a,b))\) 。
    • 代码实现
      int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
      

标签:gcd,数论,bmod,笔记,times,学习,pmod,int,equiv
From: https://www.cnblogs.com/The-Shadow-Dragon/p/17623317.html

相关文章

  • zlmediakit源码学习(扩展支持定时抽帧)
    使用了很长时间的zlmediakit流媒体服务,一直对其精妙高效的设计实现十分好奇。最好的学习就是去二次开发实现一些小功能,同时摸索框架的代码结构在参考了zlmediakit的录像功能后,分析模仿它的源码结构,实现定时抽帧的功能。抽帧之后可以:1)进行算法分析;2)重新编码实现转码功能;3)算法分析......
  • 面试笔记
    目录HTTP请求方法有几种,他们各自的特点是什么?HTTP请求方法有几种,他们各自的特点是什么?HTTP请求方法指的是客户端向服务器请求数据时所使用的不同的HTTP方法。常用的HTTP请求方法有以下几种:GET:用于获取资源,一般用于读取数据。特点是请求参数在URL中,请求体为空。POST:用于提交......
  • linux下Makefile学习
    概述——什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix......
  • 学习《C和指针》的总结(1)
    一、GDB,我使用的是notepad++,因为它轻量化,再用MinGW作为编译器,配置宏:Compile、Run和GDB。GDB指令:1、b13 :在第十三行打断点2、r:运行代码到第十三行3、n:运行下一行代码4、s:如果下一行是调用函数,使用此指令进入调用函数5、pa:打印变量a的值,执行一次就打一次6......
  • 海外优秀学习资源清单
    随着网络的快速发展,我们现在获取知识的资源可谓琳琅满目,但是优质的资源却往往又难以筛选。所以下面作者整理出了33个优质的资源,如果你能持续阅读或者学习的话,相信你很快就会有质的飞跃!当然,你也可以根据你感兴趣的方向挑选其中几个进行关注,所谓弱水三千只取一......
  • 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码
    理解图优化,一步步带你看懂g2o框架小白:师兄师兄,最近我在看SLAM的优化算法,有种方法叫“图优化”,以前学习算法的时候还有一个优化方法叫“凸优化”,这两个不是一个东西吧?师兄:哈哈,这个问题有意思,虽然它们中文发音一样,但是意思差别大着呢!我们来看看英文表达吧,图优化的英文是graphoptimi......
  • MySQL学习总结
    知者不言,言者不知。1、SQL命令总览可以把SQL分为两个部分:数据操作语言(DML)和数据定义语言(DDL)。(1)数据操作语言(DML)主要是针对表的操作:INSERTINTO-向数据库表中插入数据(增)DELETE-从数据库表中删除数据(删)SELECT-从数据库表中获取数据(查)UPDATE-更新数......
  • 01、机器学习(吴恩达)
    1、机器学习简介机器学习的应用机器学习的定义ArthurSamuel(1959)下的定义是:在没有被明确编程的前提下,赋予计算机学习能力的研究ArthurSamuel(阿瑟·塞缪尔)的小故事:阿瑟·萨缪尔是人工智能研究的先驱。他编写了一个下棋的程序,该程序能够自己学习,自己与自己对弈几百万......
  • 面试算法学习1
    蛇形矩阵微软面试题题目描述输入两个整数\(n\)和\(m\),输出一个\(n\)行\(m\)列的矩阵,将数字\(1\)到\(n\timesm\)按照回字蛇形填充至矩阵中。具体矩阵形式可参考样例。输入格式输入共一行,包含两个整数\(n\)和\(m\)。输出格式输出满足要求的矩阵。矩阵占\(......
  • 【C#学习笔记】什么是多态
    什么是多态?就是一个对象,调用同一个方法,却有不同的表现?一个对象怎么可能调用同一个方法,怎么可能会有不同的表现呢?是参数类型不一样还是参数数量不一样?不,那些都是重载。多态必须建立在继承之上。多态的三种实现方式:虚函数、抽象类、接口。......