有序列表
1. LCM(a, b) = a / GCD(a, b) × b;//先除后乘 防止数字过大爆炸
2. 欧几里得cpp
void gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
3. 扩展欧几里得
void exgcd(LL a, LL b, LL &x, LL &y, LL &d){
if (!b) {d = a, x = 1, y = 0;}
else{
exgcd(b, a % b, y, x, d);
y -= x * (a / b);
}
}
4. 线性模方程的解
void mod_line(int a, int b, int n)
{
//ax = b (mod n)
int d, x, y, x0, i;
exgcd(a, n, x, y,d);
if(b%d == 0)
{
x0 = x * (b/d) % n + n;//x0为任意一个解
for(i = 0;i < d;i ++)
cout << (x0 + i*n/d) % n <<endl;//方程有d个解
}
}
一些结论(一下解都是基于整数):
若:ax = b mod n;
转化后 ax-kn=b;
设:
d=gcd(a,n)
d
=
g
c
d
(
a
,
n
)
上述方程的整数解可写成:
设一个解为
(x0,y0)
(
x
0
,
y
0
)
x=x0+i∗n/d,y=y0+i∗a/d
x
=
x
0
+
i
∗
n
/
d
,
y
=
y
0
+
i
∗
a
/
d
1.求任意解
设:
s=bd
s
=
b
d
则任意解为:
(x0∗s
(
x
0
∗
s
mod
n+n)
n
+
n
)
mod
n
n
2.求通解
首先,明确一点通解共有d个
求通解前要先求得一个任意解:设: mod
n+n)
n
+
n
)
mod
n
n
则通解为: mod n
0
0
≤i<
3.求最小正整数解
设:
m=nd
m
=
n
d
同样要先求一个任意解
x0
x
0
则最小正整数解为:
x0=(x0∗s
x
0
=
(
x
0
∗
s
mod
m+m)
m
+
m
)
mod
m
m
<script type="math/tex" id="MathJax-Element-1297">m</script>