读书人

数论欧拉函数与相干定理

发布时间: 2012-09-05 15:19:34 作者: rapoo

数论——欧拉函数与相关定理

??? 一个正整数n的欧拉函数定义为:在1到n-1之间和n互素的数的个数。

??? 欧拉函数公式:

phi(n)=n(1-1/p1)(1-1/p2)(1-1/p3)...(1-1/pk),其中pi为n的素因子。

??? 例如,phi(12)=12(1-1/2)(1-1/3)=12*1/2*2/3=4。

?

相关定理

?

???欧拉定理

?? 对于任意正整数n>1, a^phi(n)=1 (mod n), a<n且a与n互质。可以从元素的幂去证明。

?? 费马定理:若p是素数,则 a^p-1=1 (mod n) ,显然是欧拉定理的推论。

?? GCD递归定理

?????? 对任意的非负整数a和任意正整数b有:

?? gcd(a,b) = gcd(b,a%b)

定理1

??? 若a和b是不都为0的任意整数,则gcd(a,b)是a与b的线性组合集合{ax+by,x,y属于整数}中最小的正元素。

定理2

? (元素的幂)一个正整数n有原根,则它恰好有phi(phi(n))个原根。

??? 所谓原根,即给出集合zn,zn的元素为小于n且与n互素的数。若n中的某个元素g的幂模n产生的群的个数为n-1,则g称为zn的原根。比如对模7,3就是一个原根,2不是。

定理3

??? 如果对模n存在1的非平凡平方根,则n是合数。(这个定理为Miller-Rabin素数测试提供依据)

????即对方程 x^2 = 1 (mod n),方程的解除了1和n-1两个平凡根之外,还有其它的根,那么n肯定是合数。

?

附上求欧拉函数的代码

?

//返回1——n的欧拉函数void Euler2(__int64 n){    getPrime(n);    int i,j;    for(i = 1; i <= n; i++)        PHI[i] = i;    for(i = 2; i <= n; i++)    {        if(isPrime[i]==0)        {            for(j = i; j <= n; j += i)                PHI[j] = PHI[j]/i*(i-1);        }    }}//返回一个数的欧拉函数__int64 Euler(__int64 n){    __int64 i;    __int64 result = n;    __int64 t = (__int64)sqrt(n*1.0);    for(i = 2; i <= t; i++)    {        if(n%i==0)        {            result = result/i*(i-1);            while(n%i==0)                n = n/i;        }    }    if(n>1)        result = result/n*(n-1);    return result;}

?

读书人网 >编程

热点推荐