数论的学习

本文深入解析了质数的定义与判定方法,介绍了Eratosthenes筛法寻找质数的过程,探讨了约数的概念及其扫描算法,并剖析了辗转相除法求最大公约数。此外,欧拉函数及其性质、计算方法和实际应用也一并详述,适合对数论感兴趣的读者。
摘要由CSDN通过智能技术生成

数论

数论

质数问题

  1. 定义:

一个正整数只有除1外和自身之外的任何自然数整除,则这个数称为质数,负责称为合数。

  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);

约数

  1. 定义:

若整数n除以整数d的余数为0,即d能整除n,则称dn的约数,nd的倍数,记为d|n

  1. 约数集合

\because d|n;
\therefore d n \frac{d}{n}|ndn;
\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>agcd(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)

int gcd(int a,int b)    return b==0?a:gcd(b,a%b);
}
分解开后

int fun(int m,int n){
  1.    int rem;        //余数,当余数为0的时候,最后的m即为最大公约数
  2.    //先用较小的数对较大的数取余,再用余数对较小的数求余,直到余数为零
  3.    while(n > 0){
  4.       rem = m % n;
  5.       m = n;
  6.       n = rem;
  7.    }
  8.    return m;       //将结果返回        
  9. }

互质

定义:如果任取a,b \inN,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……pnn的所有质因数,n是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。
欧拉函数为积性函数,即:若m,n互质, φ ( m n ) = φ ( m ) φ ( n ) 由以上的来学习欧拉函数,我相信你还会懵,关于欧拉函数的式子是怎么算出来的,所以,下面是更为详细的讲解

欧拉函数就是给定一个正整数由1~8中与其互质数的个数,如8,在18之中,与8形成互质关系的是1357,所以 φ(n) = 4

而我们就要找到怎么求解 φ

它分为4种情况,或者说欧拉函数剩下的4个性质:

1)如果n=1, φ1=1;这是定义,1与任何数(包括其本身)都互质。

2)如果n是质数,则 φ(n)=n-1 。因为质数与小于它的每一个数,都构成互质关系。比如51234都构成互质关系。

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=1n (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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值