数论
欧几里得算法
利用
[gcd(x,y) = gcd(y,x\%y)
]
可得代码
void gcd(int x,int y)
{
return x%y==0?y:gcd(y,x%y);
}
证明很简单,人教B版数学必修三
时间复杂度最大O(log n)
lcm(x,y) * gcd(x,y) = x * y
扩展欧几里得算法
用于求方程ax+by=gcd(a,b) 的一组可行解
[bx' + (a\% b)y' = gcd(b,a\% b)
]
[bx' + (a\% b)y' = gcd(a,b)
]
[bx' + (a-a/b*b)y' = gcd(a,b)
]
[ay' + b(x' - a/b*y') = gcd(a,b)
]
即为方程的解
void exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
y = 0;
x = 1;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
膜的性质
[(a + b) \% p = (a\%p + b\%p) \%p
]
[(a - b)\%p = (a\%p - b \%p)\%p
]
[(a * b)\%p = (a\%p) * (b\%p) \%p
]
逆元
对于 ∀ 正整数 x 满足 x < p,gcd(x,p) = 1,存在唯一的正整数 inv[x] 满足 inv[x] < p,x ∗ inv[x] ≡ 1( mod p),我们称 inv[x] 为 x 在模 p 意义下的逆元
求逆元
利用费马小定理或扩展gcd
费马小定理:
[a^{p-1} equiv 1 (mod p)
]
[Downarrow
]
[a^{p-2}equiv a^{-1}(mod p)
]
所以a模p意义下的逆元是a的p-2次方模p
利用快速幂,时间复杂度达到O(log n)
long long qpow(long long a,long long p,long long mod)
{
long long ans;
if(p==1) return m % mod;
ans = qpow(a,p>>1) % mod;
if(!n%2)
return ans * ans % mod;
else
return m * ans * ans % mod;
}
扩展gcd
求逆元转化成ax-my = 1
所以可以用扩展gcd
代码在上面
二元一次不定方程
形如ax + by = c 的方程,求x,y的整数解
若c不能被gcd(a,b)整除,方程无解
基于扩展gcd求解
原方程的一组解为
[x_2 = x_1frac {c}{gcd(a,b)},y_2 = y_1frac{c}{gcd(a,b)}
]
原方程的解集为
[{ (x,y)|x = x_2 + frac{b}{gcd(a,b)},y = y_2 - frac{a}{gcd(a,b)} }
]
中国剩余定理
同余方程组
形如
[egin{cases}
x equiv a_1(mod m_1)\
xequiv a_2(mod m_2)\
vdots\
x equiv a_n(mod m_n)
end{cases}
]
的方程叫做同余方程组
若x0为方程组的一个最小非负整数解,则解集为
[{ x| x=x_0 + k * lcm(m_1,m_2cdots m_n)}
]
因为方程组的两个非负整数解的差一定为 lcm(m 1 ,m 2 ...m n ) 的整数倍
且 x 0 + k ∗ lcm(m 1 ,m 2 ....m n ) 一定为方程组的解
中国剩余定理
中国剩余定理解决m1,m2……mn互质时的同余方程组