数论总结1

来源:互联网 发布:爱普生r230清零软件 编辑:程序博客网 时间:2024/05/29 16:54

数论

最近ACM培训学习了数论方面的知识,总结一下,以备翻阅。


1.欧拉函数(Euler's totient function)

   简介:

 详见百度百科点击打开链接

 对正整数n,欧拉函数是 1,2,3......n-1,n 中与n互质的数的个数。通常表示为φ(n)。

 例如:φ(5) = 4  {1 2 3 4}       φ(8) = 4  {1 3 5 7

   通式:

          φ(x) = x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),    其中p1, p2……pn为x的所有质因数

  例:12=2*2*3那么φ(12) = 12*(1-1/2)*(1-1/3)=4

          另:若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。

      代码:

  下面通过两种不同的方法来实现。第一种方法是直接根据定义来实现,

   同时第一种方法也是第二种筛法的基础。

    
<span style="font-size:14px;">//直接求解法int eular(int n)  {    //返回euler(n)    int res=n, a=n;    for(int i=2; i*i<=a; i++)    {        if(a%i == 0)        {            res = res/i*(i-1);  //先进行除法是为了防止中间数据的溢出            while(a%i == 0)                a /= i;        }    }    if(a>1)        res = res/a*(a-1);    return res;}//筛选法打欧拉函数表#define Max 1000001  int euler[Max];  void Init(){        for(int i=1;i<Max;i++)          euler[i]=i;      for(int i=2;i<Max;i++)          if(euler[i]==i)             for(int j=i;j<Max;j+=i)                euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出   }</span><span style="font-size:18px;">  </span>

0 0
原创粉丝点击