数论入门
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
推论1:
对于a=ai (mod ni)的同余方程,有唯一解
下面说说由(a1, a2, ..., ak)求a的方法:
定义mi = n1*n2*...nk / ni; ci = mi(mf mod ni);其中mi*mf mod ni = 1;
则a = (a1*c1+a2*c2+...+ak*ck) (mod n) (注:由此等式可求a%n,当n很大时)
x ≡ aj(mod mj),1≤j≤k (3)
必有解,且解数为1。事实上,同余方程组(3)的解是:
x ≡ M1M1-1a1 + … + MkMk-1ak(mod m),(4)
这里,m = m1…mk,m = mjMj(1≤j≤k),以及Mj-1是满足:
MjMj-1 ≡ 1(mod mj),1≤j≤k (5)
n *= m[i];
for( i=0; i<k; i++ )
{
M = n/m[i];
d = ext_gcd( m[i], M, x, y );
a = (a+y*M*b[i])%n;
}
return (a+n)%n;
}
•题目:HDU 3579HDU 1573
bx2+(a mod b)y2=gcd(b,a mod b);
根据朴素的欧几里德原理有gcd(a,b)=gcd(b,a mod b);
则:ax1+by1=bx2+(a mod b)y2;
即:ax1+by1=bx2+(a-[a/b]*b)y2=ay2+bx2-(a/b)*by2;
根据恒等定理得:x1=y2; y1=x2-[a/b]*y2;
}
题目:HDU 1108HDU 1576
扩展欧几里得
定理
对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数,必然存在整
数对x,y,使得gcd(a,b)=ax+by。
求解x,y的方法的理解
设a>b。
1,显然当b=0,gcd(a,b)=a。此时x=1,y=0;
2,ab!=0时
设ax1+by1=gcd(a,b);
中国剩余定理关键是mf的求法,如果理解了扩展欧几里得ax+by=d,就可以想到:
mi*mf mod ni = 1 => mi*mf+ni*y=1;
代码
/求解模线性方程组(中国剩余定理)
// x ≡ b[0] (mod m[0])
// x ≡ b[1] (mod m[1])
// ...
// x ≡ b[k-1] (mod m[k-1])
的一个整数(即Mj是对模mj的逆)。
中国剩余定理(同余方程组)ຫໍສະໝຸດ Baidu结
中国余数定理:
设n=n1*n2...nk,其中因子两两互质.有: a-----(a1,a2,...,ak),其中ai = a mod ni,则a和(a1,a2,...,ak)关系是一一对应的.就是说可以由a求出(a1,a2,...,ak),也可以由(a1,a2,...,ak)求出a
x = 1, y = 0;
return a;
}
ret = ext_gcd( b, a%b, x, y );
t = x, x = y, y = t-a/b*y;
return ret;
}
中国剩余定理
中国古代求解一次同余式组(见同余)的方法。是数论中一个重要定理。又称中国剩余定理。
简介
数学公式
(中国剩余定理CRT)设m1,m2,...,mk是两两互素的正整数,即gcd(mi,mj) =1,i≠j,i,j = 1,2,...,k
这样我们就得到了求解x1,y1的方法:x1,y1的值基于x2,y2.
上面的思想是以递归定义的,因为gcd不断的递归求解一定会有个时候b=0,所以递归可以
扩展欧几里得代码
int ext_gcd( int a, int b, int& x, int& y )
{
int t, ret;
if( b==0 )
{
因此d也是(b,a mod b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
欧几里得算法模板
int gcd(int n,int m)
{
int t,r;
if(n<m)
{
t=n; n=m; m=t;
}
while((r=n%m)>0)
{
n=m;
m=r;
}
return m;
则同余方程组:
x≡b1(mod m1)
x≡b2(mod m2)
...
x≡bk(mod mk)
模[m1,m2,...,mk]有唯一解,即在[m1,m2,...,mk]的意义下,存在唯一的x,满足:
x≡bi mod [m1,m2,...,mk],i = 1,2,...,k
结论
设m1,…, mk是两两既约的正整数。那么,对任意整数a1,…, ak,一次同余方程组:
//要求m[i]>0,m[i]与m[j]互质,解的范围1..n,n=m[0]*m[1]*...*m[k-1]
int modular_linear_system( int b[], int m[], int k )
{
int d, x, y, a=0, M, n=1, i;
for( i=0; i<k; i++ )
欧几里得算法
欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b) (a>b且a mod b不为0)
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a,d|b,而r = a - kb,因此d|r
对于a=ai (mod ni)的同余方程,有唯一解
下面说说由(a1, a2, ..., ak)求a的方法:
定义mi = n1*n2*...nk / ni; ci = mi(mf mod ni);其中mi*mf mod ni = 1;
则a = (a1*c1+a2*c2+...+ak*ck) (mod n) (注:由此等式可求a%n,当n很大时)
x ≡ aj(mod mj),1≤j≤k (3)
必有解,且解数为1。事实上,同余方程组(3)的解是:
x ≡ M1M1-1a1 + … + MkMk-1ak(mod m),(4)
这里,m = m1…mk,m = mjMj(1≤j≤k),以及Mj-1是满足:
MjMj-1 ≡ 1(mod mj),1≤j≤k (5)
n *= m[i];
for( i=0; i<k; i++ )
{
M = n/m[i];
d = ext_gcd( m[i], M, x, y );
a = (a+y*M*b[i])%n;
}
return (a+n)%n;
}
•题目:HDU 3579HDU 1573
bx2+(a mod b)y2=gcd(b,a mod b);
根据朴素的欧几里德原理有gcd(a,b)=gcd(b,a mod b);
则:ax1+by1=bx2+(a mod b)y2;
即:ax1+by1=bx2+(a-[a/b]*b)y2=ay2+bx2-(a/b)*by2;
根据恒等定理得:x1=y2; y1=x2-[a/b]*y2;
}
题目:HDU 1108HDU 1576
扩展欧几里得
定理
对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数,必然存在整
数对x,y,使得gcd(a,b)=ax+by。
求解x,y的方法的理解
设a>b。
1,显然当b=0,gcd(a,b)=a。此时x=1,y=0;
2,ab!=0时
设ax1+by1=gcd(a,b);
中国剩余定理关键是mf的求法,如果理解了扩展欧几里得ax+by=d,就可以想到:
mi*mf mod ni = 1 => mi*mf+ni*y=1;
代码
/求解模线性方程组(中国剩余定理)
// x ≡ b[0] (mod m[0])
// x ≡ b[1] (mod m[1])
// ...
// x ≡ b[k-1] (mod m[k-1])
的一个整数(即Mj是对模mj的逆)。
中国剩余定理(同余方程组)ຫໍສະໝຸດ Baidu结
中国余数定理:
设n=n1*n2...nk,其中因子两两互质.有: a-----(a1,a2,...,ak),其中ai = a mod ni,则a和(a1,a2,...,ak)关系是一一对应的.就是说可以由a求出(a1,a2,...,ak),也可以由(a1,a2,...,ak)求出a
x = 1, y = 0;
return a;
}
ret = ext_gcd( b, a%b, x, y );
t = x, x = y, y = t-a/b*y;
return ret;
}
中国剩余定理
中国古代求解一次同余式组(见同余)的方法。是数论中一个重要定理。又称中国剩余定理。
简介
数学公式
(中国剩余定理CRT)设m1,m2,...,mk是两两互素的正整数,即gcd(mi,mj) =1,i≠j,i,j = 1,2,...,k
这样我们就得到了求解x1,y1的方法:x1,y1的值基于x2,y2.
上面的思想是以递归定义的,因为gcd不断的递归求解一定会有个时候b=0,所以递归可以
扩展欧几里得代码
int ext_gcd( int a, int b, int& x, int& y )
{
int t, ret;
if( b==0 )
{
因此d也是(b,a mod b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
欧几里得算法模板
int gcd(int n,int m)
{
int t,r;
if(n<m)
{
t=n; n=m; m=t;
}
while((r=n%m)>0)
{
n=m;
m=r;
}
return m;
则同余方程组:
x≡b1(mod m1)
x≡b2(mod m2)
...
x≡bk(mod mk)
模[m1,m2,...,mk]有唯一解,即在[m1,m2,...,mk]的意义下,存在唯一的x,满足:
x≡bi mod [m1,m2,...,mk],i = 1,2,...,k
结论
设m1,…, mk是两两既约的正整数。那么,对任意整数a1,…, ak,一次同余方程组:
//要求m[i]>0,m[i]与m[j]互质,解的范围1..n,n=m[0]*m[1]*...*m[k-1]
int modular_linear_system( int b[], int m[], int k )
{
int d, x, y, a=0, M, n=1, i;
for( i=0; i<k; i++ )
欧几里得算法
欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b) (a>b且a mod b不为0)
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a,d|b,而r = a - kb,因此d|r