当前位置:首页 > 技术 > 正文内容

数论基础概念与算法

访客 技术 2026年5月29日 1

模算术基础

1. 整除

若存在整数 k,使得 b = k × a,则称 a 能整除 b,记作 a | b,此时 a 是 b 的约数。

性质: 如果 a | b 且 a | c,那么对于任意整数 m 和 n,a 也整除 ma + nb。

2. 同余

如果 a 和 b 除以 m 的余数相同,则称 a 与 b 模 m 同余,记作 a ≡ b (mod m),这等价于 m 能整除 (a - b)。

性质:

  • 加减法: 若 a ≡ x (mod m) 且 b ≡ y (mod m),则 a ± b ≡ x ± y (mod m)。
  • 乘法: 若 a ≡ x (mod m) 且 b ≡ y (mod m),则 ab ≡ xy (mod m)。若 a ≡ b (mod m),则 ak ≡ bk (mod m)。
  • 除法:
    • 若 ac ≡ bc (mod m) 且 c 与 m 互质,则 a ≡ b (mod m)。
    • 若 a ≡ b (mod m) 且 d 是 a, b, m 的公约数,则 a/d ≡ b/d (mod m/d)。
  • 模运算的结合律:
    • (a ± b) % m = ((a % m) ± (b % m)) % m
    • (a × b) % m = ((a % m) × (b % m)) % m
  • 乘法逆元: 当 a 与 m 互质时,存在一个整数 inv_a,使得 a × inv_a ≡ 1 (mod m)。inv_a 称为 a 模 m 的乘法逆元。

求法:

  • 费马小定理: 当 m 为质数时,inv_a = am-2 (mod m)。
  • 扩展欧几里得算法: 通过求解 ax + my = 1 来找到 x,即为逆元。

素数

1. 算术基本定理

任何大于 1 的整数都可以唯一地表示为若干个素数的幂的乘积,即 n = p1α₁ × p2α₂ × ... × pkαₖ

推论:

  • 约数个数:∏(αi + 1)
  • 约数和:∏(1 + pi + pi2 + ... + piαᵢ) = ∏(piαᵢ+1 - 1) / (pi - 1)
  • 最大公约数与最小公倍数:(a, b) = ∏pimin(αᵢ, βᵢ),[a, b] = ∏pimax(αᵢ, βᵢ),且 (a, b) × [a, b] = a × b。

2. 素数判定

2.1 埃拉托斯特尼筛法

对于每个找到的素数,标记其所有倍数为合数。

for (int i = 2; i <= n; ++i) {
    if (is_prime[i]) {
        prime_list.push_back(i);
        for (int j = i * i; j <= n; j += i) {
            is_prime[j] = false;
        }
    }
}

2.2 欧拉筛法

确保每个合数只被其最小的质因子筛掉一次,时间复杂度为 O(n)。

for (int i = 2; i <= n; ++i) {
    if (is_prime[i]) {
        prime_list.push_back(i);
    }
    for (int j = 0; j < prime_list.size() && i * prime_list[j] <= n; ++j) {
        is_prime[i * prime_list[j]] = false;
        if (i % prime_list[j] == 0) {
            break;
        }
    }
}

2.3 Miller-Rabin 素性测试

一种概率性算法,通过多次测试来高概率地判断一个数是否为素数。

bool is_prime(long long n) {
    if (n <= 1) return false;
    if (n <= 3) return true;
    if (n % 2 == 0) return false;

    // 将 n-1 分解为 d * 2^s
    long long d = n - 1;
    int s = 0;
    while (d % 2 == 0) {
        d /= 2;
        ++s;
    }

    // 进行 k 次测试
    for (int i = 0; i < k; ++i) {
        long long a = random_number(2, n - 2);
        long long x = fast_pow(a, d, n);
        if (x == 1 || x == n - 1) continue;
        bool composite = true;
        for (int j = 0; j < s - 1; ++j) {
            x = (x * x) % n;
            if (x == n - 1) {
                composite = false;
                break;
            }
        }
        if (composite) return false;
    }
    return true;
}

核心定理与算法

1. 欧几里得算法

用于计算两个整数的最大公约数 (GCD)。

原理: gcd(a, b) = gcd(b, a % b)。由于每次迭代中较大的数至少减半,因此时间复杂度为 O(log(min(a, b)))。

2. 扩展欧几里得算法

不仅计算 GCD,还能找到整数 x 和 y,使得 ax + by = gcd(a, b)。

应用: 用于求解形如 ax ≡ 1 (mod m) 的乘法逆元(当 a 和 m 互质时)。

3. 欧拉函数与欧拉定理

欧拉函数 φ(n): 小于 n 且与 n 互质的正整数的个数。

性质: 若 a 和 b 互质,则 φ(ab) = φ(a) × φ(b)。

通式: φ(n) = n × ∏(1 - 1/pi),其中 pi 是 n 的所有不同质因数。

欧拉定理: 若 a 与 m 互质,则 aφ(m) ≡ 1 (mod m)。

4. 中国剩余定理 (CRT)

用于求解一组同余方程组,其中模数两两互质。

给定方程组 x ≡ ai (mod mi),其中 mi 互质,求解 x。

解法: 令 M = ∏mi,Mi = M / mi。找到 Mi 模 mi 的逆元 yi。则 x = Σ(ai × Mi × yi) 是一个解。

5. 卢卡斯定理

用于计算大组合数对质数取模的结果。

定理:C(n, k) % p = [C(n/p, k/p) × C(n%p, k%p)] % p

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。