则称a为模m的三个原根,数论复习之费马与欧拉

卓绝例题:51nod  1135  原根

欧拉函数的概念:

在数论中,对李晖整数N,少于或等于N
([1,N]),且与N互质的正整数(包罗1)的个数,记作φ(n)。

φ函数的值:

φ(x)=x(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))…..(1-1/p(n))
其中p(1),p(2)…p(n)为x

的拥有质因数;x是正整数;
φ(1)=1(唯一和1互质的数,且低于等于1)。注意:每个质因数只有2个。

例如:

φ(10)=10×(1-1/2)×(1-1/5)=4;

1 3 7 9

φ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;

φ(49)=49×(1-1/7)=42;

欧拉函数的质量:

(1) p^k型欧拉函数:

若N是质数p(即N=p),φ(n)= φ(p)=p(1-1/p)=p-1。
所以除了p本人本人外,[1,p-1]的任何数都与p互质,所以φ(p)=p-1,别的由公式得到φ(n)=
φ(p)=p(1-1/p)=p-1。

若N是质数p的k次幂(即N=p^k), φ(n)= p^ k -p^(k-1)
=(p-1)p^(k-1)
。y因为除了p的翻番以外,其余数都与N互质。而是p的倍数的数有p,2p,3p…p^(k-1)*p,一共有p
^ ( k- 1)个,所以有p^k -p ^ (k-1) =(p-1)p^(k-1)个数与p互质。

(2)mn型欧拉函数

设m,n为正整数,若m,n互质,φ(mn)=(m-1)(n-1)=φ(m)φ(n)。不难精晓mn与m的倍数或然n的翻番不互质,而n的翻番有n,2n,3n…mn,共有m个,m的倍数有m,2m,3m…nm,共有n个,又mn重复计数,所以共有n+m-2个,至于k1*n和k2*m中会不会有重新计数呢?因为n,m为质数,要使得k1n=k2m,那么k1=n,k2=m;所以与mn互质的有m*n-(n+m-1)=(m-1)*(n-1)=φ(m)φ(n)

(3)特殊属性:

若n为奇数时,φ(2n)=φ(n)。

对于其余多少个互质 的正整数a,n(n>2)有:a^φ(n)=1 mod n
(恒等于)此公式即 欧拉定理

当n=p 且 a与素数p互质(即:gcd(a,p)=1)则上式有: a^(p-1)=1 mod p
(恒等于)此公式即 费马小定理

若是(a,c)互质,且c是素数,则(a ^ b)%c=a ^ ( b % ( phi(c) ) )%c ,
phi(c) 是指c的欧拉函数

四 欧拉函数的延长:
( 一 )
小于或等于n的数中,与n互质的数的总数为:φ(n) * n / 2 (n>1)。
( 二 )
概念:n的原根x满足条件0<x<n,并且有汇集{ (xi mod n) | 1 <= i
<=n-1 } 和集纳{ 1, …, n-1 }相等

定理:假诺p有原根,则它恰有φ(φ(p))个差异的原根。

数论复习之费马与欧拉

 

例题
a ^ b ^ c mod 1000000007

QB_UDG  2016年11月8日10:16:18

设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的1个原根。(个中φ(m)表示m的欧拉函数)

#include<stdio.h>
#include <string.h>
using namespace std;
#define Mod 1000000007
int powMod(int a,int b,int c)
{
    int res=1,base=a;
    while(b)
    {
        if(b&1) res=((long long)res*base)%c;
        base=((long long)base*base)%c;
        b>>=1;
    }
    return res;
}
int main()
{

    int a,b,c;
     while(~scanf("%d%d%d",&a,&b,&c))
        {
        int resul=powMod(b,c,Mod-1);
        printf("%d\n",powMod(a,resul,Mod));

        }
}

1.费马小定理 Fermat 西奥ry

如果 p是素数,且a与p互质,即gcd(a,p)=1   那么(a^p-1) ≡ 1 (mod
p)

应用: 求乘法逆元

 

*乘法逆元:
(x\
x’)≡ 1 (mod p) 称x’为x模p的乘法逆元 (注意,一定固然余1)

逆元 :(b/a) (mod n) = (b * x) (mod n)。 x表示a的逆元。并且 a*x ≡ 1
(mod n)  注意:唯有当a与n互质的时候才存在逆元

留神,逆元也能够那样敞亮,求贰个微小的正整数x(逆元),使a乘以x对m的取余等于1对m的取余,
所以m=1 时,逆元为1

 

因为(a^p-1) ≡ 1 (mod p) 那么 (a*a^p-2)≡ 1 (mod p) 
所以 a^p-2就是a关于模p的乘法逆元

 

逆元用处:

在求解除法取模难点(a/b)%m时,大家能够转化为(a%(b∗m))/b, 
只是只要b一点都不小,则会现出爆精度难点,所以大家防止选择除法直接总结。 
能够行使逆元将除法转换为乘法: 
要是b存在乘法逆元,即与m互质(充要条件)。设c是b的逆元,即b∗c≡1(mod
m),那么有a/b=(a/b)∗1<=>(a/b)∗b∗cóa∗c (mod m) 
即,除以3个数取模等于乘以那几个数的逆元取模。

 

于是求(a/b)mod p 就变换为求(a*b’)mod p =( (a mod p)*(b^p-2 mod p) )mod
p

适用于P为质数

 

付出一个质数P,找出P最小的原根。

求欧拉函数的方法
( 一 ) 依据定义来贯彻

2.欧拉函数 对于3个正整数x,小于x且和x互质的正整数的个数,记做:φ(x)  当中φ(1)被定义为1,不过并不曾其它实质的含义

通式1:φ(x)=x*(1-  1/p1)***(1-  1/p2)*(1- 
1/p3)*…..*(1-  1/pn) 
个中p1, p2,p3……pn为x的持有质
因数**

通式2:若x是质数p的k次幂,即x=p^k,有φ(x) = p^k – p^(k-1) =
(p-1)*p^(k-1) 
因为x的质因数唯有p,所以除了p的翻番外,别的数都跟x互质。(程序中大家一般将φ(x)写成phi(x))。

 

 

性质:

1.若x,y互质(即gcd(x,y)=1),那么φ(x*y)=φ(x)*φ(y) 
2.若x是奇数φ(2x)=φ(x) 
3.若x是质数φ(x)=x-1 
4.若x>2,φ(x)为偶数

以上四条均能够依照欧拉函数推出!且明显!

 

 

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

3.欧拉定理

若a,n为正整数,且a,n互质(即gcd(a,n)=1),则有:

a^φ(n)≡ 1 (mod n)

依据此定理,费马小定理即为显明,因为质数p的phi(p)就约等于p-1

 

应用:

Input

( 二 )筛选法打欧拉函数表

降幂!

a与n互质,当b一点都不小时,可用欧拉定理降幂 

(a^b) mod n = (a^(b mod phi(n))) mod n

 

最终提一下,怎么求phi(p)呢?

详见欧拉筛

亟待选择如下性质( p为质数 ):
phi(p)=p-1
因为质数p除了1以外的因数唯有p,故1至p的整数唯有p与p不互质 

如果i mod p = 0, 那么 phi(i * p)=p * phi(i) 
若整数n 不与i互质,n+i依然与i不互质
若整数n与i互质,n+i与i照旧互质,申明:

若i mod p ≠0,  那么 phi( i * p )=phi(i) * ( p-1 )
i mod p 不为0且p为质数, 所以i与p互质, 那么依据欧拉函数的积性 phi(i *
p)=phi(i) * phi(p)  其中phi(p)=p-1即首先条性质

#include<iostream> 
#include<cstdio> 
#define N 40000 
using namespace std; 
int n; 
int phi[N+10],prime[N+10],tot,ans; 
bool mark[N+10]; 
void getphi() 

         int i,j; 
         phi[1]=1; 
         for(i=2;i<=N;i++)//也正是分解质因式的逆进程 
         { 
                  if(!mark[i]) 
                            { 
                                  
 prime[++tot]=i;//筛素数的时候首先会判断i是或不是是素数。 
                                    phi[i]=i-1;//当 i 是素数时
phi[i]=i-1 
                                    } 
                  for(j=1;j<=tot;j++) 
                  { 
                           if(i*prime[j]>N)  break
                         
 mark[i*prime[j]]=1;//确定i*prime[j]不是素数 
                         
 if(i%prime[j]==0)//接着大家会看prime[j]是否是i的约数 
                           { 
                                  
 phi[i*prime[j]]=phi[i]*prime[j];break
                           } 
                           else 
phi[i*prime[j]]=phi[i]*(prime[j]-1);//其实那里prime[j]-1就是phi[prime[j]],利用了欧拉函数的积性 
                  } 
         } 

int main() 
{
         getphi(); 
}

 

小结一下: 不难,除以2个数取模的话,和乘以这几个数的逆元取模效果是一致的。
求逆元其实便是求使A*X = 1 (mod
C)
创制的X,在那之中A是除法中的除数(貌似又要扯到扩欧、、)

求解除法取模难点(a/b)%m,大家得以转成(a*b’)mod m来解决,其中b’是b的逆元

 

降幂、
a与n互质,当b不小时,可用欧拉定理降幂 

(a^b) mod n = (a^(b mod phi(n))) mod n

 

输入1个质数P(3 <= P <= 10^9)
const int MAXN=1000010;
int phi[MAXN];
void phi_table(int n)
{
    memset(phi,0,sizeof(phi));
    phi[1]=1;
    for(int i=1;i<=n;i++)
    {
        if(phi[i]==0)//i是质数
        {
            for(int j=i;j<=n;j+=i)
            {
                if(phi[j]==0) phi[j]=j;
                phi[j]=phi[j]/i*(i-1);
            } 
        }
    }
}

 

Output

输出P最小的原根。

 

Input示例

3

 

Output示例

2





欧拉公式:
含义:欧拉函数就是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n)

   通式:

图片 1

   当中p1, p2……pn为x的持有质因数,x是不为0的平头

  
φ(1)=1(唯一和1互质的数(小于等于1)正是1自己)

   注意:每一种质因数只二个。
比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4

性质① m是素数时,有φ(m)=m-1
性质② 当m、n互素时,φ(m*n)=φ(m)*φ(n)
性质③ 对一切正整数n,有φ(p^n)=[p^(n-1)]*(p-1)

   欧拉函数性质(持续立异):

  
若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的翻番外,别的数都跟n互质。

  
φ(n)是积性函数,当gcd(n,m)==1时,φ(nm)=φ(n)*φ(m)

  
①N>1,不超过N且和N互素的具有正整数的和是
3/6*M*eular(N)。

   ②若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a;

   ③若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);

 费马小定理(Fermat’s
little theorem)
数论中的二个重庆大学定理,其剧情为:
若是p是质数,且gcd(a,p)=1,那么
a(p-1)≡1(mod p),即:假如a是整数,p是质数,且a,p互质(即双方唯有2个公约数1),那么a的(p-1)次方除以p的余数恒等于1。

还有个别定理:http://blog.csdn.net/yxuanwkeith/article/details/52387873

 

 

 

题目:

给定阶的含义为:设a模m的阶为k,则k满意a^k%m==1,且k最小

题解:

因为那题的p为质数,所以φ(p)=p-1,那么那题正是要找到最小的a使得a^(p-1)%p==1,且对于有着的k∈[0,p-1)都

不满足a^k%p等于1,(依据费马小定理,对于持有的正整数a,a^(p-1)%p==1一定成立)

办法就是枚举a,对于每多个a判断是不是满意条件,可k的限制尤其的大,枚举k不实际,这如何是好?其实大家只必要

枚举p-1的因子即可,只要p-1的全数因数都满意其不是a的阶,p-1即是a的阶

http://blog.csdn.net/acdreamers/article/details/8883285(大佬的题解)

 

大佬级解密—>欧拉

VV——————–VV

 http://www.cnblogs.com/yefeng1627/archive/2013/01/02/2842492.html

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 typedef __int64 ll;
 6 
 7 int a[111];
 8 
 9 int pow_mod(int x, int n, int mod) {
10     int ret = 1;
11     while(n) {
12         if(n & 1)   ret = (ll)ret*x%mod;
13         x = (ll)x*x%mod;
14         n >>= 1;
15     }
16     return ret;
17 }
18 
19 int main() {
20     int n;
21     while(scanf("%d", &n) != -1){
22         int tmp = n-1, tot = 0;
23         for(int i = 2;i*i <= tmp ;i++) if(tmp % i == 0) {
24             a[tot++] = i;
25             while(tmp % i == 0) tmp /= i;
26         }
27         if(tmp > 1) a[tot++] = tmp;
28         tmp = n-1;
29         for(int i = 2;i < n; i++) {
30             bool flag = 1;
31             for(int j = 0;j < tot; j++) {
32                 if(pow_mod(i, tmp/a[j], n) == 1) {
33                     flag = 0; break;
34                 }
35             }
36             if(flag) {
37                 printf("%d\n", i); break;
38             }
39         }
40     }
41     return 0;
42 }

 

 

 

相关文章