数论学习笔记

数论学习笔记

整除性

def0a 整除b指,若a,b为整数且a0 存在整数c 使得b=ac。称ab的因子,ba的倍数 记作a|b 。如13|182,5|10...

对于a,b,cZ 有以下几个结论

  1. b|a,c|bc|a
  2. b|acb|ca
  3. c|ac|b 对于m,nZc|ma+mb

def1[带余除法]:a,bZ ,其中b>0则存在连个唯一的整数q,r

a=bq+r  0r<b1

def2 :把(1)式中的的q叫做不完全商,将r叫做非负最小剩余,记作ab=r 其中b通常省略不写.有

a±b=a±b

a×b=a×b

此部分应用见数论分块

最大公因数数和最小公倍数

辗转相除法和最大共因数

def0:定义啊(a,b)a,b的最大共因数,[a,b]a,b的最小公倍数,[a,b]=ab(a,b).

def1:辗转相除法a,b,cZ 且皆不为0有 a=bq+c , qZ ,则(a,b)=(b,c)计算机类通常用递归实现

  1. a,b>0(a,b)就是辗转相除法的最后的一个余数写作(a,b)=r
  2. 给定两整数a,b,>0,则存在两整数使得(a,b)=ma+nb
  3. a|bc,(a,b)=1a|c
  4. a1,a2,..an,n>2则存在dn=(a1,a2,..an)为序列最大的共因数
  5. a1,a2,..an,n>2则存在x1,x2..xn使得(a1,a2,..an)=a1x1+...anxn

对于最大共因数可用math库中的 __gcd函数实现 ,最小公倍数根据定义为ab/gcd(a,b)

素数整数唯一分解定理

当 p 为素数时 ,aZ:有几个引理

  • aZ q为a的最小正因数 qa
  • p|a(p,a)=1
  • p|ab,则p|ap|b
  • b>1.bZ,pp的一素因子, p 必然出现在b分解素数乘积分式中

def0 [整数唯一分解定理]对于aZ

a=q1q2..qn   q1q2..q3

def1 :素数是无限多个
def2 :存在无数个形如4n1的素数
def3 :对于x0Z 不存在多项式f(x)=anxn+an1xn1+..a1x+a0使得所有x0的整数时都成立

根据引理1,可以通过试除法来判断一个数是否为素数,时间复杂度为O(n)

bool is_prime(int n) {
    if (n < 2) return false;
    for (int i = 2; i <= sqrt(n); i++)
        if (n % i == 0) return false;
    return true;
}

当一次性对1n之间数进行素性判断时,其复杂度就会到达O(nn) 于是可以通过两种算法来实现快速筛选素数分别是Eratosthenes筛法O(nlognlogn)与线性筛O(n) ,前者可以通过bitset 或分块进一步优化,后者则不仅可以求素数也可以求任何积性函数,因为频繁访问数组后者使用bitset 则会使性能下降.

void get_primes(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (st[i]) continue;
        primes[cnt ++ ] = i;
        for (int j = i + i; j <= n; j += i)
            st[j] = true;
    }
}
void get_primes(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (!st[i]) primes[cnt ++ ] = i;
        for (int j = 0; primes[j] <= n / i; j ++ )
        {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;
        }
    }
}
算法 时间 空间
朴素算法 302ms 808kb
埃式筛 20ms 1372kb
线性筛 20ms 680 kb
bitset优化埃式筛 20ms 808kb
bitset优化线性筛 20ms 764kb

试除法分解质因数,复杂度为O(n)

void divide(int n) {
   m = 0;
   for (int i = 2; i*i <= n; i++) {
       if (n % i == 0) { // i是质数
           p[++m] = i, c[m] = 0;
           while (n % i == 0) n /= i, c[m]++; // 除掉所有的i
       }
   }
   if (n > 1) // n是质数
       p[++m] = n, c[m] = 1;
   for (int i = 1; i <= m; i++)
       cout << p[i] << '^' << c[i] <<endl;
}

费马数和梅森素数数

梅森素数

def0 : p 属于素数,形如2p1的素数叫梅森素数,记作Mp=2p1
def2 : p是一个奇素数,qMP的一个素因子,则q 形如q=2kp+1

引理:a>0,b>0,S>0(Sa1,Sb1)=S(a,b)1

费马数

def0 :形如Tn=22n+1,n>0的数叫费马数

def1 :Fm,Fn,mm(Fm,Fn)=1

完全数

def0 nZ,n的全部因数之和为2n 则称n完全数

def1 n=p1a1...pkakn的标准分解式则,σ(n)=d|nd表示n的诸因子之和有

σ(n)=p1a1+1p11...pkak+1pk1

def2 n 是一个偶完全数的充分必要条件是n 具有形如2p1(2p1)的因子,其中p2p1均为素数
def3 n 是一个奇完全数,则n 有分解式n=paqb1...qbt,a,p都是形如4n1的素数

一次不等式

def0 :二次不等式指的式形如 (1)a1x+a2y=n其中a1,a2,n 均为给定的整数

def1 :a1x+a2y=n有解的充分必要条件是(a1x,a2y)|n

def2 :(a1,a2)=1 则(1)的全部解可表示为x=x0+a2t,y=y0t,其中x0,y0为(1)的一组解,t为任意整数

def3 :s2s元一次不等式a1x1+a2x2+..+asxs=n有解的充分必要条件是(a1,..,as)|n

通过扩展欧几里得算法O(logb),可以解决二次不等式的问题

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;
}

同余

同余的定义及其性质

def0 : ma,b,Zma,b 所得的余数相同那么我们说a,b对模数m 同余 记作 ab(modn),不同余记作 ab(modn)

同余的一些性质

  • aa(modm) (自反性)
  • ab(modm)ba(modm) (对称性)
  • ab(modm),bc(modm)ac(modm)(传递性)

def0 a,b 对于m 同余的充分必要条件是m|ab

def1 ab(modm)  αβ(modm)那么有

  1. ax+αy=bx+βy(modm)
  2. aαbβ(modm)
  3. anbn(modm),n>0
  4. f(x)f(b) 其中 f(x)为任意给定的一个整系数多项式

def2 :若 acbc(modm)且若 (m,c)=dab(mod)md

剩余系和完全剩余系

剩余系

def0 :mZ+Cr(r=0,1,...m1) 表示所有形如qm+r的整数构成的集合其中q=0,±1,±2..C0...Cm1 叫做模数m 的剩余系

  1. m>0,C0,C1...Cm1是模数m的剩余系,则有

    1. 每一个整数恰好包含在某一个类Cj 里, 这里 0jm1
    2. x,y 属于同一类的充分必要条件是xy(modm)

完全剩余系

def0 :在模数m 的剩余系C0,C1..Cm1 中各取一个数aCj j=0,1..m1m 个数a0,a1..am1 称为为m完全剩余系.

def1 :由上可知m 个整数构成m的完全剩余系的充分必要条件是两两不同余

最常用的完全剩余系的是0,1,2..,m1 ,他们被称为模m 的非负最小剩余系

def2 :(k,a)=1a,a2,..am 是模数m 的一组完全剩余系,则ka,ka2..kam 构成m 的完全剩余系

def3 :设m1,m2>0,(m1,m2)=1 ,而x1,x2 分别通过m1,m2 的完全剩余系,则$

def4 Wilson定理:p 是一个素数 ,(p1)!+1(modp)

缩系

def0 :mZ 在与m 互素的剩余系中个取一个数组成的集合叫模数m缩系

欧拉函数

def0 :定义欧拉函数 φ(n) 是一个定义在正整数集合上的函数φ(n) 的指的是序列[0,1,2..n1] 中与n 互素的个数,显然当n 为素数时φ(n)=n1

def1 :模数m 的一组缩系中含有φ(m) 个数

def2 : 若有a1,..aφ(m) 个整数与m 互素,则a1,..aφ(m)形成模m 的缩系的充分必要条件是两两对模m 不同余

def3:(a,m)=1,x 通过模数m 的缩系,则ax 也通过模数m 的一组缩系.

def4 :欧拉定理m>1,(a,m)=1aφ(m)1(modm)

def5:费马小定理p 为素数 ,则apa(modp) 也可写作ap11(modp)

一次同余式

def0 f(x)=anxn+an1xn1+...+a1x+a0:(1)(n>0),i=0,...nf(x)0(modm),m>0 叫做模数m同余式,若an0(modm)n 叫做 (1)的次数满足f(x0)0(modm)x0x(modm) 叫做同余式的解,不同的解是值互不同余的解

四个重要定理

  1. (a,m)=1,m>0 则同余式axb(modm) 恰好有一个解.

  2. 在1的条件下xbaφ(m)1(modm) 是唯一解

  3. (a,m)=d,m>0 同余式axb(modm)有解的充分必要条件是:d|b

  4. (a,m)=d,m>0,d|b 同余式axb(modm)d 个解

def1 :f(x)=anxn+an1xn1+...+a1x+a0:(1)(n>0),i=0,...n 有解的充分必要条件是满足(a1,a2...an)|a0 ,若有解则解的个数是ma02(a1,a2...an)

乘法逆元

对于一个线性同余方程ax1(modb) ,我们称xamodb 的逆元,记作a1
通过快速幂或者扩欧来求解,快速幂利用了费马小定理因此要求b 为素数,而扩展欧几里得算法仅要求gcd(a,b)=1

long long binpow(long long a, long long b) {
  long long res = 1;
  while (b > 0) {
    if (b & 1) res = res * a;
    a = a * a;
    b >>= 1;
  }
  return res;
}

模数是素数的同余式

def0 :Lagrange 定理:p 是素数f(x)=anxn+an1xn1+...+a1x+a0 (n>0),an0(modp) 则同余式f(x)0(modp)最多有n 个解

推论: p 是素数 f(x)=anxn+an1xn1+...+a1x+a00(modp)

的解的个数大于np|ai(i=0...n)

def1Wolstenholme定理设p>3q 为素数有

k=1p1(p1)!k0(modp)3

孙子定理

{xb1(modm1)xb2(modm2)...xbn(modmn)

被称为一次同余方程组,孙子算法可以系统化的解决此类问题,孙子算法推广为孙子定理也称中国剩余定理.

def0 :设m0,m1...mn1n 个两两互素的数那么,有模M=m1m2..mn 的唯一解

xM1M1b1+M2M2b2...+MnMnbn

其中有MiMi1(modmi),i=1,...,k

def1 :m1,m2...mkk 个两两互素的正整数数,M=m1m2..mn那么有解的充分必要条件是f(x)0(modm)i(i=1,..,k)

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

模数是素数幂的同余式

f(x)=anxn+..+a1x+a0(modpa),n>0,pa|an

对于上式显然有;f(x)(modp)

def1 :设xxi(modp)

参考

《具体数学》
OIwiki
《初等数论讲义》

posted @   Erfu  阅读(107)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示