一篇不大正经的有关素数的小结
素数:
也称质数、不可约数,不存在非平凡因子。
平凡因子:
即对于任意数\(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
一篇不大正经的有关素数的小结相关推荐
- 一篇不大正经的关于数论的总结(未完
顶函数(\(\lceil {x} \rceil\)).底函数(\(\lfloor {x} \rfloor\)): 常称之为高斯(取整)函数. 定义: 顶函数:\(\geq {x}\)的最小整数. 底函 ...
- 【秋招纪实录】一篇特别正经的【百度】求职经验分享
本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 百度 商业产品经理岗位 2020年秋季校园招聘 已取得offer 02 笔试 岗位的笔试时间一共2小时左右. 有一小时时间用于大题作答, ...
- 【秋招纪实录】一篇特别正经的【紫光展锐】求职经验分享
本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 紫光展锐 软件开发岗 2020年秋季校园招聘 已取得offer 02 笔试 紫光展锐的笔试不是特别难,相比较难度较为容易,大部分选择题都 ...
- 【秋招纪实录】一篇特别正经的【基恩士】求职经验分享
本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 基恩士 销售工程师岗 2020年秋季校园招聘 已取得offer 02 企业科普 随着工业自动化方面的迅速发展,KEYENCE作为传感器和 ...
- 【秋招纪实录】一篇特别正经的【TCL】求职经验分享
本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 TCL 软件测试岗 2020年秋季校园招聘 已取得offer 02 笔试 笔试的难度不算太难,选择题加编程题,题量较少.选择题主要以一些 ...
- 【秋招纪实录】一篇特别正经的【无领导小组讨论】经验分享
本篇推文共计2000个字,阅读时间约3分钟. 无领导小组讨论是指公司面试中,由一组应试者组成一个临时工作小组,讨论给定的问题,并做出决策.由于这个小组是临时拼凑的,并不指定谁是负责人,目的就在于考察应 ...
- 【秋招纪实录】一篇特别正经的【腾讯】求职经验分享
本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 腾讯 技术运营类岗位 2020年秋季校园招聘 已取得offer 02 笔试 笔试考的知识很多,但都是选择题.内容包括编程.网络.操作系统 ...
- 【秋招纪实录】一篇特别正经的【深信服】求职经验分享
本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 深信服 软件测试岗 2020年秋季校园招聘 已取得offer 02 企业科普 深信服科技股份有限公司是一家专注于企业级安全.云计算及基础 ...
- 【秋招纪实录】一篇特别正经的【建信金科】求职经验分享
本篇推文共计2000个字,阅读时间约3分钟. 01 求职关键词 建信金科 研发技术岗 2020年秋季校园招聘 已取得offer 02 企业科普 建信金融科技是中国建设银行的全资子公司,传承建行三十年的 ...
- 【秋招纪实录】一篇特别正经的【国企】求职经验分享
本篇推文共计2000个字,阅读时间约3分钟. 一般来说,国企公司的面试会从几个方面考察学生,语言沟通能力,心理承受能力,专业知识背景,简历上的内容等. 只要不慌张,做好准备. 大部分国企公司面试都能轻 ...
最新文章
- 编写一个公司员工类(Java)
- 阿里感悟系列文章(存)
- 查询字符串中字母出现的个数
- 转: vim 的编辑格式设置
- 异步服务_微服务全链路异步化实践
- OSI七层模型及应用
- [Spring+Hibernate系列] 3.开发环境快速Ant 部署
- OSChina 周二乱弹 —— 这样成功要到小护士姐姐的微信
- selenium+log4j+eclipse相关问题及解决方案
- Junit4测试报错:java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter
- TI高精度实验室-运算放大器-第六节-压摆率
- 项目协作管理平台-teambition和tapd--深度体验
- 【遗传编程/基因规划】Genetic Programming
- 如何通过8051单片机与片外存储器的连接来解决8051片内RAM和ROM容量不够用的问题
- Oracle简单操作总结
- Node fs同步、异步写入文件(一)
- Uber新CEO:公司最早将于2019年IPO上市
- aero peek_如何在Windows中禁用Aero Peek
- websocket自动重连
- [boot启动项目调用接口提示“ ] connect error, url jdbc:h2:mem:44xxx 和 No typehandler found for property xxx