初等数论

·基础数论

· \(gcd\)--(欧几里得算法)

\(gcd\)是最大公约数的缩写。

现在给定\(2\)个数,让你求$gcd( \ i , \ j \ ) $

  1. $ O( n ) $
    从 $ min( i , j ) $ 枚举到 $ 1 $

  2. 使用 \(gcd\) 函数.
    伟大的欧几里得算法告诉我们: $ gcd(i,j)=gcd( i , j \ mod i ) $

· \(code\)

int gcd( int a , int b )
{
    if( b == 0 ) return a ; 
    return gcd( b , a % b ) ; 
}

· \(exgcd\)--(扩展欧几里得算法/裴蜀定理)


· $ First $ 裴蜀等式

一定存在一组\(x,y\)使得:

\[a \times x + b \times y = gcd( a , b ) \]


·\(Second\)--扩展欧几里得算法

已知\(a,b\)\(x,y\)满足上式。

证明:

\(\because\) $ gcd( a , b ) = gcd( b , a \ mod \ b ) $

\(x_0,y_0,x_1,y_1\)

一定存在

\[a \times x_0 + b \times y_0 = b \times x_1 + ( a \ mod \ b ) \times y_1 \]

化简:

\[a \times x_0 + b \times y_0 = b \times x_1 + a \times y_1 - [ a \div b ] \times b \times y_1 \]

移项得:

\[a \times x_0 + b \times y_0 = a \times y_1 + b \times ( x_1 - [a \div b ] \times b \times y_1 ) \]

易知存在一组\(x_0,y_0,x_1,y_1\) (注意:是存在一组,不是一定相等。)

\[x_0 = y_1 \]

\[y_0 = ( x_1 - [a \div b ] \times b \times y_1 ) \]


·\(Third \ -- \ code\)

int exgcd( int a , int b , int &x , int &y ) 
{
    if ( ! b )  
    {
        x = 1;
        y = 0;
        return a;
    }
    int d = exgcd( b , a % b , x , y ) ;
    int t = x ;
    x = y ;
    y = t - ( a / b ) * y ;
    return d ;
}

·乘法逆元(数学上叫数论倒数)


·\(First\)--定义

如果 $ gcd( a , p ) = 1 $ ,则存在:

\[a \times x \equiv 1 (mod \ p) \]

则称\(x\)\(a\)\(p\)的乘法逆元。\(x\) 写作 \(a^{-1}(mod \ p )\) 无歧义情况写作 \(a^{-1}\)


·\(Second\)

· 在同余式中,$ \beta \times a^{-1} \ 等价于 \ \beta \div a $

这个性质是逆元的最本质的用途。很容易证。

·求逆元

可以用\(快速幂\)\(扩展欧几里得算法(gcd(a,b)=1)\)(单点),\(线性推逆元\)(所有)

这里说一下线性推。

已知 \(1^{-1} , ... , {(i-1)}^{-1} ( mod \ p )\)
求 $i^{-1} { mod \ p } $

设一个 $ k = [ p \div i ] $ , $j=p \ mod \ i $

那么易知:

\[k \times i + j \equiv 0 ( mod \ p ) \]

两边同乘 $i^{-1} \times \ j^{-1} $

得:

\[k \times j ^{-1} \times i^{-1} \equiv 0( mod \ p ) \]

两边同减 \(k \times j ^{-1}\) ,为防止出现负数,加上 $k \times p $

得:

\[i^{-1} \equiv k \times (p-j^{-1})(mod \ p ) \]

\(\because\) $0 \le j < i $ ,

\(\therefore\) 可求 \(i^{-1}\)

·\(code\)
#define k p / i 
const int p = 1e9 + 7 ; 
int neoyong[ N ] ; 
inline void _neoyong( )
{
    neoyong[ 1 ] = 1 ; 
    for( int i = 2 ; i <= n ; ++ i )
    {
        neoyong[ i ] = ( k * ( p - neoyong[ p % i ] ) ) % p ; 
    }
}

·欧拉函数 \(\varphi(n)\)


·\(First\) -- 定义

\(1 .. n\) 中与 \(n\) 互质的数

例 $\varphi( \ 4 \ ) \ = \ 2 ( \ 1 \ , \ 3 \ ) $ ; $ \varphi( \ 10 \ ) \ = \ 4 $


· \(Second\) 求欧拉函数

·欧拉函数の拆解

现在给你\(n\),让你求它的欧拉函数,一路推过去的时间复杂度是 $O( n \log n ) $ $ \ \ $ \(T\)

考虑拆解欧拉函数。

可利用容斥原理对其进行求解

设 $n = \prod_{i=1}^k p_i^{a_i} $

易知共有 \([n \div p_i ]\)个数整除 \(p_i\)

共有 $ [n \div ( p_i \times p_j ) ] $ 整除 $p_{ij} $

......共有 $[ n \div (\prod_{i=1}^k p_i) ] $ 数整除 \((\prod_{i=1}^k p_i)\)

整合一下

\[\varphi(n)=n \times \prod_{i=1}^k ( ( p_i - 1 ) \div p_i ) \]

·单点

· \(code\)
int euler( int m )
{
    int Euler = m ; 
    for( int i = 2 ; i <= sqrt( n ) ; ++ i )
    {
        if( m % i == 0 )
        {
            Euler = Euler / i * ( i - 1 ) ;
            while( m % i == 0 )
            {
                m /= i ; 
            }
        }
    } 
    if( m > 1 )
    {
        Euler = Euler / m * ( m - 1 ) ; 
    }
    return Euler ; 
}

·线性

但万一它有多组数据呢?

线性推,你值得拥有。

考虑这个单点进行分类讨论。

  1. $ n \in \mathbb{P} $

显然 \(\varphi(n)=n-1\)

  1. $ ( n \div i ) \ mod \ i = 0 $

$\varphi(n) = \varphi(n \div i ) \times i $

因为 \(质因数\)的个数不变,前面的\(n\)扩大\(i\)倍。

\(\varphi(n)=n \times \prod_{i=1}^k ( ( p_i - 1 ) \div p_i )\)

\(\varphi(n\div i)=n \div i \times \prod_{i=1}^k ( ( p_i - 1 ) \div p_i )\)

\(k\) 不变,变的只是 \(n\div i -> n\)

  1. $ ( n \div i ) \ mod \ i \ne 0 $

除以 \(i\)\(i\) 除以 \(i-1\)和上面一个证明方法相似。

· \(code\)
void Euler( )
{
    euler[ 1 ] = 1 ; 
    for( int i = 2 ; i <= n ; ++ i )
    {
        if( ! if_change[ i ] ) 
        {
            primes[ ++ now ] = i ; 
            euler[ i ] = i - 1 ; 
        }
        for( int j = 1 ; primes[ j ] <= n / i ; ++ j )
        {
            if_change[ i * primes[ j ] ] = true ; 
            if( i % primes[ j ] == 0 )
            {
                euler[ i * primes[ j ] ] = euler[ i ] * primes[ j ] ;
                break ; 
            }
            euler[ i * primes[ j ] ] = euler[ i ] * ( primes[ j ] - 1 ) ; 
        }
        euler[ i ] += euler[ i - 1 ] ;
    }
}

·\(Thrid\) -- 一些定理

证明点这里

\(\color{pink}HZOI-Shadow大人\)

·费马小定理

(虽然和欧拉函数没啥关系,dam很有用)

\(gcd(a,p)=1\)

\[a^p \equiv a ( mod \ p ) \]

·欧拉定理

\(gcd(a,p)=1\)

\[a^{\varphi(p)} \equiv 1 \pmod{p} \]

·扩展欧拉定理

\[a^b \equiv \begin{cases}a^{b \bmod \varphi(p)} &\gcd(a,p)=1 \\ a^{b} &\gcd(a,p) \ne 1,b<\varphi(p) \\ a^{b \bmod \varphi(p)+\varphi(p)} &\gcd(a,p) \ne 1,b \ge \varphi(p)\end{cases} \pmod{p} \]

·其它1

  1. \(First\)

\[\sum_{i=1}^{n}[\gcd(i,n)=1] \times i = \cfrac{n \times \varphi(n)}{2} \]

  1. \(Second\)

    <1> \(若n是奇数:\) $ \varphi(2n) = \varphi(2) \times \varphi(n) $

    <2> \(若a,b互质\) $ \varphi(a \times b) = \varphi(a) \times \varphi(b) $

    \(ALL:\) 由上述两得知:欧拉函数是积性函数。

·欧拉反演

\[n = \sum_{d|n}\varphi(d) \]

posted @ 2024-02-05 18:35  HANGRY_Sol&Cekas  阅读(26)  评论(0编辑  收藏  举报