zoukankan      html  css  js  c++  java
  • 欧拉公式与欧拉phi函数

      欧拉函数phi(n)表示1n之间与n互素的整数的个数。对于一个整数a,如果gcd(a,n)==1,则aphi(n) ==1(mod n)

    建设整数n可以分解为素数的乘积:

      n = p1^k1 * p2^k2 * ... * pn^kn

      则phi(n) = (p1^k1 - p1^(k1-1)) * (p2^k2 - p2^(k2-1)) * ... * (pn^kn - pn^(kn-1))

      还可以表示为:

      phi(n)   =  p1^(k1-1)*(p1 - 1) * p2^(k2-1)*(p2-1) * ... * pn^(kn-1) * (pn - 1)

          =  n * ((p1-1)*(p2-1)* ... *(pn-1)) / (p1*p2* ... * pn)

      代码:

     1 //zzy2012.7.17
     2 #include<cstdio>
     3 #include<iostream>
     4 #define NUM 10000
     5 using namespace std;
     6 
     7 typedef struct{
     8     int p1,p2,v;
     9 }node;
    10 
    11 int flag[NUM];
    12 node phi[NUM];
    13 
    14 void ini(){
    15     for(int i=0; i<NUM; i++){
    16         phi[i].p1 = 1;
    17         phi[i].p2 = 1;
    18         flag[i] = 1;
    19     }
    20 }
    21 
    22 void calcu_phi(){
    23     phi[1].v = 1;
    24     for(int i = 2; i<NUM; i++){
    25         if(flag[i] == 1){
    26             for(int j = 1; i*j<NUM; j++){
    27                 phi[i*j].p1 *= (i-1);
    28                 phi[i*j].p2 *= i;
    29                 flag[i*j] = 0;
    30             }
    31         }
    32     }
    33     for(int i = 2; i<NUM; i++)
    34         phi[i].v = i*phi[i].p1/phi[i].p2;
    35 }
    36 
    37 void print(){
    38     for(int i = 1; i<NUM; i++)
    39         printf("%d ",phi[i].v);
    40 }
    41 
    42 int main()
    43 {
    44     ini();
    45     calcu_phi();
    46     print();
    47     return 0;
    48 }
  • 相关阅读:
    诡异的Integer
    你已经创建了多少个对象?
    静态方法中使用非静态化数据
    静态化初始块的执行顺序
    java中的多构造函数以及类字段的初始化顺序
    java中类的构造方法出错点
    程序员修炼之道读后感
    纯随机数发生器,以及函数重载的问题
    递归判断回文
    使用jQuery操作DOM元素
  • 原文地址:https://www.cnblogs.com/Lattexiaoyu/p/2595884.html
Copyright © 2011-2022 走看看