数论基本定理和欧拉广义降幂公式

一. 威尔逊定理

当p为素数时,(p-1)!= -1(mod p)

其逆定理也成立,移项得:(p-1)! + 1 整除 p

二. 费马小定理

当gcd(a,p)= 1且p为素数时,a ^(p-1)= 1(mod p)

而a ^ 0 = 1(mod p),因此存在长度为p-1的循环节,费马降幂:a ^ b mod p = a ^(b mod p-1)mod p

三. 欧拉定理

当gcd(a,m)= 1时,a ^ {\ phi(m)} \ equiv 1(mod~m)

\ phi(m)为小于m且与m互质数的个数,费马小定理就是欧拉定理的一种特殊情况 

四. 裴蜀定理

任意对两个整数 A,B,设d它们的最大公约数 

当且仅当m是d的倍数时,ax + by = m才有整数解

扩展欧几里得算法求解即可

1)计算\ phi(m)

先说明\ phi()函数是积性函数,对于积性函数,若gcd(m,n)= 1,则 \ phi(m * n)= \ phi(m)* \ phi(n)

②对于素数p,在1到p ^ k中p,2p,3p ......(p ^ k-1),(k-1)个数与p ^ k不互质,因此\ phi(p ^ k)= p ^ kp ^ {k-1}

根据唯一分解定理,m = p_1 ^ {k_1} p_2 ^ {k_2} p_3 ^ {k_3} ...... p_i ^ {k_i}(pi为m的质因子),再根据上述两点得到\ phi(m)

= \ phi(p_1 ^ {k_1})\ phi(p_2 ^ {k_2})..... \ phi(p_i ^ {k_i})

=(P_1 ^ {} K_1 -p_1 ^ {k_1-1})(P_2 ^ {} K_2 -p_2 ^ {k_2-1})......(P_I ^ {} K_I -p_i ^ {K_I-1 })

= P_1 ^ {K1}(1- \压裂{1} {P_1})* P_2 ^ {K2}(1- \压裂{1} {P_2})...... * P_I ^ {き} ...(1  -  \压裂{1} {P_I})

= M *(1- \压裂{1} {P_1})*(1- \压裂{1} {P_2}).....(1- \压裂{1} {P_I})

2)计算1到m所有数的欧拉值(欧拉筛+积性函数)

void Get_Eular()
{
    int n = 0;
    phi[1] = 1;  
    for(int i=2;i<maxn;++i)
    {
        if(!phi[i])             //i为素数
        {
            phi[i] = i-1;       
            prime[n++] = i;
        }
        for(int j=0; j<n&&i*prime[j]<=maxn;++j)
        {
            if(i%prime[j]==0)
            {
                phi[i*prime[j]] = phi[i]*prime[j]; //i*prime[j]的素因子和i是一样的,只相当与上文中的m扩大了
                break;
            }
            else phi[i*prime[j]] = phi[i]*phi[prime[j]];//积性函数的性质,i与prime[j]互质
        }
    }
}

3)欧拉因子求和

假设n的因子为d1,d2 ...... di,则欧拉函数和F(n)= \ phi(d1)+ \ phi(d2)+ ...... + \ phi(di)F(n)也是积性函数,对于素数p,那么p ^ k的因子就有p,p ^ 2,p ^ 3 ...... p ^ k,再结合公式②,得到F(p ^ k)= 1 +(p-1)+(p ^ 2-p)+ ...... +(p ^ kp ^ {k-1})= p ^ k,根据唯一分解定理m = p_1 ^ {k_1} p_2 ^ {k_2} p_3 ^ {k_3} ...... p_i ^ {k_i},,有F(m)

= F(P_1 ^ {K_1} * P_2 ^ {} K_2 ...... P_I ^ {K_I})

= F(P_1 ^ {K_1})* F(P_2 ^ {} K_2)...... F(P_I ^ {K_I})

= P_1 ^ {K_1} * P_2 ^ {} K_2 ...... P_I ^ {} K_I

=米

4)互质数的和

在小于m的数中,与m互质的数的总和为:\phi(m)*m/2 ,首先要知道若n与m互质,则m-n与m互质,所以在m> 1时,与m互质的数总是一对一对的出现,且每一对的和为m,总共\phi(m)/2

5)欧拉广义降幂

不难发现:

当满足gcd(A,P)= 1时 , a ^ {\ phi(p)} \ equiv 1(mod~p),所以a^b:

\ equiv a ^ {b~mod {\ phi(p)} + \ phi(p)}(mod~p) 

\ equiv a ^ {b~mod \ phi(p)} * a ^ {\ phi(p)}(mod~p)

\ equiv a ^ {b~mod \ phi(p)}(mod~p)

(1)所以有:

a ^ b \ equiv \ left \ {\ begin {matrix} a ^ {b}&(b <\ phi(p))\\ &&(mod~p)\\ a ^ {b~mod \ phi(p) + \ phi(p)}&(b> = \ phi(p))\ end {matrix} \ right。

(2)求 a ^ x % p,当 p 为质数时,如果 a 是 p 的倍数,直接输出0,否则可以直接降幂,即:x%phi(p),因为此时gcd(a,p) = 1

四. 欧拉广义降幂应用

1. BZOJ 3884

描述:

è¿éåå¾çæè¿°

解:

观察上面的欧拉降幂就会发现这是一个递归,当phi()函数值为1时就递归结束,因为任何数对1取余都等于0,而幂为无穷,恒满足B> = \披(p)的,所以:

2 ^ {2 ^ {2 ^ {2 ^ {2 ^ {...}}}}} \ equiv 2 ^ {({2 ^ {2 ^ {2 ^ {2 ^ {...}}}} mod 〜\ phi(p)+ \ phi(p)})}(mod~p)

代码:

#include<iostream>
using namespace std;
typedef long long LL;
LL Eular(LL p)   //计算p的欧拉值
{
    LL ans = p;
    for(int i=2;i*i<=p;++i)
    {
        if(p%i==0)
        {
            ans = ans - ans/i;
            while(p%i==0)
                p /= i;
        }
    }
    if(p>1) ans = ans - ans/p;
    return ans;
}
LL quick_pow(LL a,LL x,LL p)
{
    LL ans = 1;
    while(x)
    {
        if(x&1) ans = ans*a%p;
        a = a * a % p;
        x >>= 1;
    }
    return ans;
}
LL cal(LL p)
{
    LL mod = Eular(p);
    if(mod==1) return quick_pow(2,0+1,p);
    return quick_pow(2,cal(mod)+mod,p);
}
int main()
{
    LL p,t;
    cin>>t;
    while(t--)
    {
        cin>>p;
        cout<<cal(p)<<endl;
    }
}

 

五. 经典例题

1.  HDU 2973   (威尔逊定理)

2.  HDU 3501   (互质数的和)

3.  ICPC焦作网络赛(费马降幂)

4.  codefores  (欧拉降幂)

5.  HDU 3221(欧拉降幂)

6.  牛客网  (裴蜀定理)

7. Codeforces Round#454(Div.1)D.Power Tower(欧拉降幂)

六. 说明

关于F(n)的的积性函数的证明

关于披(N)的积性函数的证明

关于欧拉降幂的证明

个人认为证明过程没必要过多纠结!

 

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值