模线性同余方程组求解
问题:模线性同余方程组:
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
模线性同余方程组求解相关推荐
- 中国剩余定理与线性同余方程组求解
中国剩余定理与线性同余方程组求解 线性同余方程组的形式 中国剩余定理 线性同余方程组的形式 实际上一元一次线性同余方程组,形式如下: { x ≡ r 0 ( m o d m 0 ) x ≡ r 1 ( ...
- 数论 —— 线性同余方程组与中国剩余定理
[线性同余方程组] 由若干个线性同余方程构成的线性方程组. 例如: 其解法最早由我国<孙子算经>给出,因此解法称为"孙子定理",又叫"中国剩余定理" ...
- 【数论】同余(四):一元线性同余方程组(两两相消、中国剩余定理)
同余问题共7part,我的博客链接: 基本概念与性质 逆元:概念.求解方法与推导 线性同余方程 一元线性同余方程 一元线性同余方程组 多元线性同余方程 高次同余方程:BSGS算法(大小步算法.拔山盖世 ...
- 线性同余方程组-中国剩余定理or合并方程
线性同余方程组 完整代码见https://github.com/YIWANFENG/Algorithm-github 即若干个线性同余方程的组合. 求解方式可以参考我们普通的方程组,先解式1,将式1的 ...
- POJ2891——Strange Way to Express Integers(一元线性同余方程组)
由若干个一元线性同余方程组构成的方程组,叫做一元线同余方程组. 求解 我们可以将其统一划成a*x ≡ b(mod m)的形式,这样有利于算法的实现. 对于同于方程组的求解,其实质过程就是对于其中的同余 ...
- Codeforces 338D 对线性同余方程组的一点理解
题意有个大小n*m(两个数都不大于10的12次幂)的表格,table[i][j]的值为gcd(i, j).给出k(<=10000)个数 判断这个序列是否在表格中的某一列出现过 考虑解满足的条件 ...
- 解一元线性同余方程组(详解+例题)
问题描述:给出bi,ni的值,且n1, n2, n3,-, ni两两之间不一定互质,求Res的值? 解:采用的是合并方程的做法. 这里将以合并第一第二个方程为例进行说明 由上图前2个方程得(设k1.k ...
- 同余问题及线性同余方程(组)
同余 定义 如果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整除) ...
- 专题·扩展欧几里得定理【including 求解二元一次方程,线性同余方程
初见安~这里是基础数论专题(3)~[详见数论专栏] p.s:本文章假设你已经掌握了欧几里得算法--辗转相除法求最大公约数(gcd) 一.二元一次方程 形如的含有两个未知数且最高次数为1的方程我们称之为 ...
最新文章
- hadoop-2.7.1+zookeeper-3.4.8+hbase-1.2.1+apache-hive-2.0.0完全分布式集群
- [蓝桥杯][算法提高VIP]摆花-多重背包计数问题
- Silverlight 4新控件PivotViewer介绍
- Java讲课笔记16:内部类
- c语言side输出空心正方形,回溯法--正方形(蛋糕切分)问题
- SpringBoot系列(9):SpringBoot配置文件详解
- 详解:Drools规则引擎探究以及在IOT的应用
- linux qgis编译安装,QGIS安装
- AD13 plugins 安装
- 计算机体系架构未来趋势(深度)
- html中阳历生日转换成农历,农历转阳历换算(阴历和阳历生日转换器)
- mysql分级建表_Mysql如何使用命令实现分级查找帮助详解
- VEH(向量化异常处理)
- 将lrc批量转换为txt,同时删除时间标签
- 如何快速、有效地管理海量的、分散的数据?佳农靠它实现数智化
- 中国父母常犯的十大错误(转载)
- 应聘人工智能岗位?这10个必问的面试题,你准备好了吗
- Mac上面有哪些宝藏的软件
- 20万、50万、100万的算法工程师,有什么区别?
- 导航条形式 转自百度UEO
热门文章
- Dalvik虚拟机的内存管理
- 使用Controller.UpdateModel方法来更新ViewModel
- 简单易用的ASP.NET UBB编辑器
- 为什么每个程序员都应该学习C语言?
- java 模拟 减法 进位_位运算实现加减乘除四则运算(Java)
- mysql5.5默认引擎_InnoDB 作为默认存储引擎(从mysql-5.5.5开始)
- LeetCode 47. Permutations II
- js判断null_JavaScript中的undefined和null
- jar httpclient 少包,此处 区别 common-http包
- 构建入门Restful Web服务