Skip to content

Commit 9c59e69

Browse files
author
taotao
committed
总结同余方程及其模板
1 parent 4d63e5a commit 9c59e69

File tree

2 files changed

+211
-0
lines changed

2 files changed

+211
-0
lines changed

Diff for: math/数论算法模板总结.md

+148
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
2+
#公约数
3+
##gcd
4+
5+
```
6+
LL gcd(LL a,LL b)
7+
{
8+
return b==0? a:gcd(b,a%b);
9+
}
10+
```
11+
##ex_gcd
12+
13+
```
14+
//返回值为最大公约数
15+
LL ex_gcd(LL a,LL b,LL &x,LL &y)
16+
{
17+
LL d = a;
18+
if(!b){x = 1,y = 0;}
19+
else{
20+
d = ex_gcd(b,a%b,y,x);
21+
y-=a/b*x;
22+
}
23+
return d;
24+
}
25+
```
26+
#素数
27+
28+
##素因子分解
29+
$朴素算法O(\sqrt n)$
30+
```
31+
void prime_factor(int n,map<int,int> &pf)//
32+
{
33+
for(int i =2 ; i*i<=n ; ++i)//n为素数时!
34+
{
35+
while(n%i==0)
36+
{
37+
++pf[i];
38+
n/=i;
39+
}
40+
}
41+
if(n!=1)pf[n] = 1;
42+
}
43+
```
44+
##Eratosthenes筛法
45+
46+
```
47+
void Eratosthenes(int n)
48+
{
49+
memset(is_prime,true,sizeof(is_prime));
50+
51+
for(int i = 2 ; i*i<=n; ++i)
52+
if(is_prime[i])
53+
for(int j=i*i ; j<=n ; j+=i)is_prime[j] = false;
54+
}
55+
```
56+
##区间筛法
57+
58+
```
59+
void segment_sieve(LL a,LL b)//[a,b]
60+
{
61+
memset(is_prime_ab,true,sizeof(is_prime_ab[0])*(b-a+1));
62+
memset(is_prime_sqrtb,true,sizeof(is_prime_sqrtb[0])*(sqrt(b)+2));
63+
for(LL i = 2 ; i*i<=b ; ++i)
64+
if(is_prime_sqrtb[i]){
65+
for( LL j = i*i ; j*j<=b ; j+=i)is_prime_sqrtb[j] = false;
66+
for(LL j = max(i*i,(a-1)/i+1)*i ; j<=b ; j+=i)is_prime_ab[j-a] = false;
67+
}
68+
}
69+
```
70+
这篇博客简要总结一下,ACM中的一些初等数论问题,包括euler phi函数,中国剩余定理,,
71+
#euler phi函数
72+
$\phi(n) = n\prod_{i = 1}^{k}(1-\frac{1}{p_i})$
73+
证明详见《初等数论及其应用》
74+
75+
```
76+
int euler_phi(int n)
77+
{
78+
int ans = n;
79+
for(int i=2 ; i*i<=n ; ++i)
80+
if(ans%i ==0)
81+
{
82+
ans = ans/i*(i-1);
83+
while(n%i==0)n/=i;
84+
}
85+
if(n>1)ans = ans/n*(n-1);
86+
return ans;
87+
}
88+
```
89+
phi_table,类似于线性筛的做法
90+
91+
```
92+
void phi_table(int n)
93+
{
94+
memset(phi,0,sizeof(phi[0])*(n+5));
95+
phi[1] = 1;
96+
for(int i = 2 ; i<=n ; ++i)
97+
{
98+
if(!phi[i])//素数标记
99+
{
100+
for(int j = i ; j<=n ; j+=i)
101+
{
102+
if(!phi[j])phi[j] = j;
103+
phi[j] = phi[j]/i*(i-1);
104+
}
105+
}
106+
}
107+
}
108+
```
109+
110+
#模运算
111+
##power_mod
112+
113+
```
114+
LL power_mod(LL x,LL n,LL mod)
115+
{
116+
LL res = 1;
117+
while(n)
118+
{
119+
if(n&1)res = (res*x)%mod;
120+
x = (x*x)%mod;
121+
n>>=1;
122+
}
123+
return res;
124+
}
125+
126+
```
127+
128+
##大整数取模
129+
```
130+
LL big_mod(string val,LL mod)
131+
{
132+
LL res = 0;
133+
for(int i=0 ; i<val.length() ; ++i)
134+
{
135+
res = ((res)*10+val[i]-'0')%mod;
136+
}
137+
return res;
138+
}
139+
```
140+
##乘法逆元
141+
a在模n意义下的逆
142+
```c++
143+
LL inv(LL a,LL n){
144+
LL x,y;
145+
LL d = ex_gcd(a,n,x,y);
146+
return d==1? (x+n)%n:-1;//非负性保证.
147+
}
148+
```

Diff for: math/模方程.md

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#摘要
2+
总结线性同余方程的相关性质,中国剩余定理,线性同余方程组.
3+
#线性同余方程
4+
求解形如
5+
$$
6+
ax\equiv b(mod\ n)
7+
$$
8+
我们证明这样的解有 $d = gcd(a,n)$ 个(在模 $n$ 的意义下). 形如 $x = x_0 + (n/d)*t,t = 0,1,2,...,d-1(取遍d的剩余系)$
9+
* 引理1
10+
11+
若 $ac\equiv bc(MOD\ m),且,gcd(c,m) =d,则,a\equiv b(MOD\ m/d)$
12+
13+
**证:**
14+
15+
$由m \big | c(a-b),即m/d\ \big |\ c/d(a-b),而gcd(m/d,c/d) =1,所以 m/d\big |(a-b),$
16+
17+
即$a\equiv b(MOD m/d)$
18+
* 引理2**丢番图方程**
19+
20+
形如$ax+by=c,其中a,b,c,为整数,有整数解,当且仅当d = gcd(a,b) \big | c$,且,若$x_0,y_0为一组特解,则其所有解满足x = x_0+b/d*n,y = y_0-a/d*n$
21+
22+
**证明:**
23+
24+
不存在解的情况是很显然的,$由于 d \mid a,d\mid b,所以 d\mid ax+by,这与 d\nmid c矛盾$
25+
26+
若$x_0,y_0$,为他的一组特解(可以通过扩展gcd求出来)
27+
将$x = x_0+b/d*n,y = y_0-a/d*n$ 带入可以发现这样的 $x,y$ 满足解。下证,他的任意解满足上式
28+
29+
$$
30+
ax+by = c\\
31+
ax_0+by_0 = c\\
32+
$$
33+
相减,我们可以得到
34+
$$
35+
a(x-x_0) = b(y_0-y)\\
36+
a/d(x-x_0) = b/d(y_0-y)\\
37+
$$
38+
由于
39+
$$
40+
gcd(a/d,b/d) =1\\
41+
$$
42+
因此,
43+
$$
44+
b/d\mid (x-x_0)\\
45+
$$
46+
所以
47+
$$
48+
x = x_0+b/d*n
49+
$$
50+
同理可证$y$的情况
51+
* **线性同余方程的结论证明**
52+
53+
由于$ax\equiv b(MOD n),等价 ax+yn = b,(1)$,由丢番图方程的结论我们知道,(1)有解当且仅当$d=gcd(a,n)\mid b$ 并且 $解一定为 x = x_0+n/d*t$,他在模n意义下是有限的,下面我们来找两个解(MOD n)相等的条件.
54+
55+
设$x1 = x_0+n/d*t_1,x_2 = x_0+n/d*t2$,当他们同余的时候.
56+
57+
$$
58+
\begin{align}
59+
x_0+n/d*t_1&\equiv x_0+n/d*t2(MOD n)\\
60+
n/d*(t_1-t_2)&\equiv 0(MOD n)\\
61+
\end{align}
62+
$$
63+
由于$gcd(n/d,n)=n/d$,由引理1,我们的到$t_1\equiv t_2(MOD\ d)$,即当$t$取遍$d$的所有$d$同余类时$x$取遍所有解

0 commit comments

Comments
 (0)