素数:

也称质数、不可约数,不存在非平凡因子。

平凡因子:

即对于任意数\(n\)都至少存在两个因子,一个是\(1\),另一个是\(n\)本身,我们就叫它俩为\(n\)的平凡因子,其他的,都为n的不平凡因子。

性质:

设\(\pi (n)\)为不超过\(n\)的质数个数
那么,\(\pi (n) \backsim \frac {n}{\ln n}\)(\(n\)越大,估计的越准确)

质因数分解:

Code:

inline int factorize(int x,int p[]) {int cnt=0;for(int i=2; i*i<=x; ++i) {if(x%i==0) {p[cnt++]=i;x/=i;}}if(x>1) p[cnt++]=x;return cnt;
}

例题:

质数有无限个,如何证明?

反证法:假设质数是有限的
\(\because假设为p_1,p_2,\cdots p_n\)
\(\therefore M=p_1*p_2*\cdots p_n+1\)
\(又\therefore M \bmod p_1=1\)
\(M \bmod p_2=1\)
\(\cdots\)
\(M \bmod p_n=1\)
\(\therefore M \bmod 任何质数都是1,M不是任何质数的倍数,M是质数,与假设冲突,所以质数有无限个\)

这样一想,求它是不是就有很多种方法啦~(\(Emma,19260817\)是个质数)
1.一个毒瘤的判断素数法子(跑的贼快的那种,时间复杂度 \(O(\sqrt{n}/3)\)):

首先看一个关于质数分布的规律:
\(\geq5\)的质数一定和\(6\)的倍数相邻。
\(证明:令x\geq 1,将\geq 5的自然数表示如下:\)
\(\cdots 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 \cdots\)
\(可以看到,不和6的倍数相邻的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,显然,素数要出现只可能出现在6x的相邻两侧。\)
这种方法裁剪了不和\(6\)的倍数相邻的数,虽然都没有降低时间复杂度的阶数,但都一定程度上加快了判断的速度。

inline int prime(int n) {if(n==1) return false;if(n==2 || n==3) return true;if(n%6!=1 && n%6!=5) return false;for(register int i=5; i<=sqrt(n); i+=6)if(n%i==0 || n%(i+2)==0) return false;return true;
}

2.非常朴素的一种算法(判断有没有能整除的数)

#include<bits/stdc++.h>
using namespace std;
int main() {int n;cin>>n;for(int i=2; i<=n; i++) {if(n%i==0) {cout<<"flase";return 0;} else {cout<<"true";return 0;}}
}

3.网络上流传的素数打表:

/*
遇到素数需要打表时,先估算素数的个数:
num = n / lnx;
num为大概数字,越大误差越小(只是估计,用于估算素数表数组大小)
这个打表法效率貌似很高,网上说几乎达到了线性时间(不知道是真是假=。=)
*/
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define maxn 10000000
using namespace std;
bool visit[maxn+1000000];
int prime[maxn],n; ///prime的大小大概估计一下再开数组。大概是(x/lnx)
void getprime() {memset(visit, false, sizeof(visit));int num = 0;for (int i = 2; i <= n; ++i) {if ( !visit[i] )  prime[++num] = i;for (int j = 1; j <= num && i * prime[j] <= n ;  j++) {visit[ i  *  prime[j] ]  =  true; if (i % prime[j] == 0) break; }}for(int i=2;i<=n;i++){if(visit[i]==false)cout<<i<<' ';}
}
int main() {freopen("素数打表.txt","w",stdout); scanf("%d",&n);getprime();return 0;
}

4.弟弟一般的朴素打表:

#include<bits/stdc++.h>
using namespace std;int g_g(int x) {int flag=1;for(int i=2; i<=sqrt(x); ++i) {if(x%i==0)flag=0;}if(flag==1)return 1;elsereturn 0;
}
int main() {freopen("sushu.out","w",stdout);for(int i=9784010; i<=100000000; ++i) {if(g_g(i)) {cout<<i<<",";}}return 0;
}

5.有点小优化的朴素判断:

bool isprime(int n) {if(n<2)return false;if(n==2) return true;for(int i=2; i<=sqrt(n); i++)if(n%i==0)return false;return true;
}

6.埃氏筛总得听过吧(stm找的一个代码得明白)

#include<bits/stdc++.h>
using namespace std;
int n,m;
int fw;
int kk;
bool a[100000000];
int main()
{cin>>n>>m;memset(a,0,sizeof(a));fw=sqrt(n+0.5);//防止四舍五入a[1]=1;//不判断一,直接赋值for(int i=2;i<=fw;i++)//从二的倍数开始找{if(a[i]==0)//优化一,只有在a[i]不是合数下判断。{for(int j=i*i;j<=n;j+=i)//j=i*i,是重点,应为2*i等已经被判断过了a[j]=1;    }}for(int i=1;i<=m;i++){cin>>kk;if(a[kk]==0)cout<<"Yes"<<endl;elsecout<<"No"<<endl;}return 0;
}

7.miller rabin 算法(很**,反正我不会)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <map>
#define ll long long
using namespace std;
const int times = 20;
int number = 0;
map<ll, int>m;
ll Random(ll n) { //生成[ 0 , n ]的随机数return ((double)rand()/RAND_MAX*n+0.5);
}
ll q_mul(ll a, ll b, ll mod) { //快速计算 (a*b) % modll ans=0;while(b) {if(b&1) {b--;ans=(ans+a)%mod;}b/=2;a=(a+a)%mod;}return ans;
}
ll q_pow(ll a,ll b,ll mod) { //快速计算 (a^b) % modll ans=1;while(b) {if(b&1) {ans=q_mul(ans,a,mod );}b/=2;a=q_mul(a,a,mod);}return ans;
}
bool witness(ll a,ll n) { //miller_rabin算法的精华//用检验算子a来检验n是不是素数ll tem=n-1;int j=0;while(tem%2==0) {tem/=2;j++;}//将n-1拆分为a^r * sll x=q_pow(a,tem,n); //得到a^r mod nif(x==1||x==n-1) return true;//余数为1则为素数while(j--) { //否则试验条件2看是否有满足的 jx=q_mul(x,x,n);if(x==n-1)return true;}return false;
}
bool miller_rabin(ll n) { //检验n是否是素数if(n==2)return true;if(n<2||n%2==0)return false;//如果是2则是素数,如果<2或者是>2的偶[]数则不是素数for(register int i=1; i<=times; i++) { //做times次随机检验ll a=Random(n-2)+1;//得到随机检验算子 aif(!witness(a,n))return false;//用a检验n是否是素数}return true;
}
int main() {ll x;while(cin>>x) {if(miller_rabin(x))cout<<"Yes"<<endl;elsecout <<"No"<<endl;}return 0;
}

刮搜几道弟弟(我这种人)喜欢做的题:

AT261 与えられた数より小さい素数の個数について
AT807 素数、コンテスト、素数
AT1476 素数判定
P3383 【模板】线性筛素数
P3912 素数个数

综上所述:我还是喜欢毒瘤,噗嗤

转载于:https://www.cnblogs.com/morbidity/p/10809532.html

一篇不大正经的有关素数的小结相关推荐

  1. 一篇不大正经的关于数论的总结(未完

    顶函数(\(\lceil {x} \rceil\)).底函数(\(\lfloor {x} \rfloor\)): 常称之为高斯(取整)函数. 定义: 顶函数:\(\geq {x}\)的最小整数. 底函 ...

  2. 【秋招纪实录】一篇特别正经的【百度】求职经验分享

    本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 百度 商业产品经理岗位 2020年秋季校园招聘 已取得offer 02 笔试 岗位的笔试时间一共2小时左右. 有一小时时间用于大题作答, ...

  3. 【秋招纪实录】一篇特别正经的【紫光展锐】求职经验分享

    本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 紫光展锐 软件开发岗 2020年秋季校园招聘 已取得offer 02 笔试 紫光展锐的笔试不是特别难,相比较难度较为容易,大部分选择题都 ...

  4. 【秋招纪实录】一篇特别正经的【基恩士】求职经验分享

    本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 基恩士 销售工程师岗 2020年秋季校园招聘 已取得offer 02 企业科普 随着工业自动化方面的迅速发展,KEYENCE作为传感器和 ...

  5. 【秋招纪实录】一篇特别正经的【TCL】求职经验分享

    本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 TCL 软件测试岗 2020年秋季校园招聘 已取得offer 02 笔试 笔试的难度不算太难,选择题加编程题,题量较少.选择题主要以一些 ...

  6. 【秋招纪实录】一篇特别正经的【无领导小组讨论】经验分享

    本篇推文共计2000个字,阅读时间约3分钟. 无领导小组讨论是指公司面试中,由一组应试者组成一个临时工作小组,讨论给定的问题,并做出决策.由于这个小组是临时拼凑的,并不指定谁是负责人,目的就在于考察应 ...

  7. 【秋招纪实录】一篇特别正经的【腾讯】求职经验分享

    本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 腾讯 技术运营类岗位 2020年秋季校园招聘 已取得offer 02 笔试 笔试考的知识很多,但都是选择题.内容包括编程.网络.操作系统 ...

  8. 【秋招纪实录】一篇特别正经的【深信服】求职经验分享

    本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 深信服 软件测试岗 2020年秋季校园招聘 已取得offer 02 企业科普 深信服科技股份有限公司是一家专注于企业级安全.云计算及基础 ...

  9. 【秋招纪实录】一篇特别正经的【建信金科】求职经验分享

    本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 建信金科 研发技术岗 2020年秋季校园招聘 已取得offer 02 企业科普 建信金融科技是中国建设银行的全资子公司,传承建行三十年的 ...

  10. 【秋招纪实录】一篇特别正经的【国企】求职经验分享

    本篇推文共计2000个字,阅读时间约3分钟. 一般来说,国企公司的面试会从几个方面考察学生,语言沟通能力,心理承受能力,专业知识背景,简历上的内容等. 只要不慌张,做好准备. 大部分国企公司面试都能轻 ...

最新文章

  1. 编写一个公司员工类(Java)
  2. 阿里感悟系列文章(存)
  3. 查询字符串中字母出现的个数
  4. 转: vim 的编辑格式设置
  5. 异步服务_微服务全链路异步化实践
  6. OSI七层模型及应用
  7. [Spring+Hibernate系列] 3.开发环境快速Ant 部署
  8. OSChina 周二乱弹 —— 这样成功要到小护士姐姐的微信
  9. selenium+log4j+eclipse相关问题及解决方案
  10. Junit4测试报错:java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter
  11. TI高精度实验室-运算放大器-第六节-压摆率
  12. 项目协作管理平台-teambition和tapd--深度体验
  13. 【遗传编程/基因规划】Genetic Programming
  14. 如何通过8051单片机与片外存储器的连接来解决8051片内RAM和ROM容量不够用的问题
  15. Oracle简单操作总结
  16. Node fs同步、异步写入文件(一)
  17. Uber新CEO:公司最早将于2019年IPO上市
  18. aero peek_如何在Windows中禁用Aero Peek
  19. websocket自动重连
  20. [boot启动项目调用接口提示“ ] connect error, url jdbc:h2:mem:44xxx 和 No typehandler found for property xxx

热门文章

  1. html投票器,自动投票器,自己制作教程!
  2. 内网穿透-把自己的电脑部署为公网可访问的服务器
  3. 读书记之《UnixLinux大学教程》
  4. 微信小程序 上传身份证图像限制
  5. 德州停电悲剧不会重演 智慧用电是新方向
  6. 《基于Cortex-M4的虚拟机制作与测试》课程设计 结题报告
  7. ISO七层模型与TCP/IP四层参考模型逐层解析
  8. matlab计算轮廓曲率半径,matlab求曲率半径
  9. Zemax中控制曲率半径
  10. 基于SpringBoot+Bootstrap【爱码个人博客系统】附源码