zoukankan      html  css  js  c++  java
  • 求一个数的欧拉函数的优化

    函数值是小于或等于N且与N互质的数的个数

    [varphi(x)=x prod_{i=1}^{n}left(1-frac{1}{p_{i}} ight) ]

    (其中(p_{1}, p_{2}……p_{n})为x的所有质因数,x是不为0的整数)
    (varphi(1) = 1)
    欧拉函数值除了1和2其他都是偶数,因为如果(gcd(i,n) = 1),那么(gcd(n - i,n) = 1),如果(gcd(i,n)≠1),那么(gcd(n- i,n)≠1),而1规定是1,2的一半是1,所以1和2的欧拉函数值为奇数

    求一个数的欧拉函数

    时间复杂度(O(sqrt n))

    int eular(int n){
        int ans = n;
        for(int i = 2; i * i <= n; i++){
            if(n % i == 0){
                ans -= ans/i;
                while(n % i == 0) n /= i;
            }
        }
        if(n > 1)ans -= ans / n;
        return ans;
    }
    

    求一个数的欧拉函数优化版

    先欧拉筛(O(n))求出范围内的素数,然后利用这些素数优化欧拉函数值

    同理,在唯一分解定理也可以这样去优化
    素数占比
    2 ->0.5
    10 ->0.4
    100-> 0.25
    1000->0.168
    10000->0.1229
    100000->0.09592
    1000000->0.078598
    10000000->0.0664579
    100000000->0.0576146
    平常处理(1e9)的数字的欧拉函数值,只需要求出(1e5)内的素数
    那么就比一般方法快了10倍,(O(frac{sqrt n}{10}))

    int phi(int n){//phi优化,先线性筛求出sqrt n 的质数
        int ans = n;
        for(int i = 1; pri[i] * pri[i] <= n; i++){
            if(n % pri[i] == 0){
                ans -= ans / pri[i];
                while(n % pri[i] == 0) n /= pri[i];
            }
        }
        if(n > 1) ans -= ans / n;
    }
    
  • 相关阅读:
    07.对称加密算法指令
    06.Openssl基本概念
    04.openssl背景
    03.openssl密码实现技术
    02.密钥学基本概念
    01.openssl-概述
    17行为型模式之命令模式
    16行为型模式之模板模式
    15结构型模式之享元模式
    14结构型模式之外观模式
  • 原文地址:https://www.cnblogs.com/Emcikem/p/13033071.html
Copyright © 2011-2022 走看看