【数论】基础数论杂谈
到底是数论不过关。。。
update 15.12.23
Gauss消元
注意自由元和无解的处理
求矩阵逆元
将原矩阵A和一个单位矩阵I做成$(A,I)$,用初等行变换将大矩阵中的A变为E,则会得到$(E,A^{-1})$的形式
Exgcd
解$Ax+By=gcd(A,B)$
在求gcd的基础上加上求x和y
int ex_gcd(int a, int b, int &x, int &y)
{
if (b==0)
{
x=1, y=0; return a;
}
else
{
int d=ex_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
}
单变元模线性方程
解$Ax \equiv B(mod\;p)$
解法:
设$d=gcd(A,p)$,先用Exgcd求$Ax+py=d$的解
如果B不能整除d则无解,否则$mod\;p$意义下的解有d个,可以对某个解不断增加$p/d$得到
多解证明:
$$\frac{Ap}{d=gcd(A,p)}=lcm(A,p) \equiv 0(mod\;p)$$
void line_mod_equation(int a, int b, int n)
{
int x, y, ans;
int d=ex_gcd(a,n,x,y);
if (b%d==0)
{
x%=n; x+=n; x%=n; //x mod n
ans=x*(b/d)%(n/d); //%(n/d)是为了让ans为最小正整数解
rep(i, 1, d-1)
ans+=n/d;
}
}
中国剩余定理
解方程组$x \equiv a_i(mod\;m_i)$,其中$m_i$两两互质
解法:
令$M_i=\prod_{j \neq i}m_j$,解$M_ip_ia_i \equiv a_i(mod\;m_i) \Rightarrow M_ip_i \equiv 1(mod\;m_i)$
每个数解完累加起来,$\sum M_ip_ia_i\;mod\;M$就是答案了
平方剩余
解$x^2 \equiv a(mod\;p)$的最小非负整数解,其中p为素数
无解:当p为2时有解;当p为奇素数时有解的条件:
$$a^{(p-1)/2} \equiv 1(mod\;p)$$
解法:待补充
线性筛
以筛质数为例
void CalPri()
{
rep(i, 2, n)
{
if (valid[i]=false)
pri[++tot]=i;
rep(j, 1, tot)
{
valid[i]=true;
if (i%pri[j]==0) break;
}
}
}
离散对数(BSGS算法)
解$a^x \equiv b(mod\;p)$的最小整数解,其中p为素数
解法:BSGS算法
设s是满足$s*s>p$的最小整数
先预处理出$x^i(i \in [0,s-1])$并用Hash表储存
然后枚举$x^{is}(i \in [0,s-1])$,通过乘法逆元求出满足$c*x^{is}\equiv n(mod\;p)$的c,再判断c是否位于Hash表内,从而找到解
map<int,int>mp;
inline void GSBS(int a, int b, int p)
{
mp.clear();
int s=(int)sqrt(p); while (1LL*s*s<=p) s++;
int cnt=1; rep(i, 0, s-1) {if (!mp.count(cnt)) mp[cnt]=i; cnt=1LL*cnt*a%p;}
int mul=cnt, tmp; cnt=1; rep(i, 0, s-1)
{
tmp=1LL*b*Pow(cnt,p-2,p)%p;
if (mp.count(tmp)) {printf("%lld\n", 1LL*i*s+mp[tmp]); return;}
cnt=1LL*cnt*mul%p;
if (cnt==0) break;
}
puts("Orz, I cannot find x!");
}
Miller_Rabin素数测试
Lucas
求原根
数值积分
高阶代数方程求根
FFT
NTT
这些都待补充。。。
评论 (0)