中国剩余定理

作者: 希望每天涨粉

中国剩余定理

有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。

《孙子算经》中首次提到了同余方程组问题,以及以上具体问题的解法,因此在中文数学文献中也会将中国剩余定理称为孙子定理。

换句话说:“一个正整数除以3余2,除于5余3,除于7余2,求这个正整数是几?”

基本解法:

1)先找到除以3余2,除于7余2的数是那些。经过分析得到满足要求的数是21的倍数加2。

2,23,44,65,96,107,……..

2)在上述结果中继续寻找除以5余3的数。

3)满足上述要求的正整数是:23,128,233,338

这里 128-23=105 正好是[3,5,7]的最小公倍数

古人的解法:

先找5和7的公倍数中除以3余1的数:70

再找3和7的公倍数中除以5余1的数:21

再找3和5的公倍数中除以7余1的数:15

70*2+21*3+15*2=233

233-105=128

128-105=23

所以这个正整数最小是23.

先考虑问题的分解:

问题1:计算一个整数 \[公式\] ,使得它满足除以3余2、除以5余3、除以7余2。

如果能够找到三个整数 \[公式\] ,使得:

\[公式\] 除以3余2、除以5余0、除以7余0;

\[公式\] 除以3余0、除以5余3、除以7余0;

\[公式\] 除以3余0、除以5余0、除以7余2;

那么令 \[公式\] ,就很容易验证这时的 \[公式\] 就满足除以3余2、除以5余3、除以7余2。

分别称找到整数 \[公式\] 的问题为问题1-1、问题1-2、问题1-3。可以看出这三个问题本质上是类似的。

普通的中国剩余定理要求所有的互素,那么如果不互素呢,怎么求解同余方程组?

  这种情况就采用两两合并的思想,假设要合并如下两个方程:

  那么得到:

  们需要求出一个最小的xx使它满足:

  那么x1x1和x2x2就要尽可能的小,于是们用扩展欧几里得算法求出x1x1的最小正整数解,将它代回a1+m1x1,得到x的一个特解x′,当然也是最小正整数解。{MathJax-Span-788}

  所以xx的通解一定是x′加上lcm(m1,m2)∗k,这样才能保证x模m1和m2的余数是a1和a2。由此,们把这个x′x′当做新的方程的余数,把lcm(m1,m2)当做新的方程的模数。(这一段是关键){MathJax-Span-870}

  合并完成:

代码:

include<bits/stdc++.h>
using namespace std; int const MAXN=10010; int x,y; int k;//k组同余方程
int a[MAXN];//每个同余方程的余数
int b[MAXN];//每个同余方程的模数
int ans; int lcm=1; void exgcd(int a,int b) { if(b==0){x=1;y=0;} else{ exgcd(b,a%b); int tmp=x; x=y; y=tmp-a/b*y; } return; } int main() { cin>>k; for(int i=1;i<=k;++i) cin>>b[i]>>a[i]; for(int i=1;i<=k;++i) lcm*=b[i]; for(int i=1;i<=k;++i) { exgcd(lcm/b[i],b[i]); x=(x%b[i]+b[i])%b[i]; ans=(ans+(lcm/b[i])*x*a[i])%lcm; } cout<<ans; }

原文创作:希望每天涨粉

原文链接:https://www.cnblogs.com/BlairGrowing/p/14076169.html

更多推荐

更多
  • Azure上Linux管理-十、使用 Azure Kubernetes 服务 技术要求,开始使用 AKS,与 Helm 一起工作,使用草稿,管理 Kubernetes,问题,进一步,使用 WSL 和 VS Code,安装依赖,kubectl 安装,使用 Azure CLI 创建集群,AKS 首次部署,创建服务,多
    Apache CN

  • Azure上Linux管理-十一、故障排除和监控您的工作负载 module(load="imuxsock"),技术要求,访问您的系统,Azure 日志分析,性能监控,问题,进一步,不允许远程访问,正在端口上工作,使用 nftables,引导诊断,Linux 登录,配置日志分析服务,安装 Azure
    Apache CN

  • Azure上Linux管理-十二、附录 第一章:探索微软 Azure 云,第二章:Azure 云入门,第三章:Linux 基础管理,第 4 章:管理 Azure,第五章:高级 Linux 管理,第七章:部署虚拟机,第八章:探索连续配置自动化,第 9 章:Azure 中的容器虚
    Apache CN

  • Azure上Linux管理-九、Azure 中的容器虚拟化 cloudconfig,集装箱技术导论,系统生成,Docker,Azure 容器实例,Buildah, Podman, and Skopeo,容器和储存,问题,进一步,容器历史,chroot 环境,OpenVZ,LXC,创建一个带启动的
    Apache CN

  • Azure上Linux管理-七、部署你的虚拟机 ResourceGroup 不存在,创建它:,vnet 不存在,创建 vnet,cloudconfig,Vagrant.config 结束,部署场景,Azure 中的自动部署选项,初始配置,流浪,封隔器,自定义虚拟机和 vhd,问题,进
    Apache CN

  • Azure上Linux管理-八、探索持续配置自动化 了解配置管理,使用 Ansible,使用地球形态,使用 PowerShell DSC,Azure 策略客户端配置,其他解决方案,问题,进一步,技术要求,Ansible 的安装,SSH 配置,裸最小配置,库存文件,Ansible 剧本和模
    Apache CN

  • Azure上Linux管理-五、高级 Linux 管理 技术要求,软件管理,网络,存储,systemd,问题,进一步,RPM 软件管理器,YUM 软件管理,基于 DNF 的软件管理,DPKG 软件管理器,运用 apt 进行软件管理,ZYpp 软件管理,识别网络接口,IP 地址识别,显示路由表
    Apache CN

  • Azure上Linux管理-六、管理 Linux 安全与身份 SELINUX=可以接受以下三个值之一:,permissiveSELinux 打印警告而不是强制执行。,disabled 没有加载 SELinux 策略。,SELINUXTYPE=可以接受以下三个值之一:,targeted 目标进程
    Apache CN

  • Azure上Linux管理-四、管理 Azure 使用 Azure CLI 和 PowerShell 管理 Azure 资源,技术要求,管理存储资源,管理网络资源,管理计算资源,虚拟机资源,问题,进一步,存储帐户,托管磁盘,Azure 文件,Azure Blob,虚拟网络,子网,网络安
    Apache CN

  • Azure上Linux管理-三、Linux 基础管理 Linux Shell,获取帮助,使用文本文件,在文件系统中找到你的方式,流程管理,自由访问控制,问题,执行命令,命令行编辑,与历史一起工作,自动完成,球状,重定向,处理变量,Bash 配置文件,使用手册页,使用信息文档,其他文档,文本
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多