欧几里得定理
对任意的非负整数a和和任意正整数b,有gcd(a, b) = gcd(b, a%b)
这个定理可以用来求a和b的最大公约数,假设a>b,时间复杂度为O(logb)。
扩展欧几里得
它是欧几里得算法的推广,使它能计算出满足下列条件的整数系数x和y:
ax + by = gcd(a, b)
注意,x和y可能为0或负数,用它来计算模乘法的逆元也很有效。
根据gcd(a,b)=gcd(b,a%b)
ax + by = d (1)
bx' + (a%b)y' = d --> bx' + (a-a/b*b)y' = d -->
ay' + b(x' - a/b*y') = d (2)
若求出x'和y',比较式(1)和式(2)的系数,有:
x = y', y = x' - a/b*y'
扩展欧几里得与欧几里得运行时间相同,两者相差不超过一个常数因子。
typedef __int64 int64;
/**
功能:已知a,b,求解ax+by = gcd(a,b)
输入参数:a和b
输出参数:返回gcd(a,b),x,y。
*/
int64 Extend_Euclid(int64 a, int64 b, int64& x, int64& y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
int64 d = Extend_Euclid(b,a%b,x,y);
int64 t = x;
x = y;
y = t - a/b*y;
return d;
}
求解模线性方程
考虑求解下列方程:
ax = b (mod n)
设<a>表示由a生成的Zn的子群。由于<a>={ax mod n, x>0},所有方程有一个解b当且仅当b属于<a>。
定理:
对任意正整数a和n,如果d=gcd(a,n),则在Zn中
<a> = <d> = {0,d,2d,...,((n/d)-1)d}
因此有|<a>| = n/d。
方程ax=b(mod n)对于未知量x有解,当且仅当gcd(a,b)|b。它或者误解,或者有d个解,周期为n/d。
将方程改写为ax + ny = b。可以先求ax'+ny'=gcd(a,n)=d的一组解x'y',则x'b/gcd(a,b)是原方程的一个解,令它为x0。
解集可以写为:
xi = x0 + (n/d)*i
证明:
axi mod n = a(x0+(n/d)*i) mod n = (ax0 + ina/d) mod n = ax0 mod n (因为d|a) = b
所以方程有d个不同的解。
/**
功能:求解模线性方程ax=b(mod n)
输入参数:a,b,n
返回参数:模线性方程解的最小值,无解返回-1
*/
int64 Modular_Linear_Equation(int64 a, int64 b, int64 n)
{
int64 x,y;
int64 d = Extend_Euclid(a,n,x,y);
if(b%d)
return -1;
int64 x0 = x*(b/d);
x0 = (x0%n+n)%n;
return x0%(n/d); //d个解,相差n/d (模n/d同余)
}
例:POJ1061 2115
附POJ1061代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef __int64 int64;
int64 Extend_Euclid(int64 a, int64 b, int64& x, int64& y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int64 d = Extend_Euclid(b,a%b,x,y);
int64 t = x;
x = y;
y = t - a/b*y;
return d;
}
int64 Mod_Linear_Equation(int64 a, int64 b, int64 n)
{
int64 x1,y1,gcd;
gcd = Extend_Euclid(a,n,x1,y1);
if(b%gcd)
return -1;
//解集共d个解,周期为n/d,xi=x1+(n/d)*i(mod n)
return (x1*b/gcd%n + n)%n%(n/gcd);
}
int main()
{
int64 m,n,x,y,L;
int64 a,b,N;
while(scanf("%I64d %I64d %I64d %I64d %I64d",&x,&y,&m,&n,&L)!=EOF)
{
a = m - n;
b = y - x;
N = L;
if(a==0)
{
printf("0\n");
continue;
}
if(a < 0)
{
a = -a;
b = -b;
}
if(b < 0)
b = (b%N+N)%N;
int64 result = Mod_Linear_Equation(a,b,N);
if(result == -1)
printf("Impossible\n");
else
printf("%I64d\n",result);
}
return 0;
}
分享到:
相关推荐
ACM数论——ppt(天津大学)ACM数论——ppt(天津大学)
可求出形如ax=b(mod n)的方程的解,数论上的经典题目
华罗庚老先生的数论简介,包含数论 同余式 素数 不定方程 模变换等等
初等数论第五章同余方程.doc
算法-数论- 线性同余方程.rar
算法-数论- 线性同余方程组与中国剩余定理.rar
算法-数论- 高次同余方程与 BSGS 算法.rar
5.数论 //解模线性方程 6.计算几何 //凸壳、同等安置矩形的并的面积与周长 7.组合数学 //Polya 定理 8.模拟 9.数据结构 //并查集、堆 10.博弈论 1、 排序 2、 搜索、回溯、遍历 3、历法 4、 枚举 5、 数据结构的典型...
2. 模线性方程(组) 4 3. 素数表 6 4. 素数随机判定(miller_rabin) 6 5. 质因数分解 7 6. 最大公约数欧拉函数 8 二.图论_匹配 9 1. 二分图最大匹配(hungary邻接表形式) 9 2. 二分图最大匹配(hungary邻接表形式,邻接...
1.d/n 等价于n%d==0. 2.一个整数N的约数个数的上界为. 3.1-N 每个数的约数个数综合大约为N * log N 个。...数论分块: k/i (1<=i<=n) L,R每块的范围,x每块k/i的取值 for(int L=1,R;L<=n;L=R+1)
5.数论 //解模线性方程 6.计算几何 //凸壳、同等安置矩形的并的面积与周长 7.组合数学 //Polya定理 8.模拟 9.数据结构 //并查集、堆 10.博弈论 //表示举例 非主流算法: 1.送分题 2.构造 3.高精度 4....
数论基础算法模板
此资源概括了大部分数论的模板,很有好处!
西电的数论算法讲义,研究生课程,计算机学院课程
很实用的数论模板,也很全,希望能给你带来帮助。
数论模板精心整编,可以一看,以后上传计算几何模板
ACM+数论常用的模版
《数论基础及其应用》为数学与密码学交叉学科的特色教材,内容包括整除理论、同余、连分数、同余方程、原根。《数论基础及其应用》以数论知识为主线,有机地融入数论应用(主要是在密码学中的应用)的内容,理论与...
初等数论中二元不定方程的解的c语言程序初等数论中二元不定方程的解的c语言程序初等数论中二元不定方程的解的c语言程序