算法总结之求解模线性方程组

1)求解模线性方程 ax = b(mod n)

  方程ax = b(mod n) -> ax = b + ny ->ax - ny = b

  -> ax + n (-y) =b 其中a,n,b已知。 可用扩展欧几里得来求解该方程的一组特解。

  这里给出下列几个定理用来求解方程:

  1.当且仅当d|b时,方程ax = b(mod n)有解。d=gcd(a,n)

  2.ax = b(mod n) 或者有d个不同解,或者无解。

  3.令d=gcd(a,n) 假定对整数x', y', 有d = ax' + ny', 如果d | b, 则方程ax = b(mod n)有一个解的值为x0, 满足:

    x0=x‘(b/d)(mod n)

  4.假设方程ax = b(mod n)有解, x0是方程的任意一个解, 则方程对模n恰有d个不同的解, 分别为:

    xi = x0 + i * (n / d), 其中 i = 1,2,3......d - 1

  根据这4个定理,运用扩展欧几里得算法就能轻易的求出模线性方程的所有解了。

伪代码如下:

1 MODULAR_LINEAR_EQUATION_SOLVER(a,b,n)
2 (d,x',y')=EXTENDED_EUCLID(a,n)
3 if (d|b)
4     x0=x'(b/d) mod n
5     for i=0 to d-1
6     print (x0+i(n/d)) mod n
7 else
8     print "no solutions"

2)求解模线性方程组

  x = a1(mod m1)

  x = a2(mod m2)

  x = a3(mod m3)

  

  先求解方程组前两项。 x=m1*k1+a1=m2*k2+a2

 -> m1*k1+m2*(-k2)=a2-a1

  这个方程可以通过欧几里得求解出最小正整数的k1 则x=m1*k1+a1 显然x为两个方程的最小正整数解。

  则这两个方程的通解为 X=x+k*LCM(m1,m2) -> X=x(mod LCM(m1,m2)) 就转换成了一个形式相同方程了

  在通过这个方程和后面的其他方程求解。最终的结果就出来了。

  以POJ2891为例 贴上代码:

Code:

 1 /*************************************************************************
 2     > File Name: poj2891.cpp
 3     > Author: Enumz
 4     > Mail: 369372123@qq.com
 5     > Created Time: 2014年10月28日 星期二 02时50分07秒
 6  ************************************************************************/
 7
 8 #include<iostream>
 9 #include<cstdio>
10 #include<cstdlib>
11 #include<string>
12 #include<cstring>
13 #include<list>
14 #include<queue>
15 #include<stack>
16 #include<map>
17 #include<set>
18 #include<algorithm>
19 #include<cmath>
20 #include<bitset>
21 #include<climits>
22 #define MAXN 100000
23 #define LL long long
24 using namespace std;
25 LL extended_gcd(LL a,LL b,LL &x,LL &y) //返回值为gcd(a,b)
26 {
27     LL ret,tmp;
28     if (b==0)
29     {
30         x=1,y=0;
31         return a;
32     }
33     ret=extended_gcd(b,a%b,x,y);
34     tmp=x;
35     x=y;
36     y=tmp-a/b*y;
37     return ret;
38 }
39 int main()
40 {
41     LL N;
42     while (cin>>N)
43     {
44         long long a1,m1;
45         long long a2,m2;
46         cin>>a1>>m1;
47         if (N==1)
48             printf("%lld\n",m1);
49         else
50         {
51             bool flag=0;
52             for (int i=2;i<=N;i++)
53             {
54                 cin>>a2>>m2;
55                 if (flag==1) continue;
56                 long long x,y;
57                 LL ret=extended_gcd(a1,a2,x,y);
58                 if ((m2-m1)%ret!=0)
59                     flag=1;
60                 else
61                 {
62                     long long ans1=(m2-m1)/ret*x;
63                     ans1=ans1%(a2/ret);
64                     if (ans1<0) ans1+=(a2/ret);
65                     m1=ans1*a1+m1;
66                     a1=a1*a2/ret;
67                 }
68             }
69             if (!flag)
70                 cout<<m1<<endl;
71             else
72                 cout<<-1<<endl;
73         }
74     }
75     return 0;
76 }

算法总结之求解模线性方程组相关推荐

  1. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)

    基于最大公约数欧几里得扩展算法求解算法导论中模线性方程解.具体要结合算法导论中的有关数论算法章节理解,具体代码如下: package cn.ansj;/*假设方程ax=b(mod n)有解,且x0是方 ...

  2. [高斯消元及理论]线性方程组整数/浮点数,模线性方程组,异或方程组模板

    文章目录 理论 线性方程组整数类型解 线性方程组浮点类型解 模线性方程组 异或方程组 高斯约旦消元 约旦消元 无解 无穷解 唯一解 理论 高斯消元法,是线性代数规划中的一个算法,可用来为线性方程组求解 ...

  3. 数据结构——基于 Dijsktra 算法的最短路径求解

    实验七 基于 Dijsktra 算法的最短路径求解 [实验目的] 掌握图的邻接矩阵表示法,掌握采用邻接矩阵表示法创建图的算法. 掌握求解最短路径的 Dijsktra 算法. [实验内容] 问题描述 一 ...

  4. 基于人工蜂群算法的线性规划求解matlab程序

    基于人工蜂群算法的线性规划求解matlab程序 1 人工蜂群算法概述 2005年D. Karaboga教授仿照蜜蜂集群采蜜生物行为,提出了人工蜂群仿生算法,可以有效解决有关函数优化等相关难题.ABC算 ...

  5. consplan r语言_模拟退火算法实现:求解中国31个城市TSP问题

    最近在学习玻尔兹曼机,里面用到了模拟退火算法,经过一天的实验,总算顺利完成,本文打算记录这一过程,以作备忘. 本文内容如下: 1.实验环境 2.算法原理简介 3.TSP案例代码实现 4.运行结果解析 ...

  6. PMSM永磁同步电机滑模控制的直接转矩控制改进算法仿真模型,在传统算法上结合滑模控制算法加以改进

    PMSM永磁同步电机滑模控制的直接转矩控制改进算法仿真模型,在传统算法上结合滑模控制算法加以改进,基于matlab/simulink搭建,以供参考学习 ID:8150678002556068阳光彩虹小 ...

  7. UVA-10929-You can say 11(秦九昭算法+同余与模算术)

    原题链接 1000位大数取余: 秦九昭算法+同余与模算术: 1314 = (((1)*10+3)*10+1)*10+4 ( a + b ) % n = ( ( a % n ) + ( b % n ) ...

  8. 数学建模学习(83):模拟退火算法(SA)求解多元函数

    接着上一篇函数的可视化进行讲解,那一篇画图实在太棒了,因此我单独写了一篇,本篇就着重于算法的原理与实现. 文章目录 一.基本思想 二.模拟退火算法过程 三.模拟退火算法的优缺点 四.函数可视化 4.1 ...

  9. 数据结构实验7《基于Dijsktra算法的最短路径求解》

    (visual studio 2019可运行) 输入及输出要求见<数据结构C语言(第二版)>严蔚敏版 [本文仅用于啥都看不懂还想交作业选手] 加了一点输入异常的反馈 基于基于Dijsktr ...

最新文章

  1. MySQL - 无索引行锁升级为表锁
  2. Got error -1 when reading table
  3. CSLA.Net 3.0.5 版本 教学程序,代码附教学注释
  4. Equipment download - post processing
  5. mysql 查询不为0的数据_查询数据库中所有记录总数不为0的数据表名称
  6. 在ASP.NET中使用Session常见问题集锦
  7. 商业价值:谷歌眼中的搜索未来
  8. WF学习系列之四:顺序工作流控制台应用程序模板介绍
  9. 计算机操作基本技能知识,计算机基本操作技能考核知识点
  10. 高通GPS芯片WGR7640的驱动
  11. 玩cf一直连接服务器失败怎么办啊,cf连接服务器失败怎么办?
  12. unity, Animation crossfade需要两动画在时间上确实有交叠
  13. 数学分析(1): 实数
  14. 【机器学习】使用scikitLearn对数据进行聚类:Kmeans聚类算法及聚类效果评估
  15. kubernetes 网络
  16. 【目标流畅阅读文献_语法篇】1.3简单句_动词时态
  17. matlab绘图实例-绘制双纵轴曲线图
  18. Linux简介及常用命令
  19. 【历史上的今天】12 月 18 日:Perl 1.0 诞生;音频制作软件 FL Studio 问世;微软发布 Windows MCE 2003
  20. 大数据技术与应用-D1

热门文章

  1. 嵌入式linux学习
  2. 中国营销界:震惊全球的六种“武器”
  3. 提取某一个镇的行政边界_关于获取某个省份下面的 镇的 行政区划编码。
  4. 威纶通定时循环操作宏_威纶通触摸屏宏指令的使用
  5. Sublime Text 使用介绍、全套快捷键及插件推荐
  6. JVM内存模型、逃逸分析以及发生GC的时机
  7. SpringBoot 精通系列-SpringBoot如何操作Memcache
  8. 易乐游无盘服务器缓存设置,易乐游缓存设置图文教程
  9. snmp有android代理端吗,Android实现snmp协议(1)
  10. OSSchedLock()--上锁函数