问题:模线性同余方程组:

  x = a1 ( mod n1 )

  x = a2 ( mod n2 )

    ....

  x = ak ( mod nk )

给定 A ( a1, a2 , ... , ak ) , N ( n1, n2, ..., nk ) 求 X 。

通常分为两种

  一, ( Ni, Nj ) 之间两两互质

  二, ( Ni, Nj ) 之间不都互质

一 ( Ni, Nj ) 之间两两互质

  定理( 见算法导论 P874 ):

  如果 n1, n2 , ... , nk 两两互质, n = n1*n2*..*nk ,则对任意整数 a1,a2,a3..,ak , 方程组

    x = ai ( mod ni )

  关于未知量 x 对 模n 有唯一解

从输入 ( a1, a2, ... , ak ) 计算出 a :

       

    定义  

    定义 

可以得到:

     

代码模板

  a = a[i] ( mod n[i] )   ( i = 0. 1. 2. .. k )       {  n[i] 之间两两互质 }

View Code#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;typedef long long LL;
const int N =  1010;LL a[N], n[N], nn, k;LL Exgcd( LL a, LL b, LL &x, LL &y )
{if( b == 0 ){ x = 1; y = 0; return a; } LL r = Exgcd( b, a%b, x, y );LL t = x;x = y; y = t - a/b*y;return r;
}
LL mul( LL a, LL b )
{LL res = 0;while( b ){if( b&1 ) if( (res+=a) >= nn ) res -= nn;a <<= 1; if( a >= nn ) a -= nn;b >>= 1;}return res;
}
LL inverse( LL A, LL B )
{//求逆元LL x, y;Exgcd( A, B, x, y );return (x%B+B)%B;
}
LL China(){scanf("%lld", &k);  // k个 模同余等式for(int i = 0; i < k; i++)scanf("%lld", &a[i] );for(int i = 0; i < k; i++)scanf("%lld", &n[i] );nn = 1;for(int i = 0; i < k; i++)nn *= n[i];LL A = 0;for(int i = 0; i < k; i++){// ci = mi * (mi^-1  mod ni )// ai * ci LL m = nn/n[i], m1 = inverse( m, n[i] );LL c = m*m1;A = ( A + mul( a[i], c ) ) % nn;}return A;
}int main()
{printf("%lld\n",China() );    return 0;
}

二( Ni, Nj ) 之间不都互质  

  

    x = ai ( mod mi )  1 <= i <= k

    先考虑k==2的情况:

      x = a1 ( mod m1 )

      x = a2 ( mod m2 )

   方程组有解的充分必要条件是: d | (a1-a2) ,其中 d = (m1,m2)

证明如下:

    必要性:

        设 x 是上面同余方程组的解,从而存在整数q1,q2使得x=a1+m1*q1,x=a2+m2*q2,消去x即得a1-a2 = m2q2-m1q1。由于d= GCD(m1,m2),故d | (a1-a2)。

    充分性:

        若d=GCD(m1,m2) | (a1-a2)成立,则方程m1*x + m2*y = a1-a2有解。

        设解为x0,y0。那么m2*y0 = a1-a2 ( mod m1 )

        记x1 = a2+m2*y0,可以知道 x1=a2 ( mod m2 ),且x1 = a2+m2*y0 = a2 + ( a1-a2) = a1 ( mod m1 )

        所以 x1 = a2 ( mod m2 ) = a1 ( mod m1 )

        所以 x = x1 ( mod GCD[m1,m2] )

        另外,若x1与x2都是上面同余方程组的解,则 x1 = x2 ( mod m1 ), x1 = x2 ( mod m2 ),

        由同余的性质得 x1 = x2 ( mod [m1,m2] ),即对于模[m1,m2],同余方程组的解释唯一的。

    证毕。

C++代码模板:

#include<stdio.h>
typedef long long LL;
LL ExGcd( LL a, LL b, LL &x, LL &y )
{if( b == 0 ) { x=1;y=0; return a; }LL r = ExGcd( b, a%b, x, y );LL t = x; x = y; y = t - a/b*y;return r;
}
LL Modline( LL r[], LL a[], int n )
{//  X = r[i] ( mod a[i] ) LL rr = r[0], aa = a[0];for(int i = 1; i < n; i++ ){// aa*x + a[i]*y = ( r[i] - rr );LL C = r[i] - rr, x, y;LL d = ExGcd( aa, a[i], x, y );if( (C%d) != 0 ) return -1;LL Mod = a[i]/d;    x = ( ( x*(C/d)% Mod ) + Mod ) % Mod;rr = rr + aa*x; // 余数累加aa = aa*a[i]/d; // n = n1*n2*...*nk}return rr;
}
// test
int main()
{int n;LL r[10], a[10];while( scanf("%d", &n) != EOF){for(int i = 0; i < n; i++)scanf("%lld", &r[i] );for(int i = 0; i < n; i++)scanf("%lld", &a[i] );printf("%lld\n", Modline( r, a, n ) );    }return 0;
}

转至http://www.cnblogs.com/yefeng1627/archive/2012/12/31/2841058.html

转载于:https://www.cnblogs.com/bo-jwolf/archive/2013/04/14/3033108.html

模线性同余方程组求解相关推荐

  1. 中国剩余定理与线性同余方程组求解

    中国剩余定理与线性同余方程组求解 线性同余方程组的形式 中国剩余定理 线性同余方程组的形式 实际上一元一次线性同余方程组,形式如下: { x ≡ r 0 ( m o d m 0 ) x ≡ r 1 ( ...

  2. 数论 —— 线性同余方程组与中国剩余定理

    [线性同余方程组] 由若干个线性同余方程构成的线性方程组. 例如: 其解法最早由我国<孙子算经>给出,因此解法称为"孙子定理",又叫"中国剩余定理" ...

  3. 【数论】同余(四):一元线性同余方程组(两两相消、中国剩余定理)

    同余问题共7part,我的博客链接: 基本概念与性质 逆元:概念.求解方法与推导 线性同余方程 一元线性同余方程 一元线性同余方程组 多元线性同余方程 高次同余方程:BSGS算法(大小步算法.拔山盖世 ...

  4. 线性同余方程组-中国剩余定理or合并方程

    线性同余方程组 完整代码见https://github.com/YIWANFENG/Algorithm-github 即若干个线性同余方程的组合. 求解方式可以参考我们普通的方程组,先解式1,将式1的 ...

  5. POJ2891——Strange Way to Express Integers(一元线性同余方程组)

    由若干个一元线性同余方程组构成的方程组,叫做一元线同余方程组. 求解 我们可以将其统一划成a*x ≡ b(mod m)的形式,这样有利于算法的实现. 对于同于方程组的求解,其实质过程就是对于其中的同余 ...

  6. Codeforces 338D 对线性同余方程组的一点理解

    题意有个大小n*m(两个数都不大于10的12次幂)的表格,table[i][j]的值为gcd(i, j).给出k(<=10000)个数 判断这个序列是否在表格中的某一列出现过 考虑解满足的条件 ...

  7. 解一元线性同余方程组(详解+例题)

    问题描述:给出bi,ni的值,且n1, n2, n3,-, ni两两之间不一定互质,求Res的值? 解:采用的是合并方程的做法. 这里将以合并第一第二个方程为例进行说明 由上图前2个方程得(设k1.k ...

  8. 同余问题及线性同余方程(组)

    同余 定义 如果a,b除以c的余数相同,就说a和b关于模c同余记作a≡b(mod c) 还可以这样理解 a − b = t a-b=t a−b=t,若 t ∣ c t|c t∣c(表示t可以被c整除) ...

  9. 专题·扩展欧几里得定理【including 求解二元一次方程,线性同余方程

    初见安~这里是基础数论专题(3)~[详见数论专栏] p.s:本文章假设你已经掌握了欧几里得算法--辗转相除法求最大公约数(gcd) 一.二元一次方程 形如的含有两个未知数且最高次数为1的方程我们称之为 ...

最新文章

  1. hadoop-2.7.1+zookeeper-3.4.8+hbase-1.2.1+apache-hive-2.0.0完全分布式集群
  2. [蓝桥杯][算法提高VIP]摆花-多重背包计数问题
  3. Silverlight 4新控件PivotViewer介绍
  4. Java讲课笔记16:内部类
  5. c语言side输出空心正方形,回溯法--正方形(蛋糕切分)问题
  6. SpringBoot系列(9):SpringBoot配置文件详解
  7. 详解:Drools规则引擎探究以及在IOT的应用
  8. linux qgis编译安装,QGIS安装
  9. AD13 plugins 安装
  10. 计算机体系架构未来趋势(深度)
  11. html中阳历生日转换成农历,农历转阳历换算(阴历和阳历生日转换器)
  12. mysql分级建表_Mysql如何使用命令实现分级查找帮助详解
  13. VEH(向量化异常处理)
  14. 将lrc批量转换为txt,同时删除时间标签
  15. 如何快速、有效地管理海量的、分散的数据?佳农靠它实现数智化
  16. 中国父母常犯的十大错误(转载)
  17. 应聘人工智能岗位?这10个必问的面试题,你准备好了吗
  18. Mac上面有哪些宝藏的软件
  19. 20万、50万、100万的算法工程师,有什么区别?
  20. 导航条形式 转自百度UEO

热门文章

  1. Dalvik虚拟机的内存管理
  2. 使用Controller.UpdateModel方法来更新ViewModel
  3. 简单易用的ASP.NET UBB编辑器
  4. 为什么每个程序员都应该学习C语言?
  5. java 模拟 减法 进位_位运算实现加减乘除四则运算(Java)
  6. mysql5.5默认引擎_InnoDB 作为默认存储引擎(从mysql-5.5.5开始)
  7. LeetCode 47. Permutations II
  8. js判断null_JavaScript中的undefined和null
  9. jar httpclient 少包,此处 区别 common-http包
  10. 构建入门Restful Web服务