【数论】基础数论、质数、同余初步、数值计算
本原勾股数
每个本原勾股数组(a,b,c)(其中a为奇数b为偶数)都满足
a=stb=s2−t22c=s2+t22(s>t≥1andgcd(s,t)=1ands,t为奇数)
恒等式
(a2+b2)(c2+d2)=(ac+bd)2+(ad−bc)2
线性筛
以筛质数为例
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 ; } } } |
Miller–Rabin素数测试
测试N是否为素数,记2sd=N−1
对a∈[1,N−1]且a∤n
若admodN≠1且a2rdmodN≠−1(r∈[0,s−1])
则N是合数
否则,N有3/4的概率为素数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | inline ll Mult(ll x, ll t, ll Q) { ll k=0; while (t) { if (t&1) { k+=x; if (k>=Q) k-=Q; } t>>=1; x+=x; if (x>=Q) x-=Q; } return k; } inline ll Pow(ll x, ll t, ll Q) { ll k=1; while (t) { if (t&1) k=Mult(k,x,Q); t>>=1; x=Mult(x,x,Q); } return k; } inline bool MR(ll n) // Miller_Rabin { if (n<2) return false ; if (n==2) return true ; if ((n&1)==0) return false ; ll d=n-1, s=0; while ((d&1)==0) d>>=1, s++; rep( tm , 1, 8) { ll a= rand ()%(n-1)+1, ret=Pow(a,d,n), last=ret; rep(i, 1, s) { ret=Mult(ret,ret,n); if (ret==1 && last!=1 && last!=n-1) return false ; last=ret; } if (ret!=1) return false ; } return true ; } |
Pollard_rho质因素分解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ll gcd(ll a, ll b){ return b==0?a:gcd(b,a%b);} inline ll PR(ll n, ll c) // Pollard_rho { int i=0, k=1; ll x= rand ()%n, y=x; while (1) { i++; x=(Mult(x,x,n)+c)%n; ll d=gcd(y>x?y-x:x-y,n); if (d!=1 && d!=n) return d; if (y==x) return n; if (i==k) y=x, k<<=1, i=0; } } ll q[109]; int tot; void FindFac(ll n) { if (MR(n)) {q[++tot]=n; return ;} ll p=n; while (p==n) p=PR(p, rand ()%(n-1)+1); FindFac(p); FindFac(n/p); } |
费马大定理
当n≥3时方程
an+bn=cn
没有正整数解
费马小定理
ap−1≡1(modp)
变式:(前提gcd(a,n)=1)
aφ(n)≡1(modn)(欧拉定理)
威尔逊定理
(p−1)!≡−1(modp)
乘法逆元
①数a在(modp)意义下的逆元为ap−2
②数a在(modn)意义下的逆元需要通过Exgcd求解(有可能不存在逆元)
中国剩余定理(CRT)
解方程组x≡ai(modmi),其中mi两两互质
解法:
令
Mi=∏j≠imj
解
Mipiai≡ai⇒Mipi≡1(modmi)
所有pi解完累加起来,∑Mipiai(modM)就是答案了
欧几里德算法
1 | int gcd( int a, int b){ return b==0?a:gcd(b,a%b);} |
扩展欧几里德算法
解线性方程Ax+By=gcd(A,B)
在求gcd的基础上加上求x和y
原理:By+(AmodB)x⇒B(y−A/B∗B∗x/B)+Ax⇒Ax+B(y−A/B∗x)
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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≡B(modp)解
解法:
设d=gcd(A,p),先用Exgcd求Ax+py=d的解
由线性同余式定理可得,如果B不能整除d则无解
否则modp意义下的解有d个,可以对某个解不断增加p/d得到
多解证明:
Apd=gcd(A,p)=lcm(A,p)≡0(modp)
1 2 3 4 5 6 7 8 9 10 11 12 | 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; } } |
Gray码
性质:一个0→2n−1的排列且相邻两项(包括头尾相邻)的二进制数中只有一位不同
高阶代数方程求根
数值积分