OI 数论 1

news/2025/10/12 20:34:26/文章来源:https://www.cnblogs.com/RorchZ/p/19137200

gcd 与 ex_gcd 的 C++ 实现

1. 最大公约数(GCD)

1.1 定义

最大公约数(Greatest Common Divisor)指两个或多个整数共有约数中最大的一个,记为 gcd(a, b)。对于非负整数 a 和 b,gcd(a, b) 是能同时整除 a 和 b 的最大正整数。

1.2 欧几里得算法(辗转相除法)

核心原理基于数学公式:gcd(x, y) = gcd(y, x % y)(其中 a % b 表示 a 除以 b 的余数)
终止条件:当 y = 0 时,gcd(x, 0) = x

递归实现

// 递归计算 gcd(x, y)
int gcd(int x, int y) {if (y == 0) return x; // 如果 那么返回yelse return gcd(y, x % y);
}

小优化 快速幂 & gcd

// 假设 p 为全局模数(快速幂运算的取模参数)
int p;// 快速幂函数:计算 (x^y) % p
int f_pow(int x, int y) {int ans = 1;                  // 结果初始化为 1(任何数的0次幂为1)x %= p;                       // 底数先取模,防止初始值过大while (y > 0) {               // 指数大于0时循环(二进制分解思想)if (y % 2 == 1) {         // 若当前指数为奇数,将当前底数乘入结果ans = (ans * x) % p;  // 结果取模,避免溢出}x = (x * x) % p;          // 底数平方(对应指数二进制右移一位)y /= 2;                   // 指数除以2(二进制右移)}return ans;                   // 返回 (x^y) % p 的结果
}// 融合快速幂的 GCD 计算(递归版)
// 注意:此处为特殊场景设计,非标准 GCD 逻辑,需根据具体需求调整
int gcd(int x, int y) {// 终止条件:若 x 能被 y 整除,则 y 是最大公约数if (x % y == 0) {return y;} else {// 递归计算:在求余过程中嵌入快速幂(示例逻辑,需根据实际场景修改)// 这里用 x 对 y 取余后,将余数作为指数计算 y 的幂,再参与 GCD 递归int rem = x % y;                  // 计算 x 除以 y 的余数int pow_val = f_pow(y, rem);      // 计算 y^rem % p(快速幂应用)return gcd(y, pow_val % y);       // 用幂运算结果的余数继续递归求 GCD}
}

Stein 算法(二进制最大公约数算法)笔记

一、Stein 算法简介

Stein 算法是计算两个非负整数最大公约数(gcd) 的高效算法,由 J. Stein 于 1967 年提出。
它的核心优势是避免欧几里得算法中的大整数取模运算,转而通过二进制位操作(移位、与、减) 实现,在计算机处理大整数时效率更高(尤其适合硬件实现,减少除法/取模的高开销)。

二、核心原理(基于二进制特性)

Stein 算法的推导依赖整数的二进制性质,核心规则围绕“偶数/奇数”分类处理,递归或迭代地缩小问题规模,最终得到 GCD。

设需计算 gcd(a, b)(约定 a ≥ b ≥ 0,若不满足则交换),核心规则如下:

条件 处理逻辑 原理说明
1. b = 0 终止,返回 a 任何数与 0 的 gcd 是其本身(gcd(a, 0) = a
2. ab 均为偶数 gcd(a, b) = 2 * gcd(a >> 1, b >> 1) 偶数可提取公因子 2,`a >> 1 (右移 1 位)
3. a 为偶数,b 为奇数 gcd(a, b) = gcd(a >> 1, b) 偶数的公因子 2 与奇数无关,仅需对偶数减半
4. a 为奇数,b 为偶数 gcd(a, b) = gcd(a, b >> 1) 同规则 3,对偶数减半
5. ab 均为奇数 gcd(a, b) = gcd(a - b, b) 奇数减奇数得偶数,缩小数值(后续可按规则 2/3 处理)

三、关键优化点

  1. 避免取模:用“移位”替代“除以 2”,用“减法”替代“大整数取模”,降低计算开销;
  2. 规模缩减快:每次迭代至少将其中一个数减半(或减为差值),时间复杂度与欧几里得算法相当,均为 O(log(min(a, b)))
  3. 兼容性强:支持包含 0 的输入(如 gcd(0, x) = x),也可通过取绝对值扩展到负整数。

四、C++ 实现(递归 + 迭代版)

4.1 递归实现(直观体现原理)

#include <bits/stdc++.h>
using namespace std;
// Stein 算法递归版:计算 a 和 b 的最大公约数
int stein_gcd(int a, int b) {// 步骤1:处理负数(转为非负,gcd 与符号无关)a = abs(a), b = abs(b);// 步骤2:终止条件(b = 0 时,gcd 为 a)if (b == 0) {return a;}// 步骤3:确保 a ≥ b(简化后续判断,避免重复处理)if (a < b) {swap(a, b);}// 步骤4:判断 a、b 的奇偶性,按规则处理if ((a & 1) == 0 && (b & 1) == 0) {// 规则2:a和b均为偶数(a&1 == 0 表示偶数)return 2 * stein_gcd(a >> 1, b >> 1);} else if ((a & 1) == 0 && (b & 1) == 1) {// 规则3:a偶、b奇return stein_gcd(a >> 1, b);} else if ((a & 1) == 1 && (b & 1) == 0) {// 规则4:a奇、b偶return stein_gcd(a, b >> 1);} else {// 规则5:a和b均为奇数(a - b 为偶数,缩小规模)return stein_gcd(a - b, b);}
}

迭代法实现扩展欧几里得算法

一、基础迭代推导

QQ20251012-202820

图片1

图片来自OiWiki

代码实现(基础迭代版)

int gcd(int a, int b, int& x, int& y) {x = 1, y = 0;int x1 = 0, y1 = 1, a1 = a, b1 = b;while (b1) {int q = a1 / b1;tie(x, x1) = make_tuple(x1, x - q * x1);tie(y, y1) = make_tuple(y1, y - q * y1);tie(a1, b1) = make_tuple(b1, a1 - q * b1);}return a1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.4 DQN 变体(Rainbow)

DQN 变体(Rainbow)双重 DQN(Double DQN) 在原始 DQN 中,经验回放与目标网络的引入使得 CNN 能够在强化学习中成功训练,但也带来了两个缺点:学习速度显著降低,样本复杂度增高; 稳定性较差,不同运行结果可能不…

Linux存储媒介devmount

Linux 存储媒介dev mount 挂载和卸载存储设备 管理存储设备的第一步是把设备连接到文件系统树中。这个叫做”挂载” 有一个叫做/etc/fstab 的文件可以列出系统启动时要挂载的设备。大多数文件系统是虚拟的,还有实际存…

单片机--概述 - 指南

单片机--概述 - 指南2025-10-12 20:18 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

Emacs折腾日记(三十二)——org mode的基本美化

在上一篇,已经介绍了org mode的基础知识,它与markdown非常相似,并且也十分容易上手,但是它的可扩展性比markdown要强很多。如果将来打算重度使用org mode,那么此时可以对它进行一些基本的配置和美化 基本配置 org…

pp

ppimport numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split, KFold, cross_val_score from sklearn.linear_model imp…

2025 工业风机十大品牌全景解析报告:覆盖离心风机,防爆风机,矿用风机的最新推荐

本报告基于 2025 年行业权威数据,结合中国玻璃钢协会、美国国际空气运动及控制协会(AMCA)等机构的测评结果,从技术创新、性能表现、市场布局三大维度,对工业风机十大品牌进行全景解析,为企业选购适配冶金、石化、…

详细介绍:P3.7计算机视觉

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2.3 深度 Q 网络(Deep Q-Network, DQN)

深度 Q 网络(Deep Q-Network, DQN)深度神经网络在函数逼近中的局限性 值函数型深度强化学习的目标是使用深度神经网络(DNN)逼近每个状态–动作对的 Q 值。 网络可以有两种形式(见下图):以状态–动作对 \((s,a)\…

Linux系统目录(文件)结构

Linux系统目录(文件)结构下方表格转载自: http://billie66.github.io/TLCL/book/chap04.html/ 根目录,万物起源。/bin 包含系统启动和运行所必须的二进制程序。/boot 包含 Linux 内核、初始 RAM 磁盘映像(用于启动…

实用指南:如何读懂Mach-O:构建macOS和iOS应用安全的第一道认知防线

实用指南:如何读懂Mach-O:构建macOS和iOS应用安全的第一道认知防线pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

vim配置使用

vim配置使用 大多数 Linux 发行版不包含真正的 vi;而是自带一款高级替代版本,叫做 vim。通常,vim 在 Linux 系统中是“vi”的符号链接(或别名)。是一个模式编辑器。(插入模式,命令模式) 配置 全局配置一般在/e…

shell高级

shell高级 组命令和子 shell bash 允许把命令组合在一起。可以通过两种方式完成;要么用一个 group 命令,要么用一个子 shell。 组命令: { command1; command2; [command3; ...] }子 shell: (command1; command2; […

shell流程控制

shell流程控制 if if commands; thencommands [elif commands; thencommands...] [elsecommands] ficommands可以是test表达式[ expression ] [expression]表达式(不推荐) 测试文件表达式表达式 如果下列条件为真则返…

shell展开shell数组

shell展开&shell数组 参数展开 大多数的参数展开会用在脚本中,而不是命令行中。 基本参数 The simplest form of parameter expansion is reflected in the ordinary use of variables. 最简单的参数展开形式反映…

shell排错

shell排错 常见语法错误 =当做== #!/bin/bash number=1 if [ $number = 1 ]; thenecho "Number is equal to 1." elseecho "Number is not equal to 1." fiecho字符表达式丢失引号 #!/bin/bash nu…

原木

短线大概率有个C5

格式化输出与文本处理

格式化输出与文本处理以下和vim都是程序,但是以下所讲述的都是命令行工具,vim是一个编辑器,是有本质区别的文本应用程序 到目前为止,我们已经知道了一对文本编辑器(nano 和 vim),看过一堆配置文件,并且目睹了许…

2025年10月镀锌卷板厂家最新推荐排行榜,有花镀锌卷板,无花镀锌卷板,高锌层镀锌卷板,批发镀锌卷板公司推荐

在工业制造与建筑建材领域,镀锌卷板作为基础防腐材料,其品质直接影响终端产品的使用寿命与安全性能。当前市场上,镀锌卷板厂家数量众多,产品质量参差不齐:部分厂商存在锌层厚度不达标、加工时锌层易脱落等问题,导…

React 19.2 重磅更新!这几个新特性终于来了

大家好,我是 Immerse,一名独立开发者、内容创作者、AGI 实践者。 关注公众号:沉浸式趣谈,获取最新文章(更多内容只在公众号更新) 个人网站:https://yaolifeng.com 也同步更新。 转载请在文章开头注明出处和版权…

Akka.NET高性能分布式Actor框架完全指南

Akka.NET是.NET平台上功能完整的Actor模型实现,提供高性能的分布式计算能力。该项目包含完整的Actor系统、集群管理、持久化、流处理等核心功能,支持构建高并发、高可用的分布式应用程序。Akka.NET - .NET平台的Acto…