首页 > 其他分享 >初等数论

初等数论

时间:2024-02-05 18:45:55浏览次数:24  
标签:gcd 数论 varphi times int div 初等 mod

·基础数论

· \(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) \]

标签:gcd,数论,varphi,times,int,div,初等,mod
From: https://www.cnblogs.com/hangry/p/18008633

相关文章

  • 数论
    数论1.数字题注意事项:0、负数、小数是否需要考虑错误输入,错误输入以后应该如何处理数据大小,类型范围int占4个字节,共32位:2^32=4,294,967,296JAVA中没有无符号的数,换言之,java中的数都是有符号的在计算机运算的时候,都是以补码的方式来运算的当我们看运算结果时,要......
  • ACM基础数论笔记
    基础数论部分整除定义设\(a,b\inZ,a\neq0,若\existq\inZ使得b=aq\),则b可被a整除,记作\(a\midb\),称b是a的倍数,a是b的约数不能整除\(a\nmidb\)定理\(a\mid{b}\iff-a\mid{b}\iffa\mid{-b}\iff|a|\mid|b|\)\(a\midb且b\midc\Rightarrowa\midc\)\(a\midb且a......
  • 数论基础(一)
    数学符号整除/同余理论常见符号整除符号:\(x\midy\),表示\(x\)整除\(y\)。取模符号:\(x\bmody\),表示\(x\)对\(y\)取模。互质符号:\(x\perpy\),表示\(x\)与\(y\)互质。同余:\(n\equivk\pmodm\),表示\(n\)与\(k\)在模\(m\)意义下同余。最大公约数:\(\gcd......
  • 数论
    数论1.快速幂解决次数很高的幂取模问题快速幂问题:求ab %p做法:(核心思想合并基数modp)利用while循环,循环条件是指数b不为0指数和1做&运算相当于将指数转为二进制再与1做&例如指数为6:就化成110&1为0每次&1会得到化成二进制后当前位数是1还是0还要设置一个基数base,每次base......
  • 【数论】【模版】二次剩余
    二次剩余问题其实就是数论中的开方运算。我们要解决这么一个问题,给定正整数\(n\),奇素数\(p\),求解\[x^2\equivn\pmodp\]本文内认为模数\(p\)是一个奇素数。定义若存在\(x^2\equivn\pmodp\),则称\(n\)为模\(p\)的二次剩余,反之则称\(n\)为模\(p\)的非二次剩......
  • 数论-二元一次不定方程
    原文 第1题   二元一次不定方程引理2如果a,b和c是正整数,满足(a,b)=1且a|bc,则a|c.证明 由于(a,b)=1,存在整数x和y使得ax+by=1.等式两边同时乘以c,得acx+bcy=c。根据定理2,a整除(cx)a+ y(bc),这是因为这是a和bc的线性组合,而它们都可以被a整除。因此,a l c。定理8设......
  • 数论-裴蜀定理
    原文 如果a与b均为整数,则存在整数x和y满足ax+by=(a,b)。由定理6容易证明正确性。 下面用扩展欧几里得算法(exgcd)求出满足ax+by=(a,b)的一个特解。例如:a=99,b=78,令d=(a,b)=(99,78)=3,求99x+78y=3的一个特解。在调用exgcd的时候,从后往前依次构造......
  • 数论-最大公因子及其性质
    原文如果a和b为不全为零的整数,则它们的公因子的集合是一个有限的整数集,通常包括+1和-1,我们对其中最大的那个公因子感兴趣.定义2 不全为零的整数a和b的最大公因子是指能够同时整除a和b的最大整数。a和b的最大公因子记作(a,b),(有时也记作gcd(a,b),特别是在非数论的著作中我们将......
  • 数论-整除性
    原文 定义1 如果a和b为整数且a≠0,我们说a整除b是指存在整数c使得b=ac。如果a整除b,我们还称a是b的一个因子,且称b是a的倍数.如果a整除b,则将其记为a|b,如果a不能整除b,则记其为a∤b。定理1如果a,b和c是整数,且a|b,b|c,则a|c.证明:因为alb,b|c,故存在整数e和f,使得ae=b,bf......
  • [数论学习笔记01]完系/同余最短路/费马小定理/扩欧/中国剩余定理
    #[数论学习笔记01]完系/同余最短路/费马小定理/扩欧/中国剩余定理###每日蒟蒻小故事(1/1)蒟蒻带了一本崭新的笔记本到S组.他发现这一节课居然在学习数论."听不懂,求讲解!"蒟蒻说.大佬邪魅一笑,并未理会.蒟蒻只能一边听着老师的讲解,一边努力地记着笔记."什么是完全剩余系......