数论(坑)

作者的话:
不想看数学公式的人,不可能完全弄懂数论。出来混,迟早是要还的。
我不知道小学生怎么样,但我觉得初中生应该是能看懂的,毕竟我也才初中。由于水平有限,如有错误请指正,谢谢!

定义

连乘 a 1 + a 2 + . . . + a n = i = 1 n a i
连加 a 1 × a 2 × . . . × a n = i = 1 n a i
全称量化   1 i n , i 2 0 1 i n   i , i 2 0

集合   R 实数集合
Q 有理数集合
Z 整数集合
N 自然数集合
N 正整数集合

整除 a | b a b 的约数
  a | b a 不是 b 的约数

最大公因数 [ a , b ] = l c m ( a , b )
最小公倍数 ( a , b ) = g c d ( a , b )

取整 x x 下取整
    x x 上取整

同余 a b ( m o d   m ) a   m o d   m = b   m o d   m

逆元:如果 ( a , m ) = 1 ,则存在 a 1 使得 a × a 1 1 ( m o d   m ) a 1 即为 a 的逆元。

欧拉函数 ϕ ( n ) = 小于等于 n 且与 n 互质的数的个数。即 ϕ ( n ) = i = 1 n [ g c d ( i , n ) = 1 ]
性质: i p r i m e , ϕ ( i ) = i 1

积性函数:如果对于任意满足 p , q N , g c d ( p , q ) = 1 p q
f ( q × p ) = f ( q ) × f ( p ) 均成立。则 f 是积性函数。

莫比乌斯函数 μ ( x ) = { 1 , x = 1 ( 1 ) k , x = p 1 p 2 . . . p k ,   p i p j ( p i x ) 0 , o t h e r s

模运算 a   m o d   b = a a / b × b ,即 a b 的余数。

性质

整除的性质

1. a | c , b | c , ( a , b ) = 1 a b | c
2. a | b c , ( a , b ) = 1 a | c
3. p | a b ( p | a ) ( p | b )

同余的性质

1. a b ( m o d   m ) m | ( a b )

2. a b ( m o d   m ) a b 0 ( m o d   m )

3. a b ( m o d   m ) a c b c ( m o d   m )

4. ( c , p ) = 1 ,则 a c b c ( m o d   p ) a b ( m o d   p )

5. a b ( m o d   p ) , a c b d ( m o d   p ) ,则 c d ( m o d   p )

6. a b ( m o d   m ) , a b ( m o d   n ) a b ( m o d   [ m , n ] )
: ( a b ) = x m = y n = k × [ m , n ]

7. ( k , m ) = d , k × a k × a ( m o d   m ) a a ( m o d   m d )
: ( k , m ) = d
    k     m   使   k = q × d , m = p × d
  k × a k × a = c × m
  a a = c × m k = c × m q × d = c q × m d

的性质

i ( ( j a j ) b i ) = i ( j ( a j b i ) ) = j ( a j i b i )
证明:乘法分配律
a = [ 1 , 2 , 3 ] , b = [ 4 , 5 , 6 ]
i ( ( j a j ) b i ) = ( 1 + 2 + 3 ) 4 + ( 1 + 2 + 3 ) 5 + ( 1 + 2 + 3 ) 6
= 1 4 + 2 4 + 3 4 + 1 5 + 2 5 + 3 5 + 1 6 + 2 6 + 3 6
= i ( j ( a j b i ) )
= ( 4 + 5 + 6 ) 1 + ( 4 + 5 + 6 ) 2 + ( 4 + 5 + 6 ) 3
= j ( a j i b i )

快速幂

x p = { ( x p 2 ) 2 , p 0 ( m o d   2 ) ( x p 2 ) 2 × x , p 1 ( m o d   2 )
因此可以二分

long long pow_mod(long long x, long long n, long long mod){
    long long res=1;
    while(n>0){
        if(n&1)
            res=res*x%mod;
        x=x*x%mod;
        n>>=1;
    }
    return res;
}

时间复杂度: Θ ( l o g 2 p )

二分乘法

x × p = { 2 ( x × p 2 ) , p 0 ( m o d   2 ) 2 ( x × p 2 ) + x , p 1 ( m o d   2 )
因此可以二分

unsigned long long mul_mod(long long a,long long b,long long m) {
    unsigned long long ans=0;
    a%=m;
    while(b) {
        if(b&1) {
            ans=(ans+a)%m;
            b--;
        }
        b>>=1;
        a=(a+a)%m;
    }
    return ans;
}

时间复杂度: Θ ( l o g 2 p )
有什么用吗?如果 x × p 会爆 l o n g   l o n g 呢?

欧几里得算法

结论: ( a , b ) = ( b , a   m o d   b )
证明:
a 可以表示成 a = k b + r ,则 r = a   m o d   b
d a , b 的一个公约数,则有
d | a , d | b ,而 r = a k b ,因此 d | r
d ( b , a   m o d   b ) 的公约数
a b 的公约数集合为 A b a   m o d   b 的公约数集合为 B
A = B ,故 ( a , b ) = ( b , a   m o d   b )

裴蜀定理

结论:如果 a , b N , ( a , b ) = d 那么一定存在 x , y 使得 d | ( a x + b y )
证明:   g c d ( a , b ) = d
必然存在   p     q   使得   a = p × d , b = q × d
  a x + b y = ( p × d ) x + ( q × d ) y = d ( p × x + q × y )
  d | ( a x + b y )

扩展欧几里得算法

直接作用:在执行欧几里得算法的时候可以顺便求出型如 a x + b y = ( a , b ) 的不定方程的通解。

由原欧几里得算法可得: ( a , b ) = ( b , a   m o d   b )
对于型如 a x + b y = ( a , b ) 的不定方程,根据裴蜀定理,原不定方程一定有解。
a x + b y = ( a , b ) = ( b , a   m o d   b ) = b x + ( a   m o d   b ) y
  a   m o d   b = a a / b × b
  a x + b y = b x + ( a a / b × b ) y = b x + a y a / b × b y = a y + b x a / b × b y = a y + b ( x a / b × y )
  x = y , y = x a / b × y

然后就可以愉快地递归啦。
边界条件
x = 1 , y = 0 [ b = 0 ]
其实还可以化简,即在递归的时候,计算exgcd(b,a%b,y,x)这样回来的时候 y 的值就已经放在 x 里了,然后再把y-=a/b*x就行了,当然也可以直接算。

int exgcd(int a,int b,long long &x,long long &y) {
    if(!b)
        return x=1,y=0,a;
    int d=exgcd(b,a%b,y,x);
    y-=a/b*x;//化简后的式子 
    return d;
}

时间复杂度: O ( 12 × ln 2 × ln m i n ( a , b ) ) π 2 + 1.47 ) O ( ln m i n ( a , b ) )

欧拉定理

结论:若存在 p a ,满足 p , a N , ( p , a ) = 1 ,则 a ϕ ( p ) 1 ( m o d   p )
证明:考虑 p 条同余式,其中   i ϕ ( p ) , m i < p
a × x 1 m 1 ( m o d   p ) ( 1 )
a × x 2 m 2 ( m o d   p ) ( 2 )
. . .
a × x ϕ ( p ) m ϕ ( p ) ( m o d   p ) ( ϕ ( p ) )
定义 X = { x i | 1 i ϕ ( p ) } , M = { m i | 1 i ϕ ( p ) }

引理 1: | M | = ϕ ( p )
证明:假设存在 i j ,满足 i > j , m i = m j
( i ) ( j ) a ( x i x j ) 0 ( m o d   p )
( a , p ) = 1
x i x j 0 ( m o d   p )
x i x j < p
x i x j | p
x i x j 0 ( m o d   p ) ,矛盾
不存在 i j ,满足 i > j , m i = m j
| M | = ϕ ( p )

引理 2: m i , m i X
证明: ( a , p ) = 1 , ( x i , p ) = 1
( a × x i , p ) = 1
( p , ( a × x i )   m o d   p ) = 1
( m i , p ) = 1
m i X

| M | = | X | = ϕ ( p )
M = X
ϕ ( p ) 条式子乘起来,得
i = 1 ϕ ( p ) ( a × x i ) i = 1 ϕ ( p ) m i ( m o d   p )
a ϕ ( p ) × i = 1 ϕ ( p ) x i i = 1 ϕ ( p ) m i ( m o d   p )
i = 1 ϕ ( p ) x i i = 1 ϕ ( p ) m i ( m o d   p )
a ϕ ( p ) 1 ( m o d   p )

费马小定理

结论:若存在 a p ,满足 ( a , p ) = 1 ,则 a p 1 1 ( m o d   p )
证明: p p r i m e , ϕ ( p ) = p 1
  a p 1 1 ( m o d   p ) ( )

逆元

扩展欧几里得

a × x 1 ( m o d   p ) x = a 1
a x b y = 1
用扩展欧几里得解不定方程即可,若 ( a , p ) = 1 ,则求得的 x 即为 a 1
但要注意, x 可能小于 0 ,但满足 x x + p ( m o d   p ) ,因此,把 x 加上一个 p 即可。

long long inv(long long a,long long n) {
    long long x,y;
    long long d=exgcd(a,n,x,y);
    return d==1?(x+n)%n:-1;
}

时间复杂度: Θ ( ln p )

费马小定理

p p r i m e 时, a p 1 1 ( m o d   p ) , ( a , p ) = 1
a p 1 × a 1 1 × a 1 ( m o d   p )
a p 2 a 1 ( m o d   p )
a 1 a p 2 ( m o d   p )

因此 a 的逆元即 a p 2   m o d   p

#define inv(x,mod) (pow_mod(x,mod-2,mod))

时间复杂度: Θ ( l o g 2 ( m o d 2 ) )

欧拉定理

( a , p ) = 1 时, a ϕ ( p ) 1 ( m o d   p )
a ϕ ( p ) × a 1 1 × a 1 ( m o d   p )
a ϕ ( p ) 1 a 1 ( m o d   p )
a 1 a ϕ ( p ) 1 ( m o d   p )
因此 a 的逆元即 a ϕ ( p ) 1   m o d   p
时间复杂度: Θ ( ϕ ( n ) + l o g 2 ( ϕ ( p ) 1 ) )

线性求逆元

显然地, 1 1 1 ( m o d   p )
对于 i ( i > 1 ) ,必然存在 k r ,使得 p = k × i + r ,满足 r < i , 1 < i < p
p 0 ( m o d   p )
k × i + r 0 ( m o d   p )
( k × i + r ) × ( i 1 × r 1 ) 0 × ( i 1 × r 1 ) ( m o d   p )
k × i × i 1 × r 1 + r × i 1 × r 1 0 ( m o d   p )
k × r 1 + i 1 0 ( m o d   p )
i 1 k × r 1 ( m o d   p )
k = p i , r = p   m o d   i
i 1 p i × ( p   m o d   i ) 1 ( m o d   p )
i 1 p p i × ( p   m o d   i ) 1 ( m o d   p )
因为在计算 i 之前, ( p   m o d   i ) 1 一定已经被算出来了,因此可以愉快地递推了。
代码 ( i n v [ i ] i 1 )

inv[1]=1;
for(int i=2;i<=n;i++)
    inv[i]=((long long)(mod-mod/i)*inv[mod%i])%mod;

时间复杂度: Θ ( n )

神奇“逆元”

逆元都必须在当 ( a , p ) = 1 时才存在,那如果题目没有保证 ( a , p ) = 1 呢?可以用下面的式子。
结论: a b   m o d   p = a   m o d   ( b p ) b

证明: a b   m o d   p = a b a b p × p

= a b a b p × p

= a b a b p × b × p b

= a b a b p × b p b

= a a b p × b p b

= a   m o d   ( b p ) b

p b 可能爆 l o n g   l o n g ,因此在计算时需要用到二分乘法。

猜你喜欢

转载自blog.csdn.net/linjiayang2016/article/details/80299904