zoukankan      html  css  js  c++  java
  • 欧拉函数基础

    数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目

    第一次接触欧拉函数  找度娘了一下   说 

     

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

    p表示n的质因数

    Φ(10)=10*(1-1/2)*(1-1/5)=4;

    如果n是奇数  Φ(2n)=Φ(n);

    如果m n 都是素数   Φ(mn)=Φ(m)Φ(n);

    如果p是素数  Φ(p)=p-1;

    其实是总共有1~p^k个数 

    和p^k不互质的正整数有{1*p,2*p,...,p^(k-1)*p} 一共有p^k-1个;

    所以Φ(n)=p^k-p^k-1;

    但是如果p不是素数   就不能用这种方法

    我们可以把n拆成几个素数相乘 然后把所有1~n之间素数的倍数都删去,剩下就是你要的啦

    但是还有一个问题就是 有可能减重复   比如:24的素数有2还有3,2和3的倍数都有6,但是6这个数只能减一次

    所以就有扯到另个一集合的问题

    假如有一个集合U里面包含了许多个小集合p1,p2,p3...(这些每一个集合就是每一个素数的倍数   这些集合可能有重合的部分)

    然后让求除了这些集合之外的集合 所以就用U*(1-p1)*(1-p2)*...*(1-pn);

    1-pi表示除了pi集合中所有的数  

    用c语音写一下

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<iostream>
    #include<queue>
    
    using namespace std;
    
    #define N 1000005
    
    int eular(int n)
    {
        int ret=1,i;
        for(i=2; i*i<=n; i++)
        {
            if(n%i==0)
            {
                n/=i,ret*=i-1;
                while(n%i==0)
                    n/=i,ret*=i;
            }
        }
        if(n>1)
            ret*=n-1;
        return ret;
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            printf("%d
    ",eular(n));
        }
        return 0;
    }

    如果只知道Φ(n)求n 是有规律的

    只需求Φ(n)+1之后的第一个素数就是n;

  • 相关阅读:
    ssh端口转发
    linux git命令安装
    linux git命令
    linux cpio命令
    linux 抓包工具
    js 深拷贝 ,浅拷贝
    vue $router 打开新窗口
    excel常用操作
    Kafka Topic的增删改查操作
    linux上删除文件名乱码的文件
  • 原文地址:https://www.cnblogs.com/linliu/p/5354856.html
Copyright © 2011-2022 走看看