C/C++知识点之【学习整理】NOIP涉及的数论 [updating]
小标 2018-08-10 来源 : 阅读 1092 评论 0

摘要:本文主要向大家介绍了C/C++知识点之【学习整理】NOIP涉及的数论 [updating],通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之【学习整理】NOIP涉及的数论 [updating],通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

  
   扩展欧几里得 求二元一次不定式方程 的一组解。 int exgcd(int a,int b,int &x,int &y) 
{
    int t;
    if(!b) {x=1;y=0;return a;}
    t=exgcd(b,a%b,y,x);
    y-=(a/b)*x;
    return t;
}
 
线性筛质数
维护一个质数表。对于每个数 , 从小到大枚举所有质数 ,将 打上标记。 如果 , 停止枚举。

void getprime()
{       
    int i,j;
    for(i=2;i<=n;i++)
    {              
        if(!b[i]) prime[++tot]=i;  
        for(j=1;j<=tot&&i*prime[j]<=n;j++)
        {
            b[i*prime[j]]=true;  
            if(!i%prime[j]) break;
        }
    }
}
 
线性求逆元 
逆元的定义:称x是a在模b意义下的逆元,可理解为。
给定一个质数  ,求出  至 的逆元。

证明:
 


 
费马小定理
若  是质数, 则 
证明:
因为 , 所以.



 
线性求欧拉函数
欧拉函数的定义:小于等于的正整数中与互质的数的个数。

设  为  最小的质数,。在线性筛中,被筛掉。
当时,。 
当时,。
void getphi()  
{  
    int i,j;  
    phi[1]=1;  
    for(i=2;i<=n;i++)
    {  
       if(!b[i])  
       {  
           prime[++tot]=i; 
           phi[i]=i-1;
       }  
       for(j=1;j<=tot;j++)  
       {  
           if(i*prime[j]>n)  break;  
           b[i*prime[j]]=true; 
           if(i%prime[j]==0)
           {  
               phi[i*prime[j]]=phi[i]*prime[j];
               break;  
            }  
            else  phi[i*prime[j]]=phi[i]*(prime[j]-1);
       }  
     }  
}
  欧拉定理 
若  , 则 。 
证明: 
记  , 记  为 到  中与  互质的数。 
 
 
由 消去律 得  
 
Miller-Rabin算法  素数测试 
记   
在  中随机选取一个整数  , 如果  或  , 那么我们认为n是质数。 
错误率不超过1/4,重复若干次即可。
long long mod_mul(long long,long long,long long);
long long mod_exp(long long,long long,long long); 
bool miller_rabbin(long long n)  
{  
    int i,j,t;
    long long a,x,y,u;
    if(n==2)return true;  
    if(n<2||!(n&1)) return false;  
    t=0;u=n-1;  
    while((u&1)==0) t++,u>>=1;  
    for(i=1;i<=tim;i++)  
    {  
        a=rand()%(n-1)+1;  
        x=mod_exp(a,u,n);  
        for(j=0;j<t;j++)  
        {  
            y=mod_mul(x,x,n);  
            if(y==1&&x!=1&&x!=n-1) return false;  
             x=y;  
        }  
        if(x!=1) return false;  
    }  
    return true;  

long long mod_mul(long long a,long long b,long long mod) 
{
    long long res=0;
    while(b) 
    {
        if(b&1) res=(res+a)%mod;
        a=(a+a)%mod;
        b>>=1;
    }
    return res;
}
long long mod_exp(long long a,long long b,long long mod) 
{
    long long res=1;
    while(b) 
    {
        if(b&1) res=mod_mul(res,a,mod);
        a=mod_mul(a,a,mod);
        b>>=1;
    }
    return res;
}

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程