素数定理

数学知识目录

我的未来我决定 提交于 2019-12-05 00:22:24
数学知识目录 已经完成的条目会加上链接 加上颜色但是没有链接的是还没码完的 我太菜了,我爆了,退役快乐。 组合数学 各种题型技巧(初赛) 卡特兰数 Lucas定理 数论 gcd及exgcd及线性同余方程相关 逆元 素数筛 \(\color{coral}{ok}\) 费马小定理 Miller-Rabin素数测试(看脸)* 中国剩余定理(CRT) EXCRT 欧拉定理及欧拉函数筛法 拓展欧拉定理 概率* 矩阵(刷公开课就行了啊喂) Gauss-Jordan消元 \(\color{#006666}{ok}\) Mtrix-tree* 矩阵加速 博弈论 SG函数 不知道是什么但是感觉很厉害的东西* FFT&FNTT 卷积* 平面凸包 旋转卡壳* 来源: https://www.cnblogs.com/thornblog/p/11891027.html

欧拉工程第四十一至五十题解题思路分析

时光总嘲笑我的痴心妄想 提交于 2019-12-03 23:13:56
四十一、全数字素数(pandigital prime) 当一个N位数的数字各个数位分别使用了1至N所有的数字,我们就说这是一个N位的全数字。例如,2143是一个四位的全数字,同时还是一个素数。求最大的同时为素数和N位全数字的数。 分析:小学的时候我们都已经学过,当一个数字的所有数位之和是三的倍数,则这个数可以被三整除,因此不可能是一个素数。我们可以试着计算所有两位数以上的全数字各位数之和: \[ \begin{aligned} 1+2&=3\\ 1+2+3&=6\\ 1+2+3+4&=10\\ 1+2+3+4+5&=15\\ 1+2+3+4+5+6&=21\\ 1+2+3+4+5+6+7&=28\\ 1+2+3+4+5+6+7+8&=36\\ 1+2+3+4+5+6+7+8+9&=45 \end{aligned} \] 我们可以很明显看到,只有四位和七位全数字的各位数之和不是三的倍数,因此只有这两个数位的全数字中可能存在素数。考虑到七位数必然大于四位数,所以我们从最大的七位全数字7654321开始筛选,依次寻找一个更小的素数,然后判断这个素数是否为全数字。判断的方法是检查该数字对应的字符串构成的集合是否等于由字符串1234567构成的集合,如果等于则是一个全数字,如果不等于就不是。我们首先在七位数的范围内寻找满足要求的数,如果找不到,再在四位数范围内寻找。经过尝试

[数论系列] 素数篇

我只是一个虾纸丫 提交于 2019-12-03 10:13:22
本章介绍关于素数的一些数论,限于篇幅不给出证明,需要证明的朋友自行相关证明。 什么是素数?只能被自己和1整除的数就是素数。 利用这个性质我们很容易得到下面的素数判断方法。 bool isPrime(int x){ if(x==1)return 0; for(int i=2;i*i<=x;i++) if(x%i==0)return 0; return 1; } 这里解释一下为什么是i*i<=x,i*i<x转化一下就是i<=sqrt(x)。 想一想,如果我们枚举到sqrt(x)都没有找到可以被它整除的数,后面也就不可能有可以被它整除的数了,因为一个>sqrt(x)的数要是被x整除了,它的商肯定是<sqrt(x)的,而我们已经枚举过<=sqrt(x)的数了,里面没有,所以>sqrt(x)的约数也是不可能有的。 这种判断方法的时间复杂度是O(sqrt(n))的,空间复杂度是O(1)的。 再给出一个判断方法,这个方法的时间复杂度大概是O(sqrt(n)/3)的,空间复杂度也是O(1)。 bool isPrime(int x){ if(x==1)return false; if(x==2||x==3)return true; if(x%6!=1&&x%6!=5)return false; for(int i=5;i*i<=x;i+=6) if(x%i==0||x%(i+2)==0)return

素数

不想你离开。 提交于 2019-12-03 07:12:15
一、定义   素数又称质数,是指一个大于 \(1\) 的正整数,如果除了 \(1\) 和它本身外,没有其他任何约数。偶素数只有一个为 \(2\) 。   对于正实数 \(x\) ,定义 \(\pi(x)\) 为不大于 \(x\) 的素数个数,那么 \(\pi(x)\approx\frac{x}{ln(x)}\) 二、素数的判定   对于单个数或数据范围比较小时,我们采用枚举法: bool is_prime(int x) { for(int i=2;i<=sqrt(x);i++) if(!(x%i))return 0; return 1; }   对于比较大的数据范围,并且要求出范围内的所有质数,我们卡可以采用筛选法   1、 \(Eratosthenes\) 筛选法 void get_prime(int N) { memset(v,0,sizeof(v)); for(int i=2;i<=N;i++) { if(v[i])continue ; prime[++cnt]=i; for(int j=i;j<=N/i;j++)v[i*j]=1; } }   不过我们发现这个筛法的效率并不高,因为它会重复筛选同一个质数。因此,就有了第二种筛法——快速线性筛法,它的复杂度几乎是线性的。 void get_prime(int N) { memset(v,0,sizeof(v)); for

Miller-Rabin素数测试

匿名 (未验证) 提交于 2019-12-03 00:41:02
给出一个小于1e18的数,问它是否为质数?不超过50组询问。 hihocoder 我是真的菜,为了不误导他人,本篇仅供个人使用。 首先,一个1e18的数,朴素 \(O(\sqrt{n})\) 素数判定肯定爆炸。怎么办呢? 我们知道,对于素数p,只要a不是p的倍数,一定有 \(a^{p-1}=1\mod p\) 。那么,我们是不是可以选出某些a,对于要判定的数p,看看他是否满足以a为底的费马小定理,以此来判定质数呢?答案是基本可以。 但是很不巧,有一类合数,以任何小于它们的质数为底进行判定,结果都是正确的。它们叫做伪素数。怎么排除伪素数的情况呢?有个叫做二次探测定理的东西:若 \(x^2=1\mod p\) ,那么 \(或x=1或-1\mod p\) 。 假设 \(a^{x-1}=1\mod p\) 成立。如果x-1为奇数,就不再判定下去。否则,根据二次探测定理,还可以继续去判定 \(或a^{\frac{x-1}{2}}=1或-1\mod p\) 是否成立。如果它不等于1或-1,就返回false。如果它等于-1,就返回true。如果它等于1,就继续判定下去。反正,只要x-1为偶数,并且 \(a^{x-1}=1\mod p\) ,就可以一直判定。这样就可以把那些伪素数排除掉了。这就叫做miller-rabin素数测试。据说选前7个质数作为a,在1e18内也只有两三个会被miller

Eratosthenes 筛选求质数

て烟熏妆下的殇ゞ 提交于 2019-12-02 05:26:08
import java.util.Scanner; public class Eratosthenes { static void getPrimes(int num){ int []arr = new int[num +1];//长度为11的数组,能够存下表为0-10的数组,所以取10以内的数组,需要申请11长度的数组 for (int i = 1; i <= num; i++){ arr[i] = i; } arr[1] = 0;//1不是素数,排除1 for (int i = 2; i < Math.sqrt(num); i++){ for (int j = i+1; j < num; j++){ if (arr[j] != 0 && arr[j]%i == 0){ arr[j] = 0; } } } for (int i = 0; i < num; i++){ if (arr[i] != 0){ System.out.printf(arr[i]+"\t"); } } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.printf("请输入查询值:"); int num = scanner.nextInt(); getPrimes

ACM周末总结—10月22日

佐手、 提交于 2019-12-01 03:42:42
这个半周继续学习了数学的内容,在整理一下吧。其实感觉直接复习高代好像也可以。 筛素数: 理论:任何一个正整数都可以被唯一的分解为若干个素数的乘积; 取出容器中最小的数(此数一定是素数),删去所有该数的倍数。 int n; bool vis[1005]; cin>>n; memset(vis,true,sizeof(vis)); vis[0]=false;vis[1]=false; for(int i=2;i<=n;i++){ if(vis[i]==false) continue; for(int j=i*2;j<=n;j+=i){ vis[j]=false; } } 筛素数改进: 因为普通筛素数方法速度是比较慢,因为同一个数可能处理好几次(2,3,都是12的因子),任何一个数都有一 个可以被整除的最小素数(除去1),当遇到该素数是时就结束更新。 int flag=0,n; memset(isprim,0,sizeof(isprim)); cin>>n; for(int i=2;i<n;i++) { if(!isprim[i]) prim[flag++]=i; for(int j=0;(j<flag)&&(i*prim[j]<n);j++) { isprim[j]=1; if(i%prim[j]==0) break;//就用这部来节省时间 } } 欧拉函数: 计算比x(正整数

Miller-Rablin与Pollard-Rho算法(素性测试与质因数分解)

坚强是说给别人听的谎言 提交于 2019-11-30 03:51:40
前置 费马小定理(即若P为质数,则 \(A^P\equiv A \pmod{P}\) )。 欧几里得算法(GCD)。 快速幂,龟速乘。 素性测试 引入 素性测试是OI中一个十分重要的事,在数学毒瘤题中有着举足轻重的地位。 常见的素性测试如下: int check(int N){ for(int i=2;i*i<=N;i++) if(N%i==0)return 0; return 1; } 以上是一个 \(O(\sqrt{N})\) 的算法,虽然不优,但在绝大多数情况下是可以的。 但是,假如 \(N\) 的范围达到了 \(1e18\) ,以上算法很明显就不行了,我们得考虑更优的算法。 引入Miller-Rablin算法。 定理1 定理1:如果 \(P\) 为一个 大于2 的素数,那么方程 \(X^2\equiv1 \pmod{P}\) 的解只有1或者-1。 (是真得水的) 证明如下: 由 \(X^2\equiv1 \pmod{P}\) ,得 \((X^2-1)\equiv0 \pmod{P}\) , 即 \({(X+1)(X-1)}\equiv0 \pmod{P}\) 。 则 \(P | (X+1)\) 或 \(P|(X-1)\) , 即 \((X+1)\equiv0 \pmod{P}\) 或 \((X-1)\equiv0 \pmod{P}\) 。 则 \(X\equiv-1

对 黎曼猜想 的 简单 看法

a 夏天 提交于 2019-11-28 20:48:02
这 是 我在 一个 帖子 里的 回复 , 原帖地址 : 《千年难题——七个悬赏1000000美元的数学问题》 http://tieba.baidu.com/p/6235630502 , 我的 回复 如下: 黎曼猜想 其实 根本 不用 证明, 现在有 很多 定理 都是 以 黎曼猜想 为 基础 推导出来的, 这些 定理 都 在 用, 用的好好的, 所以 现在的 问题 不是 证明 黎曼猜想 , 而是 用 黎曼猜想 能 干什么, 比如 知道 素数 的 分布? 我想 并不能 精确 的 知道 素数 的 分布, 那 能不能 根据 黎曼猜想 判断 一个 大数 是否 是 素数 ? 我想也不能, 哥德巴赫猜想 说 一个 偶数 可以 表示为 2 个 素数 的 和, 那 给定 一个 偶数, 根据 黎曼猜想 能 求得 和 为 该 偶数 的 所有 素数对 吗? 我想也不能 。 那 证明 黎曼猜想 有什么用? 所以 问题 的 重点 在于 黎曼猜想 能 用来 做什么, 只要 黎曼猜想 能 用来 解决问题 , 先用着 就 行了 。 如果 黎曼猜想 不能 解决 某个 问题, 那 把 黎曼猜想 证明了 也没用, 还是 不能 解决这个问题 。 来源: https://www.cnblogs.com/KSongKing/p/11427333.html

poj3641(学习了)

半世苍凉 提交于 2019-11-28 02:13:15
素数的测试: 费尔马小定理:如果p是一个素数,且0<a<p,则a^(p-1)%p=1. 利用费尔马小定理,对于给定的整数n,可以设计素数判定算法,通过 计算d=a^(n-1)%n来判断n的素性,当d!=1时,n肯定不是素数,当d=1时,n很可能是素数. 二次探测定理:如果n是一个素数,且0<x<p,则方程x^2%p=1的解为:x=1或 x=p-1. 利用二次探测定理,可以再利用费尔马小定理计算a^(n-1)%n的过程 中增加对整数n的二次探测,一旦发现违背二次探测条件,即得出n不是素数的结论. 如果n是素数,则(n-1)必是偶数,因此可令(n-1)=m*(2^q),其中m是正奇数(若n是偶数,则上面的m*(2^q)一定可以分解成一个正奇数乘以2的k次方的形式),q是非负整数,考察下面的测试: 序列: a^m%n; a^(2m)%n; a^(4m)%n; …… ;a^(m*2^q)%n 把上述测试序列叫做Miller测试,关于Miller测试,有下面的定理: 定理:若n是素数,a是小于n的正整数,则n对以a为基的Miller测试,结果为真. Miller测试进行k次,将合数当成素数处理的错误概率最多不会超过4^(-k). 借鉴别人的,虚心学习 #include < iostream > #include < ctime > #include < cstdlib > #include