[数论]欧拉函数&素数筛

一、欧拉函数

欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。

通式:

其中p1, p2……pn为x的所有质因数,x是不为0的整数。

  • 比如x=12,拆成质因数为12=2*2*3,
  • 12以内有1/2的数是2的倍数,那么有1-1/2的数不是2的倍数(1,3,5,7,9,11),
  • 这6个数里又有1/3的数是3的倍数,
  • 只剩下(1 - 1/2 - 1/3)的数既不是2的倍数,也不是3的倍数(1,5,7,11)。
  • 这样剩下的12*(1 - 1/2 - 1/3)=4,即4个数与12互质,所以φ(12)=4。

证明:对于正整数x,

  • 如果x=1,则 φ(1) = 1。

    • 1与任何数(包括自身)都构成互质关系。
  • 如果x是质数,则 φ(x)=x-1 。
    • 质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。
  • 如果n只有一个质因数p,即x = p^k(p为质数,k>=1),则φ(pk)=pk(1-1/p)=pk-pk-1 。
    • 从1~x中,p的倍数共有x/p个,共占了1/p,则减去这些数后,还剩下x*(1-1/p)个。
    • 可以看出,上一种情况是 k=1 时的特例。
  • 如果n可以分解成两个互质的整数之积,即n = p1 * p2,则φ(x) = φ(p* p2) = φ(p1) * φ(p2)。
    • 积性函数:若当m与n互质时,f(m?n)=f(m)?f(n) f(m*n)=f(m)*f(n)f(m?n)=f(m)?f(n),那么f是积性函数。
    • 欧拉函数是积性函数(证明略)。
  • 任意一个大于1的正整数,都可以写成一系列质数的积。
  • 可以得到,φ(x) = φ(p1)*φ(p2)*...*φ(pn) = x(1-1/p1)*(1-1/p2)*...*(1-1/pn).

一些(目前不需要的)性质:

  • 当n>2时,φ(n)是偶数。
  • 小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)。
  • n的因数(包括1和它自己)的欧拉函数之和等于n。
  • 若n为奇数时,φ(2n)=φ(n)。
  • 对于任何两个互质的正整数a,n(n>2)有:a^φ(n)=1 mod n (恒等于)此公式即 欧拉定理。
  • 当n=p 且 a与素数p互质(即:gcd(a,p)=1)则上式有: a^(p-1)=1 mod n (恒等于)此公式即 费马小定理。


求欧拉函数:

1.埃拉托斯特尼筛

求1~n所有数的欧拉函数:每次找到一个质数,就把它的倍数更新掉。复杂度大概是O(nlognlogn)。

void euler(int n){
    for (int i=1;i<=n;i++) phi[i]=i;
    for (int i=2;i<=n;i++)
        if (phi[i]==i)for (int j=i;j<=n;j+=i)
                phi[j]=phi[j]/i*(i-1);

2.欧拉筛

每次找到一个最小的因数(一定为质因数),求出x*(1 - 1/p)。复杂度为O(n)。

int euler(int 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;
}

对于x = p1^k * p2^m...,只需要求一次(1-p1)(1-p2)...就可以了,

为了保证每个质因数只被使用一次,通过以上的while循环把x中的p1除尽。

二、素数筛法

好困(我觉得这个写的挺好)

参考文章:

https://blog.csdn.net/liuzibujian/article/details/81086324

https://blog.csdn.net/paxhujing/article/details/51353672

原文地址:https://www.cnblogs.com/mogeko/p/10134838.html

时间: 2024-07-30 23:29:31

[数论]欧拉函数&素数筛的相关文章

欧拉函数+素数筛

欧拉函数,就是欧拉发现的一个关于求素数的的公式,然后我们编个函数实现这个公式. 欧拉发现求小于等于n的正整数中有多少个数与n互质可以用这个公式: euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数.euler(1)=1(唯一和1互质的数就是1本身). 欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2. 其实直接看模板加注解想想就能看懂 筛选的原理就是找出n的因子,剔除含有

HDU 4002 Find the maximum(数论-欧拉函数)

Find the maximum Problem Description Euler's Totient function, φ (n) [sometimes called the phi function], is used to determine the number of numbers less than n which are relatively prime to n . For example, as 1, 2, 4, 5, 7, and 8, are all less than

【bzoj2401】陶陶的难题I “高精度”+欧拉函数+线性筛

题目描述 求 输入 第一行包含一个正整数T,表示有T组测试数据.接下来T<=10^5行,每行给出一个正整数N,N<=10^6. 输出 包含T行,依次给出对应的答案. 样例输入 7 1 10 100 1000 10000 100000 1000000 样例输出 1 2127 18446224 183011304660 1827127167830060 18269345553999897648 182690854273058293758232 题解 “高精度”+欧拉函数+线性筛 由于$i$和$j$

欧拉函数性质与求法 [数论][欧拉函数]

n的欧拉函数值用符号φ(n)表示 欧拉函数的定义是,对于一个正整数n,小于n且与n互质的数的数目(包括1,特殊地,φ(1)=1 ). 设p1,p2,p3,...,pr为n的全部r个质因数,则有φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pr). 显然,用这个方法来计算单个欧拉函数是可以求解的. 附上代码: 1 int get_phi(int x){ 2 int re=x; 3 for(int i=2;i*i<=x;i++) 4 if(x%i

POJ 3126 Prime Path (bfs+欧拉线性素数筛)

Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices. - It is a matter of security to change such things every now

POJ 2154 Color(组合数学-波利亚计数,数论-欧拉函数,数论-整数快速幂)

Color Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7693   Accepted: 2522 Description Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). Your job is to calculate how many different kinds of th

hdu1395 数论 欧拉函数

hdu1395 数论   欧拉函数对于给出的每一个n 求最小正整数 x 满足 2^x mod n = 1 1.如果给出的n 是偶数或者 1 则一定无解2.如果是奇数 首先根据欧拉定理 我们可知 phi(n)一定是满足要求的 然后答案一定是 phi( i ) 的因数 然后我们就可以 O(sqrt(phi(i))的时间内 枚举每个因数 然后快速幂验证就行了 1 #include <bits/stdc++.h> 2 using namespace std ; 3 4 const double eps

数论-欧拉函数

题目1 : 数论五·欧拉函数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho有时候会用密码写信来互相联系,他们用了一个很大的数当做密钥.小Hi和小Ho约定了一个区间[L,R],每次小Hi和小Ho会选择其中的一个数作为密钥. 小Hi:小Ho,这次我们选[L,R]中的一个数K. 小Ho:恩,小Hi,这个K是多少啊? 小Hi:这个K嘛,不如这一次小Ho你自己想办法算一算怎么样?我这次选择的K满足这样一个条件: 假设φ(n)表示1..n-1中与n互质的数的个

bzoj 2818 GCD 数论 欧拉函数

bzoj[2818]Gcd Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sample Output 4 HINT hint对于样例(2,2),(2,4),(3,3),(4,2) 1<=N<=10^7 题解一(自己yy) phi[i]表示与x互质的数的个数 即gcd(x,y)=1 1<=y<x ∴对于x,y 若a为素数 则gcd(xa,