欧几里得定理
对任意的非负整数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;
}
分享到:
相关推荐
模线性方程`ax = b (mod n)`的基本解法之一是扩展欧几里得算法,它不仅可以找到两个整数的最大公约数(GCD),还可以得到它们的贝祖等式形式,即`ax + by = GCD(a, b)`。如果`GCD(a, n) = 1`,那么模线性方程有唯一...
模线性方程是数论中的一个重要概念,用于解决与整数相关的数学问题。本讲座主要探讨模线性方程的原理和解法,并通过一个实际应用——小球在棋盘上的滚动问题来阐述其应用。 模线性方程通常表示为 ax ≡ c (mod b) ...
此外,解决线性同余方程ax ≡ b (mod m)也离不开扩展欧几里得算法,当gcd(a, m) = 1时,线性同余方程有唯一解。 通过本次实验,学生不仅能加深对扩展欧几里得算法的理解,还能将理论知识与实践相结合,提升解决问题...
模逆元在求解模线性方程和RSA加密算法中起关键作用。 3. **最大公约数与最小公倍数**:最大公约数(GCD)和最小公倍数(LCM)是数论的基础概念,它们在算法中广泛应用于简化问题、计算频率、解决整数划分等问题。...
此外,线性同余方程的解法,如扩展欧几里得算法,是寻找模逆元和解决模线性系统的基石。 更高级的主题可能包括鸽巢原理、鸽巢原理在数论中的应用,以及更复杂的数域筛法,如Eratosthenes筛法的扩展,用于高效地找到...
例如,模指数运算 \(c = a^b \mod m\) 可以通过模乘快速幂算法和线性同余方程来高效实现。 此外,线性同余方程还在编码理论中发挥作用,如在纠错码的设计中,可以用线性同余方程来生成周期性的码字序列。在密码分析...
《算法-数论-整式方程》是一个深入探讨数论与整式方程的专题资料,主要聚焦在数学中的一个重要分支——数论,并且特别关注整式方程的求解及其应用。在这个主题中,我们将探讨整数、有理数以及更广泛的代数结构中的...
本文将详细解析ACM中常用的数论模版,包括欧几里得算法、扩展欧几里得算法以及中国剩余定理。 1. **欧几里得算法**:用于计算两个整数的最大公约数(Greatest Common Divisor, GCD)。在给出的代码中,`hcf`函数...
在提供的"数论- 线性同余方程组与中国剩余定理.pdf"文档中,可能会详细介绍线性同余方程组的定义、性质,中国剩余定理的证明过程,以及相关的算法实现和应用案例。通过阅读这份资料,读者可以全面了解这个主题,并...
当\(gcd(a, b) = 1\),即\(a\)和\(b\)互质时,该方程的解提供了\(a\)关于模\(b\)的逆元,这对于解模线性方程和模线性方程组至关重要。算法通过递归方式,不仅能找到最大公约数,还能同时求得满足上述方程的一组解\(...
以上所述内容涵盖了数论中的基础理论,包括模运算的性质、最大公约数的计算方法、欧拉定理及其应用、模线性方程的解法、中国余数定理以及处理非互质模数的同余方程组。这些知识在密码学、编码理论、算法设计等方面都...
此外,还有反素数、唯一分解定理、欧拉函数等概念,这些都是解决模线性方程和应用题目的关键。 3. **同余**:同余和同余方程在数论和竞赛编程中占据重要地位。模运算、欧几里得算法、扩展欧几里得算法等都是基础,...
- **欧几里得算法**:用于计算最大公约数(GCD),也是理解模逆元和模线性方程的基础。 - **模逆元**:在模运算中,如果`a`和`m`互质,那么存在一个模`m`的逆元`b`,使得`a * b ≡ 1 (mod m)`,这对于解决模线性方程...
在实际竞赛中,学习者会遇到各种基于数论的问题,例如,如何快速判断一个数是否为质数,如何计算两个大整数的最大公约数,或者如何解决模线性方程组等。通过对刘汝佳《NOIP CSP 竞赛 数论初步》的学习,参赛者不仅能...
6. 同余类:理解整数在模m下的等价关系,以及它们如何在模算术中进行加减乘除运算,这对于解决模线性方程组至关重要。 7. 费马小定理与欧拉定理:这两个定理在模运算中有着广泛应用,费马小定理指出a^(p-1) ≡ 1 ...
根据提供的文档信息,我们可以整理出一系列与数论相关的知识点,并对每个部分进行详细的解析和解释。 ### 1. 负数取模 在计算机科学中,取模运算通常用于获取除法运算的余数。当涉及到负数时,取模操作可能会有...
8. 线性同余方程:形如ax ≡ b (mod m)的方程,在模m意义下寻找整数解的问题。 9. 裴蜀定理(贝祖定理):给出了线性丢番图方程ax + by = c的整数解存在的条件。 10. 完全数与梅森素数:如果一个正整数恰好等于其...
- 线性同余方程形如`ax ≡ b (mod n)`,可以使用扩展欧几里得算法求解。如果`gcd(a, n)`能整除`b`,则存在解;否则无解。函数`modular_equation(__int64 a, __int64 b, __int64 c)`可以求解这类方程,并输出最小...
这在解决模线性方程、求模逆元等问题时非常关键,例如扩展欧几里得算法可以找到模逆元。 3. **最大公约数与最小公倍数**:GCD和LCM是整数运算的基础,它们在解决约分、最简分数、整数除法等问题时发挥作用。...