第三十章 数论——扩展中国剩余定理

news2025/1/10 20:46:52

第三十章 数论——扩展中国剩余定理

  • 一、中国剩余定理的弊端
  • 二、扩展中国剩余定理
    • 1、作用
    • 2、内容
    • 3、问题
    • 4、代码

一、中国剩余定理的弊端

在第二十九章中,作者详细地讲解了中国剩余定理的使用,在开始本章节的讲解之前,建议读者先去看上一章节的讲解。传送门:中国剩余定理与线性同余方程组

中国剩余定理是用来解决线性同余方程组的,但是有一个很苛刻的要求就是:方程组中的同余方程的模数必须是互质的。只有这样我们才能套用中国剩余定理。

二、扩展中国剩余定理

1、作用

扩展中国剩余定理就是为了解决方程组中模数不互质的情况。

2、内容

{ x ≡ a 1   m o d ( m 1 ) x ≡ a 2   m o d ( m 2 ) x ≡ a 3   m o d ( m 3 ) . . . x ≡ a n   m o d ( m n ) \begin{cases} x\equiv a_1\ mod(m_1)\\ x\equiv a_2\ mod(m_2)\\ x\equiv a_3\ mod(m_3)\\ ...\\ x\equiv a_n\ mod(m_n) \end{cases} xa1 mod(m1)xa2 mod(m2)xa3 mod(m3)...xan mod(mn)
我们取出前两个式子:

x ≡ a 1   m o d ( m 1 ) x ≡ a 2   m o d ( m 2 ) x\equiv a_1\ mod(m_1)\\ x\equiv a_2\ mod(m_2)\\ xa1 mod(m1)xa2 mod(m2)

这两个式子能够写成:
x = k 1 m 1 + a 1 x = k 2 m 2 + a 2 x=k_1m_1+a_1\\ x=k_2m_2+a_2 x=k1m1+a1x=k2m2+a2
两个式子相减:
k 1 m 1 + a 1 = k 2 m 2 + a 2 k_1m_1+a_1=k_2m_2+a_2 k1m1+a1=k2m2+a2
将上面的式子移项:
k 1 m 1 − k 2 m 2 = a 2 − a 1 k_1m_1-k_2m_2=a_2-a_1 k1m1k2m2=a2a1

我们把 k 1 k_1 k1 − k 2 -k_2 k2看作 x k x_k xk y k y_k yk

那么这个式子就可以写成:
x k m 1 + y k m 2 = ( a 2 − a 1 ) x_km_1+y_km_2=(a_2-a_1) xkm1+ykm2=(a2a1)

根据我们的裴蜀定理:

如果 g c d ( m 1 , m 2 ) ∣ ( a 2 − a 1 ) gcd(m_1,m_2)|(a_2-a_1) gcd(m1,m2)(a2a1)

我们就能够根据扩展欧几里德算法计算出系数。

如果上述整除的关系不成立,说明这个式子是无解的。

我们现在来讨论整除关系成立的情况:

我们可以根据欧几里得算法计算出:

x 0 m 1 + y 0 m 2 = g c d ( m 1 , m 2 ) x_0m_1+y_0m_2=gcd(m1,m2) x0m1+y0m2=gcd(m1,m2)的特殊解。

为了得到我们的 x k x_k xk y k y_k yk,我们需要给两遍同乘 ( a 2 − a 1 ) g c d ( m 1 , m 2 ) \frac{(a_2-a_1)}{gcd(m_1,m_2)} gcd(m1,m2)(a2a1)

所以我们的 x x x y y y的特殊解可以写成:

x k 1 = x 0 ∗ ( a 2 − a 1 ) g c d ( m 1 , m 2 ) y k 1 = y 0 ∗ ( a 2 − a 1 ) g c d ( m 1 , m 2 ) x_{k1}=x_0*\frac{(a_2-a_1)}{gcd(m_1,m_2)}\\ y_{k1}=y_0*\frac{(a_2-a_1)}{gcd(m_1,m_2)} xk1=x0gcd(m1,m2)(a2a1)yk1=y0gcd(m1,m2)(a2a1)

但是这是一组特殊解:

当我们式子为:

x 0 m 1 + y 0 m 2 = n ∗ g c d ( m 1 , m 2 ) x_0m_1+y_0m_2=n*gcd(m1,m2) x0m1+y0m2=ngcd(m1,m2)

此时我们可以通过特殊解构造出一般解:

我们构造的原则是下面的等式恒成立

x 0 m 1 + y 0 m 2 = g c d ( m 1 , m 2 ) x_0m_1+y_0m_2=gcd(m1,m2) x0m1+y0m2=gcd(m1,m2)

因此我们给我们的特殊解进行如下变形:

x k = x k 1 + m 2 g c d ( m 1 , m 2 ) ∗ n y k = y k 1 − m 1 g c d ( m 1 , m 2 ) ∗ n x_k=x_{k1}+\frac{m_2}{gcd(m_1,m_2)}*n\\ y_k=y_{k1}-\frac{m_1}{gcd(m_1,m_2)}*n xk=xk1+gcd(m1,m2)m2nyk=yk1gcd(m1,m2)m1n

我们将这两个式子带回: x 0 m 1 + y 0 m 2 = g c d ( m 1 , m 2 ) x_0m_1+y_0m_2=gcd(m1,m2) x0m1+y0m2=gcd(m1,m2)

发现依然是成立的。

所以我们构造的 x k x_{k} xk y k y_{k} yk就是通解

此时带回我们的
x = k 1 m 1 + a 1 x=k_1m_1+a_1 x=k1m1+a1
我们前面是将 k 1 k_1 k1看作了 x k x_k xk,所以我们的式子可以变形为:
x = m 2 ∗ m 1 g c d ( m 1 , m 2 ) ∗ n + x k 1 ∗ m 1 + a 1 x=\frac{m_2*m_1}{gcd(m_1,m_2)}*n+x_{k1}*m_1+a_1 x=gcd(m1,m2)m2m1n+xk1m1+a1

m 2 ∗ m 1 g c d ( m 1 , m 2 ) \frac{m_2*m_1}{gcd(m_1,m_2)} gcd(m1,m2)m2m1就是我们的最小公倍数。因为:

最大公因数 ∗ 最小公倍数 = 两个数的乘积 最大公因数*最小公倍数=两个数的乘积 最大公因数最小公倍数=两个数的乘积

所以我们让:

l c m ( m 1 , m 2 ) = m 2 ∗ m 1 g c d ( m 1 , m 2 ) lcm(m_1,m_2)=\frac{m_2*m_1}{gcd(m_1,m_2)} lcm(m1,m2)=gcd(m1,m2)m2m1

所以我们的式子可以化简为:
x = l c m ( m 1 , m 2 ) ∗ n + x k 1 m 1 + a 1 x=lcm(m_1,m_2)*n+x_{k1}m_1+a_1 x=lcm(m1,m2)n+xk1m1+a1

而这个式子可以写成:

x ≡ r ( m o d   m ) x\equiv r(mod\ m) xr(mod m)

其中:

{ r = k 1 m 1 + a 1 m = l c m ( m 1 , m 2 ) \begin{cases} r={k_1}m_1+a_1\\ m=lcm(m_1,m_2) \end{cases} {r=k1m1+a1m=lcm(m1,m2)

经过上述推导,我们将两个同余方程:

x = k 1 m 1 + a 1 x = k 2 m 2 + a 2 x=k_1m_1+a_1\\ x=k_2m_2+a_2 x=k1m1+a1x=k2m2+a2

合并成了一个同余方程:

x ≡ r ( m o d   m ) x\equiv r(mod\ m) xr(mod m)

因此,我们只需要不断地去合并,经过 n − 1 n-1 n1次合并,我们就能够把 n n n个同余方程合并成一个同余方程。

当只有一个合并方程的时候,我们肯定就能够利用扩展欧几里得算法进行计算了。

3、问题

在这里插入图片描述

4、代码

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
LL exgcd(LL a, LL b, LL &x, LL &y)
{
    if (!b)
    {
        x = 1, y = 0;
        return a;
    }
    LL d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}
int main()
{
    int n;
    cin >> n;
    LL x = 0, m1, a1;
    cin >> m1 >> a1;
    for (int i = 0; i < n - 1; i ++ )
    {
        LL m2, a2;
        cin >> m2 >> a2;
        LL k1, k2;
        LL d = exgcd(m1, m2, k1, k2);
        if ((a2 - a1) % d)
        {
            x = -1;
            break;
        }
        k1 *= (a2 - a1) / d;
        k1 = (k1 % (m2/d) + m2/d) % (m2/d);
        x = k1 * m1 + a1;
        LL m = abs(m1 / d * m2);
        a1 = k1 * m1 + a1;
        m1 = m;
    }
    if (x != -1) x = (a1 % m1 + m1) % m1;
    cout << x << endl;
    return 0;
}

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

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

相关文章

Tensorflow2 图像分类-Flowers数据深度学习模型保存、读取、参数查看和图像预测

目录 1.原文完整代码 1.1 模型运行参数总结 1.2模型训练效果 ​编辑2.模型的保存 3.读取模型model 4.使用模型进行图片预测 5.补充 如何查看保存模型参数 5.1 model_weights 5.2 optimizer_weights 使用之前一篇代码&#xff1a; 原文链接&#xff1a;Tensorflow2 图像分…

English Learning - L1-7 介词 2022.12.26 周一

English Learning - L1-7 介词 2022.12.26 周一7 介词7.1 介词功能 1 - 表示动作的方向&#xff0c;范围和程度7.2 介词功能 2 - 胶水词&#xff0c;链接不同的名词7.3 介词功能 3 - 与 be 动词连用代替动词7.4 江南四大介词on核心意义&#xff1a;在。。。上; 在&#xff08;某…

融云 x OHLA:「社交+游戏」双轮驱动,逐鹿中东陌生人社交

完整报告&#xff0c;关注公众号文章限免下载 走过十多年的出海历程&#xff0c;中国创业者面临的机遇和挑战正在发生根本性变化。TikTok、SHEIN 在全球大获全胜的背后&#xff0c;不仅有中国产业链成熟、工程师红利的厚积薄发&#xff0c;也有一代代出海人布局全球商业路径的思…

Ubuntu20.04部署KVM并安装Ubuntu Server 20.04

kvm虚拟化技术 KVM介绍 KVM是Linux开源社区大力支持的虚拟化技术&#xff0c;基于Intel和AMD的硬件虚拟化技术。KVM&#xff08;Kernel-bashdVirtual Machine&#xff0c;即基于内核的虚拟机&#xff09;&#xff0c;它是用于Linux内核中的虚拟化环境设施&#xff0c;是Linux…

python:什么?你听MP3居然还要付费?看我一键......

前言 大家早好、午好、晚好吖 ❤ ~ 在我们上班空闲\游玩\散步的时候,总会习惯的拿出手机放首音乐来听一听 但是吧,有时候我们听一首歌起劲的时候,它会你提醒你 这时候怎么办呢&#xff1f;通常我们是下一首&#xff0c;或者充值 但是手头不宽裕但又想听怎么办&#xff1f; …

JavaEE-Spring(IoC控制反转,DI依赖注入,Spring项目创建和基本使用,ApplicationContext和BeanFactory的区别)

文章目录1. IoCDI2. Spring项目创建和使用ApplicationContext和BeanFactory的区别1. IoC Spring是一个包含多个工具方法的IoC容器 tomcat是web容器 List/Map是数据存储容器 IoC&#xff1a;Inversion of Control&#xff08;控制反转&#xff09; 将对象的控制权交给Spring&…

RK3399+PCIe+FPGA 在高速AD采样中的应用

一、需求 要实现高速AD/DA的数据采集&#xff0c;并发送到高性能arm核进行数据处理&#xff1b; 方案RK3399pcieFPGAAD/DA。 二、器件介绍 一、RK3399 RK3399是一款低功耗、高性能处理器&#xff0c;用于计算、个人移动互联网设备和其他智能设备应用。基于Big.Little架构&…

计算机发展史之查尔斯·巴贝奇

查尔斯巴贝奇&#xff08;Charles Babbage&#xff0c;1791年12月26日—1871年10月18日&#xff09;是一名英国数学家、发明家、科学家&#xff0c;科学管理的先驱者&#xff0c;出生于一个富有的银行家的家庭&#xff0c;曾就读于剑桥大学三一学院。 他在24岁时就被选为英国皇…

智慧医院数据可视化(数据大屏)

本次分享的作品是用软件Axure8.0&#xff08;兼容9和10&#xff09;制作的针对智慧医院设计的数据可视化大屏&#xff0c;其作品内容主要是对医院的运营情况、门诊、住院、手术、药品、医务、医疗设备、卫生耗材以及医疗质量数据进行综合可视分析。 运营情况:对医院的整体数据…

左神算法学习:第一天-------位运算

前言 位运算是在算法设计中的一种非常重要和高效的方法&#xff0c;常见的有与运算&#xff0c;非运算&#xff0c;异或运算。我们常用的比较多的可能就是异或运算&#xff0c;又叫无进位相加。 1.1 取非运算----&#xff08;~&#xff09; 取非运算其实就是和我们的无符号数…

cadence SPB17.4 - 用元件管理器来更新原理图中的元件属性信息

文章目录cadence SPB17.4 - 用元件管理器来更新原理图中的元件信息概述笔记修正原理图库修正CIS库的元件登记表ENDcadence SPB17.4 - 用元件管理器来更新原理图中的元件信息 概述 画好图后, 出了BOM. 同学指出BOM中有些元件型号信息不合适, 影响元件购买, 想改一下. 更新了原…

设计模式-桥接、职责链、中介

前言 本文为datawhale2022年12月组队学习《大话设计模式》task6打卡学习。 【教程地址】https://github.com/datawhalechina/sweetalk-design-pattern 一、桥接模式 1.1 基本定义 桥接模式&#xff08;Bridge Pattern&#xff09;又称为柄体(Handle and Body)模式或接口(In…

第十二讲:生成树概念及STP技术应用

在传统的交换网络中&#xff0c;设备通过单条链路进行连接&#xff0c;当某一个点或是某一个链路发生故障时可能导致网络无法访问&#xff0c;解决这种问题的办法是在网络中提供冗余链路&#xff0c;但是交换机网络中的冗余链路会产生广播风暴、MAC地址失效等现象&#xff0c;最…

StarRocks 统计信息和 Cost 估算

导读&#xff1a;欢迎来到 StarRocks 源码解析系列文章&#xff0c;我们将为你全方位揭晓 StarRocks 背后的技术原理和实践细节&#xff0c;助你逐步了解这款明星开源数据库产品。本期 StarRocks 技术内幕将主要介绍 StarRocks 统计信息和 Cost 估算。 1.背景 在学习本文之前&…

mysql搭建主从复制

Mysql主从复制搭建过程&#xff1a; 主从需同步时间&#xff0c;主开启ntpd&#xff08;ntp网络时间协议&#xff0c;它的端口号udp123&#xff09;服务-----修改配置&#xff0c;从通过/usr/sbin/ntpdate 主ip(ntpdate包需要提前安装)&#xff1b;主&#xff1a;开启中继二进…

整数划分问题(Java递归)

整数划分问题&#xff08;Java递归&#xff09; 文章目录整数划分问题&#xff08;Java递归&#xff09;0、 问题描述1、递归式2、代码3、参考0、 问题描述 整数划分问题 将正整数n表示成一系列正整数之和&#xff1a;nn1n2…nk&#xff0c;其中n1≥n2≥…≥nk≥1&#xff0c;k…

数字校园建设方案技术建议书

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 1.1 华为数字化…

“设计”小哥转行5G网络优化工程师!从零开始,三个月实现逆风翻盘~

5G网络优化&#xff0c;一个陌生的领域&#xff0c;对于一个毫无经验的小白来说&#xff0c;选择转行必定是需要勇气和决心的。好在&#xff0c;在决定选择5G网络优化的这一段时间里&#xff0c;老师给予了我最大的帮助和支持&#xff0c;包括从授课&#xff0c;到练习&#xf…

【Linux】基础IO(open、文件描述符、缓冲区)

文章目录1、从文件操作开始1.1 文件操作的系统调用接口1.2 文件描述符2、重定向3、缓冲区1、从文件操作开始 在C语言阶段&#xff0c;接触了很多库函数&#xff0c;如fopen、fclose、fread和fwrte&#xff0c;这些函数帮助了程序实现了内存与磁盘的输入输出功能。 不过之前都…

轻松搭建MQTT服务器,开发流程全透明

1、使用场景 MQTT服务器适用场景就不多介绍了&#xff0c;基本上实在IOT圈发光发热&#xff0c;所以说是特定领域的一个服务端软件&#xff0c;我们是用在车联网的环境里&#xff0c;用来发布消息。 2、选型 最早说需要使用mqtt服务器&#xff0c;然后我以为需要自己开发服务…