数论
数论
质数问题
- 定义:
一个正整数只有除1外和自身之外的任何自然数整除,则这个数称为质数,负责称为合数。
- 判定:
是为了判定n是不是质数;
根据定义可以知道只要找2~ n \sqrt{n}n之间有没有可以和n整除的就可以啦;
素数筛
是为了找到1~N之间的所有质数;
任意的一个数,如x,它的倍数一点不是质数,所有从小到大扫,扫到一个数,把它的倍数标记为合数,就这样把所有的合数一点点的标记出来,而当扫到一个数未标记时,这个数就是质数;
int prime[1000010];
bool isprime[1000010];
int sieve(int n)
{
int cnt=0;
for(int i=0;i<=n;i++)isprime[i]=true;
for(int i=2;i<=n;i++)
{
if(isprime[i])
{
prime[cnt++]=i;
for(int j=i*2;j<=n;j+=i)isprime[j]=false;
}
}
return cnt;
}
这个算法是Eratosthenes筛法,而时间复杂度=O(NloglogN);
约数
- 定义:
若整数n除以整数d的余数为0,即d能整除n,则称d是n的约数,n是d的倍数,记为d|n。
- 约数集合
∵ \because∵ d|n;
∴ \therefore∴ d n ∣ \frac{d}{n}|nd∣n;
∴ \therefore∴ d|n× \times×n;
所以,只要扫描 1~n \sqrt nn 就可以找到n的所有约数。
int factor[N] , tot = 0; for( int i = 1 ; i * i <= n ; i ++ )
{
if( n % i ) continue;
factor[ ++ tot] = i;
if( i != n / i ) factor[ ++ tot ] = n / i;
}
辗转相除法
a/b=p…q(q=a%b) -> a=b*p+q -> gcd(a,b)=gcd(b,q)
可持续递归下去直到后面的数为0
时间复杂度:**O(log max(a,b)),**底数为2.
若b>a:gcd(a,b)=gcd(b,a%b)=gcd(b,a);(一次变化为下述情况)。
若a>b:
(1)b>a/2,gcd(a,b)=gcd(b,a%b),a%b=a-b<a/2;
(2)b<a/2,gcd(a,b)=gcd(b,a%b),a%b<b<a/2;
综上,a每次都缩小1/2以上,故时间复杂度为O(log max(a,b))。
补充:lcm(a,b)(最小公倍数)=a*b/gcd(a,b)
intgcd(int
a
,intb
)return
b==0?a:gcd(b,a
%b
);
}
分解开后
int fun(int m,int n){
- int rem; //余数,当余数为0的时候,最后的m即为最大公约数
- //先用较小的数对较大的数取余,再用余数对较小的数求余,直到余数为零
- while(n > 0){
- rem = m % n;
- m = n;
- n = rem;
- }
- return m; //将结果返回
- }
互质
定义:如果任取a,b∈ \in∈N,若gcd(a,b)=1,则a,b互质。
而对于三个数或更多的情况,如gcd(a,b,c)=1,则称为a,b,c互质。
欧拉函数:就是对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。
欧拉函数的通式:φ(n)=n(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)……(1-1/pn)
其中p1, p2……pn为n的所有质因数,n是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。
欧拉函数为积性函数,即:若m,n互质, φ ( m n ) = φ ( m ) ⋅ φ ( n ) 。由以上的来学习欧拉函数,我相信你还会懵,关于欧拉函数的式子是怎么算出来的,所以,下面是更为详细的讲解;
欧拉函数就是给定一个正整数由1~8中与其互质数的个数,如8,在1到8之中,与8形成互质关系的是1、3、5、7,所以 φ(n) = 4。
而我们就要找到怎么求解 φ;
它分为4种情况,或者说欧拉函数剩下的4个性质:
(1)如果n=1, φ(1)=1;这是定义,1与任何数(包括其本身)都互质。
(2)如果n是质数,则 φ(n)=n-1 。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。
(3)如果n是质数的某一个次方,即 n = p^k (p为质数,k为大于等于1的整数),则ϕ \phiϕ(pk ^kk)=p k p^kpk-p k − 1 p^{k-1}pk−1如φ(8) = φ(2^3) =2^3 - 2^2 = 8 -4 = 4。
(4)如果n可以分解成两个互质的整数之积,n = p1 × p2,则 φ(n) = φ(p1× \times×p2) = φ(p1)× \times×φ(p2);如 φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24。
然后,由以上四种分开的情况,在进行总和,就可以得到φ(x)=N∏ i = 1 n \prod\limits_{i=1}^ni=1∏n (1-1 p i \frac{1}{pi}pi1);
嗯,就这样啦
欧拉函数代码
ll eular(ll n)
{
ll res=n;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
res=res/i*(i-1);
while(n%i==0)n=n/i;
}
if(n==1)break;
}
if(n>1)res=res/n*(n-1);
return res;
}