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

    一个正整数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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值