扩展GCD 中国剩余定理(CRT) 乘法逆元模版

extend_gcd:

已知 a,b (a>=0,b>=0)

求一组解 (x,y) 使得 (x,y)满足

gcd(a,b) = ax+by

以下代码中d = gcd(a,b)。顺便求出gcd

能够扩展成求等式 ax+by = c,但c必须是d的倍数才有解,即 (c%gcd(a,b))==0

注意求出的 x,y 可能为0或负数

===================================

乘法逆元:

a*b %n == 1

已知 a, n, 求b 就是乘法逆元

===================================

中国剩余定理:

给定方程组:

x%a[0] = m[0]

x%a[1] = m[1]

···

x%a[n-1] = m[n-1]

求变量x 的值

m必须互质

当m不互质时用合并方程的做法

(合并方程的原因:当我们把n条方程合并成1条时就是extend能求的了,extend能求一条方程的解

问题描写叙述:给出bi。ni的值。且n1, n2, n3,…, ni两两之间不一定互质,求Res的值?

解:採用的是合并方程的做法。

这里将以合并第一第二个方程为例进行说明

由上图前2个方程得(设k1、k2为某一整数):

所以我们简化一下结论:

已知方程组(b1,b2,n1,n2是已知量):

res%b1 = n1

res%b2 = n2

->

合并两条方程得到:

res % ( (n1*n2)/d ) = b1+n1*( K%(n2/d))

当中K = (k1*(b2-b1)/d) % (n2/d);

当中d = gcd(n1,n2);

当中k1:

k1*n1 - k2*n2 = b2-b1

k1,d 能够直接由extend_gcd得到 extend_gcd(n1,n2,d,k1,k2);

(b2-b1)%d == 0 说明extend跑出的k1是一个解。否则说明不存在满足解的k1

注意求K时:为了得到最小非负整数K,所以用一个取模的技巧

K = (K%mod+mod)%mod;

例题及题解:点击打开链接

==================================

若 a == b (mod n)

能推出以下2条等式

1: (a+c) == b+c (mod n)

2:ac == bc (mod n) (但 ac==bc(mod n) 不能推出 a==b(mod n))

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define ll __int64
ll gcd(ll a, ll b) {
	return b == 0 ? a : gcd(b, a%b);
}
void extend_gcd (ll a , ll b , ll& d, ll &x , ll &y) {
	if(!b){d = a; x = 1; y = 0;}
	else {extend_gcd(b, a%b, d, y, x); y-=x*(a/b);}
}
ll china(ll l, ll r, ll *m, ll *a){ //下标[l,r] 方程x%m=a;
	ll lcm = 1;
	for(ll i = l; i <= r; i++)lcm = lcm/gcd(lcm,m[i])*m[i];
	for(ll i = l+1; i <= r; i++) {
		ll A = m[l], B = m[i], d, x, y, c = a[i]-a[l];
		extend_gcd(A,B,d,x,y);
		if(c%d)return -1;
		ll mod = m[i]/d;
		ll K = ((x*c/d)%mod+mod)%mod;
		a[l] = m[l]*K + a[l];
		m[l] = m[l]*m[i]/d;
	}
	if(a[l]==0)return lcm;
	return a[l];
}
时间: 2024-12-13 19:02:54

扩展GCD 中国剩余定理(CRT) 乘法逆元模版的相关文章

中国剩余定理(CRT) &amp; 扩展中国剩余定理(ExCRT)总结

中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300035 前置浅讲 前置知识点:\(Exgcd\) 这两个东西都是用来解同余方程组的 形如 \[ \left\{ \begin{aligned} x\equiv B_1(mod\ W_1)\x\equiv B_2(mod\ W_2)\ \cdots\x\equiv B_n(mod\ W_n)\\end{aligned} \rig

对于中国剩余定理(CRT)的初步理解

以前觉得用中国剩余定理来求同余方程组很鸡肋,因为可以用拓展欧几里得算法来构造出一种更加强大(可以处理取模的数(默认为mi)不互质的情况)的算法. 今天查了点资料,发现我太天真了. 首先讲讲中国剩余定理: 即 : x ≡ a[i] (mod m[i]) 1<= i <= r (m[i] 两两互质) 求这个同余方程组可以快速算: x = ∑M/m[i] * Inv(M/m[i], m[i]) * a[i] (mod M) 其中M = m[1]*m[2]*m[3]...m[r]  , Inv(x,

数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho

数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p2^{a2}p3^{a3}...pn^{an},b=p1^{b1}p2^{b2}p3^{b3}...pn^{bn}\),那么\(gcd(a,b)=\prod_{i=1}^{n}pi^{min(ai,bi)},lcm(a,b)=\prod_{i=1}^{n}pi^{max(ai,bi)}\)(0和任何

中国剩余定理(CRT)

今有物,不知其数,三三数之,剩二:五五数之,剩三:七七数之,剩二.问物几何          ——<孙子算经> 答为“23”.也就是求同余式组 x≡2 (mod3),x≡3 (mod5 ),x≡2 (mod7)的正整数解. 不难看出,题中3,5,7分别是互质的.具体解法是这样的 1.找出三个数:从3和5的公倍数中找出被7除余1的最小数15,从3和7的公倍数中找出被5除余1 的最小数21,最后从5和7的公倍数中找出除3余1的最小数70.2.用15乘以2(2为最终结果除以7的余数),用21乘以3(

HDU 5446 Unknown Treasure(lucas + 中国剩余定理 + 模拟乘法)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 题目大意:求C(n, m) % M, 其中M为不同素数的乘积,即M=p1*p2*...*pk, 1≤k≤10.1≤m≤n≤10^18. 分析: 如果M是素数,则可以直接用lucas定理来做,但是M不是素数,而是素数的连乘积.令C(n, m)为 X ,则可以利用lucas定理分别计算出 X%p1,X%p2, ... , X % pk的值,然后用中国剩余定理来组合得到所求结果. 比较坑的地方是,

扩展欧几里得算法、裴蜀定理与乘法逆元

扩展欧几里得算法 扩展欧几里得算法(扩O)能在求gcd(a,b)的同时求出丢番图方程ax+by=gcd(a, b)的解. 然而怎么求呢?我们观察gcd(a, b)=gcd(b, a%b),所以设如下两个方程: ax+by = gcd(a,b) = d: bx'+(a%b)y' = gcd(b,a%b): 明显gcd(a,b) = gcd(b,a%b),也就是ax+by = bx'+(a%b)y'. 为了求得x与y,我们需要保证a,b不变,所以:ax+by = bx'+(a%b)y' = bx'+

中国剩余定理及其拓展

中国剩余定理及其拓展 中国剩余定理CRT引例:(选自孙子兵法) 今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何? 怎么考虑这个问题? 按照题意: 设答案为x,则有 x≡2(mod 3) x≡3(mod 5) x≡2(mod 7) 就是求x的最小值 不难发现线性同余方程组的定义就是形如: x≡a1(mod m1) x≡a2(mod m2) x≡a3(mod m3) …………………………. x≡ak(mod mk) 的方程 Sol: 先看看解法:我们再来想想为什么是正确的. l 

Monkey Tradition(中国剩余定理)

Monkey Tradition Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Submit Status Description In 'MonkeyLand', there is a traditional game called "Bamboo Climbing". The rules of the game are as follows: 1)       There

欧几里得(辗转相除gcd)、扩欧(exgcd)、中国剩余定理(crt)、扩展中国剩余定理(excrt)简要介绍

1.欧几里得算法(辗转相除法) 直接上gcd和lcm代码. 1 int gcd(int x,int y){ 2 return y==0?x:gcd(y,x%y); 3 } 1 int lcm(int x,int y){ 2 return x*y/gcd(x,y); 3 } 2.扩欧:exgcd:对于a,b,一定存在整数对(x,y)使ax+by=gcd(a,b)=d ,且a,b互质时,d=1. x,y可递归地求得. 我懒得改返回值类型了 1 long long exgcd(long long a,