数论

db516cde-4a65-4cf9-a54e-6690a0111728$$ \texttt{HSAtHNU2023.5.27} $$

数论

更新栏

$upd$ $2023.5.31$ 这次更新了很多内容,从质因数分解到$\operatorname{lcm}$

$upd$ $2023.6.21$ 这次更新了一些 $\text{Markdown}$ 语法,具体如下:

  • $\gcd$ 和 $\operatorname{lcm}$,使用了\gcd\operatorname{lcm}

  • 把两个质数筛的标题和 U249927 改成了 \texttt{} 格式;

  • 增加了第一行的 $\texttt{HSAtHNU}$ 与日期。

    $upd$ $2023.7.3$ $\text{Markdown}$ 语法修复:

  • 字母与汉字之间的空格

  • 把直接打的|换成了 \mid\ge

    $upd$ $2023.7.30$ 修正章节素数筛,修改了埃氏筛和欧拉筛(代码错了啊喂)


素数

又称质数,是整数的基本元素

素数判定:

bool isprime(int n){
  for (int i = 2; i * i <= n; i++){
      if (n % i == 0){
          return 0;
      }
  }
  return 1;
}

$\texttt{Eratosthenes}$ 埃氏筛

原理是一个素数的整数倍数不可能是素数

示例代码:

void Sieve(int n){
  for (int i = 2; i <= n; i++){
    if (!v[i]){
      prime[++cnt] = i;
      for (int j = i; i <= n / j; j++){
        v[i * j] = 1;
      }
    }
  }
}

$\texttt{Euler}$ 欧拉筛

原理是用一个数的最小素因子筛去其范围内的素数倍数

示例代码:

void Sieve(int n){
    for (int i = 2; i <= n; i++){
        if (!v[i]){
            prime[++tot] = i;
        }
        for (int j = 1; j <= tot && i * prime[j] <= n; j++){
            v[i * prime[j]] = prime[j];
            if (i % prime[j] == 0){
                break;
            }
        }
    }
}

$\texttt{U249927}$ 线性筛质数

#include<bits/stdc++.h>

using namespace std;

int n,q;

int mrk[100000010];

int prm[100000010];

void prime(){
    int index = 0;
    for (int i = 2; i < n; i++){
        if (mrk[i] == 0){
            prm[++index] = i;
        }
        for (int j = 1; j <= index && prm[j] * i < n; j++){
            mrk[i * prm[j]] = 1;
            if (i % prm[j] == 0) break;
        }
    }
}

int main(){
    cin >> n >> q;
    prime();
    int k;
    for (int i = 1; i <= q; i++){
        cin >> k;
        cout << prm[k] << endl;
    }
    return 0;
}

等会,我不应该在这里贴U249927的代码的呀


质因数分解

把一个$\ge2$的正整数拆分成素数幂的乘积,称为质因数分解

举$3 $个栗子:

24 = 2 × 2 × 2 × 3 = 2³ × 3¹

33 = 3 × 11 = 3¹ × 11¹

17 = 17 = 17¹

示例代码:

void Divide(int n){

    int i = 2;

    while (n > 1){

        if (n % i == 0){

            cout << i << ' ';

            n /= i;
        }
        else i++;
    }
}

唯一分解定理

任意 $\ge2$ 的正整数的质因数分解方案是唯一

这个定理是整个数论研究的基石:“整数的基本元素是质数”

因此也被称为算术基本定理

示例代码:

vector<int> Divide(int n){

    vector<int> V;

    for (int i = 2; i * i <= n; i++){

        while (n % i == 0){

            V.push_back(i);

            n /= i;
        }
    }

    if (n > 1) V.push_back(x);

    return V;
}

整除

  • 如果 $a$ 被 $p$ 整除,也就是说 $a$ 是 $p$ 的倍数,那么记为 $p \mid a$

  • 如果 $a$ 是 $p$ 的倍数,那么 $a$ 的倍数也是 $p$ 的倍数,即 $p \mid ab (b∈Z+)$

可以由此推导出整除的“传递性”:若 $a\mid b,b\mid c$,则有$a\mid c$

关于整除

  • 若 $2$ 能整除 $a$ 的末位,则 $2 \mid a$

  • 若 $4$ 能整除 $a$ 的末两位,则 $4 \mid a$

  • 若 $8$ 能整除 $a$ 的末三位,则 $8 \mid a$

  • 若 $3$ 能整除 $a$ 的各位数字之和,则 $3 \mid a$

  • 若 $9$ 能整除 $a$ 的各位数字之和,则 $9 \mid a$

  • 若 $11$ 能整除 $a$ 的偶位数字和与奇位数字和之差,则 $11 \mid a$

约数

除了完全平方数,约数总是成对出现的

$N$的约数个数上限约 $2\times\sqrt n$


$\gcd$

设 $a,b$ 是不同时为 $0$ 的整数,$c$ 为满足 $c \mid a$ && $c \mid b$ 的最大整数,则称 $c$ 是 $a,b$ 的最大公约数,记为 $\gcd(a,b)$

$\gcd(a,b)$ 的常用性质:

  • $\gcd(a \times k,b \times k) = k \times \gcd(a,b)$

  • 若 $c \mid a$ && $c | b$,则 $c \mid \gcd(a,b)$

  • $\gcd(a,b) = \gcd(a,k \times a + b)$

$\operatorname{lcm}$

$a,b$ 的最小公倍数,记作 $\operatorname{lcm}(a,b)$

$\operatorname{lcm}(a,b)$ 的常用性质:

  • $\operatorname{lcm}(a,b) \times \gcd(a,b)=a \times b$

  • 若 $a \mid m$ && $b \mid m$,则 $\operatorname{lcm}(a,b) \mid m$

  • $\operatorname{lcm}(m \times a,m \times b)=m \times \operatorname{lcm}(a,b) (m∈Z+$)

posted @ 2023-05-27 16:47  rksm2333  阅读(21)  评论(0)    收藏  举报  来源