:warning: カーマイケル関数
(math/carmichael_function.hpp)

Code

#pragma once
#include<map>
/**
 * @brief カーマイケル関数
 */
template<typename T>
auto carmichael_function(T n){
    map<T,long long>ret;
    for(auto i=2;i*i<=n;i++){
        while(n%i==0){
            ret[i]++;
            n/=i;
        }
    }
    if(n!=1)ret[n]=1;
    long long res=1;
    for(auto d:ret){
        if(d.first==2){
            if(d.second<3)res=pow(d.first,d.second-1);
            else res=pow(d.first,d.second-2);
        }
        else res=lcm(res,(long long)pow(d.first,d.second-1)*(d.first-1));
    }
    return res;
}
#line 2 "math/carmichael_function.hpp"
#include<map>
/**
 * @brief カーマイケル関数
 */
template<typename T>
auto carmichael_function(T n){
    map<T,long long>ret;
    for(auto i=2;i*i<=n;i++){
        while(n%i==0){
            ret[i]++;
            n/=i;
        }
    }
    if(n!=1)ret[n]=1;
    long long res=1;
    for(auto d:ret){
        if(d.first==2){
            if(d.second<3)res=pow(d.first,d.second-1);
            else res=pow(d.first,d.second-2);
        }
        else res=lcm(res,(long long)pow(d.first,d.second-1)*(d.first-1));
    }
    return res;
}
Back to top page