素数定理

Miller_Rabin素数测试【学习笔记】

与世无争的帅哥 提交于 2020-01-15 06:32:39
引语: 在数论中,对于素数的研究一直就很多,素数测试的方法也是非常多,如埃式筛法,6N±1法,或者直接暴力判(试除法)。但是如果要判断比较大的数是否为素数,那么传统的试除法和筛法都不再适用。所以我们需要学习 Miller_Rabin 算法。 知识准备 + 算法推导: 1.威尔逊定理:若p是素数,则 ( p -1) !≡ -1( mod p ) . 2.有趣的是,威尔逊定理的逆命题也是正确的:设n是正整数且 n ≥ 2 ,若 ( n -1) !≡ -1( mod n ) ,则 n 是素数. 很多朋友可能在学习的时候会碰到威尔逊定理,它主要是告诉我们,它的逆定理给出了一种素性检验的方法(其实用的少,原因在后),遗憾的是,这不是一个实用的检验法,因为这需要进行 ( n -2) 次模n的乘法运算才能得到 ( n -1)! 模 n 的值,运算量达到了 O( n(log 2 n) 2 ) 次位运算。 行吧,那我们只能另谋出路了。 3.费马小定理:设 p 是一个素数, a 是一个正整数且 p 不整除 a ,则 a p- 1 ≡ 1( mod p ) . 4.伪素数:令 b 是一个正整数. 若 n 是一个正合数且 b n ≡ b ( mod n ) ,则称 n 为以 b 为基的伪素数(有时也称费马伪素数)。(唉~,这是虚伪的素数,它爱着费马测试,却是合数)。 辣个男人,它来了! 那么基于费马小定理

poj3641(学习了)

夙愿已清 提交于 2020-01-14 06:05:46
素数的测试: 费尔马小定理:如果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<cmath>

Miller-Rabin素数测试学习小计

╄→尐↘猪︶ㄣ 提交于 2020-01-13 07:16:29
1、Miller-Rabin是干啥的?它是用来检测一个数字(一般是很大的数字)是不是素数; 2、Miller-Rabin算法基于的两个定理: (1)费尔马小定理:如果p是一个素数,且0<a<p,则a^(p-1)%p=1.利用费尔马小定理,对于给定的整数n,可以设计素数判定算法,通过 计算d=a^(n-1)%n来判断n的素性,当d!=1时,n肯定不是素数,当d=1时,n 很可能是素数. (2)二次探测定理:如果p是一个素数,且0<x<p,则方程x^2%p=1的解为:x=1或x=p-1. 3、利用二次探测定理,可以再利用费尔马小定理计算a^(n-1)%n的过程中增加对整数n的二次探测,一旦发现违背二次探测条件,即得出n不是素数的结论.具体来说是这样的:如果n是素数,则(n-1)必是偶数,因此可令(n-1)=m*(2^q),其中m是正奇数,q是非负整数,考察下面的测试: a^(2m)%n; a^(4m)%n; …… ;a^(m*2^q)%n 若上面的式子中a^(2^i*m)%n计算出1来,我们就要看看a^(2^(i-1)*m)是不是等于1或者n-1,若既不是1也不是n-1那么我们判断不是素数。 来源: https://www.cnblogs.com/jianglangcaijin/p/3446859.html

Miller-Rabin素数测试学习笔记

 ̄綄美尐妖づ 提交于 2020-01-12 09:41:14
  好几天前看了算导上的Miller-Rabin素数测试算法,今天正好总结一下,写写笔记。   说Miller-Rabin测试以前先说两个比较高效的求a*b% n 和 a b %n 的函数,这里都是用到二进制思想,将b拆分成二进制,然后与a相加(相乘) // a * b % n//例如: b = 1011101那么a * b mod n = (a * 1000000 mod n + a * 10000 mod n + a * 1000 mod n + a * 100 mod n + a * 1 mod n) mod n ll mod_mul(ll a, ll b, ll n) { ll res = 0; while(b) { if(b&1) res = (res + a) % n; a = (a + a) % n; b >>= 1; } return res;} //a^b % n//同理ll mod_exp(ll a, ll b, ll n) { ll res = 1; while(b) { if(b&1) res = mod_mul(res, a, n); a = mod_mul(a, a, n); b >>= 1; } return res;} 下面开始说Miller-Rabin测试:    费马小定理 :对于素数p和任意整数a,有a p ≡ a(mod p)(同余)。反过来

求解素数环问题

匆匆过客 提交于 2020-01-06 01:23:08
素数:   质数(prime number)又称素数,有无限个。一个大于1的 自然数 ,除了1和它本身外,不能被其他自然数 整除 (除0以外)的数称之为素数(质数);否则称为 合数 。根据 算术基本定理 ,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。 素数环:   将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。 使用顺序表和顺序队列来解素数环问题: package com.clarck.datastructure.queue; import com.clarck.datastructure.linear.SeqList; /** * 求解素数环问题 * * @author clarck * */ public class PrimeRing { /** * 求1~n素数环 * * @param n */ public PrimeRing(int n) { // 创建一个顺序表存储素数环 SeqList<Integer> ring = new SeqList<Integer>(n); // 1添加到素数环中 ring.append(new Integer(1)); // 创建一个队列que SeqQueue<Integer>

Miller-Rabin质数测试

夙愿已清 提交于 2020-01-06 00:02:05
Miller-Rabin质数测试 本文主要讨论使用Miller-Rabin算法编写素数的判定算法,题目来源于 hihocoder 。 题目 题目要求 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 使用Miller-Rabin算法进行质数素数测试,要求输入一个数字,对其是否是素数进行判定,并打印出相对应的结果。 提示: Miller-Rabin质数测试 输入 第1行:1个正整数t,表示数字的个数, 10≤t≤50 第2..t+1行:每行1个正整数,第 i+1 行表示正整数 a[i] , 2≤a[i]≤10^18 输出 第1..t行:每行1个字符串,若a[i]为质数,第i行输出"Yes",否则输出"No" 样例输入 3 3 7 9 样例输出 Yes Yes No 题目分析 Miller-Rabin算法是一种基于费马小定理的扩展算法,首先我们需要知道什么是费马小定理,然后还要知道整个Miller-Rabin算法是如何扩展出来的。 费马小定理 费马小定理:对于质数 p 和任意整数 a ,有 a^p ≡ a(mod p)(同余) 。反之,若满足 a^p ≡ a(mod p) , p 也有很大概率为质数。 将两边同时约去一个 a ,则有 a^(p-1) ≡ 1(mod p) 也即是说:假设我们要测试 n 是否为质数。我们可以随机选取一个数 a ,然后计算 a^

数学@2019

元气小坏坏 提交于 2019-12-29 08:02:15
  年初,证明了<strong>指标定理</strong>,为数学和物理学作出杰出贡献的数学家<strong>迈克尔·阿蒂亚爵士</strong>与世长辞,享年 89 岁;3 月,数学领域的最高奖项之一——阿贝尔奖——授予了数学家<strong>凯伦·乌伦贝克</strong>,以表彰她在“几何偏微分方程、规范理论和可积系统的开创性贡献,以及她在分析、几何和数学物理领域的工作上的深远影响 ”,她也成为了首位获此殊荣的女性数学家。   数学的世界从来不乏这些伟大的头脑,更多年轻的数学家在前人的智慧成果之上,砥砺前行。2019 年即将结束,回望这一年,有些最基础的数学概念、数学方法被重新审视,有些最难的谜题因某些证明或新技术的出现而取得重大进展,还有一些已经存在很久的问题得到了彻底解决......   1   <strong>无理数</strong>是无法被写成分数的没有尽头的数。当我们需要用到一个无理数时,通常会四舍五入地取到它的某一位。比如π被近似为 3.14,也就是 157/50,但 22/7 实则是更贴近π的值。一系列有关于无理数的问题一直困扰着数学家,那就是:无理数究竟能被近似到多精确?是否存在一个精确性的极限?   对这些问题的探讨可以追溯到 19 世纪初,至今一直没有明确答案。1941 年,物理学家<strong>Richard Duffin</strong>和数学家

数学@2019

橙三吉。 提交于 2019-12-29 01:42:34
  年初,证明了<strong>指标定理</strong>,为数学和物理学作出杰出贡献的数学家<strong>迈克尔·阿蒂亚爵士</strong>与世长辞,享年 89 岁;3 月,数学领域的最高奖项之一——阿贝尔奖——授予了数学家<strong>凯伦·乌伦贝克</strong>,以表彰她在“几何偏微分方程、规范理论和可积系统的开创性贡献,以及她在分析、几何和数学物理领域的工作上的深远影响 ”,她也成为了首位获此殊荣的女性数学家。   数学的世界从来不乏这些伟大的头脑,更多年轻的数学家在前人的智慧成果之上,砥砺前行。2019 年即将结束,回望这一年,有些最基础的数学概念、数学方法被重新审视,有些最难的谜题因某些证明或新技术的出现而取得重大进展,还有一些已经存在很久的问题得到了彻底解决......   1   <strong>无理数</strong>是无法被写成分数的没有尽头的数。当我们需要用到一个无理数时,通常会四舍五入地取到它的某一位。比如π被近似为 3.14,也就是 157/50,但 22/7 实则是更贴近π的值。一系列有关于无理数的问题一直困扰着数学家,那就是:无理数究竟能被近似到多精确?是否存在一个精确性的极限?   对这些问题的探讨可以追溯到 19 世纪初,至今一直没有明确答案。1941 年,物理学家<strong>Richard Duffin</strong>和数学家

Miller-Rabin 素数测试

时间秒杀一切 提交于 2019-12-05 09:28:51
Miller-Rabin 素数测试 首先,总之,很玄学。 学过 费马小定理 \(a^{p-1}\equiv1\quad(mod\;p)\) 后,我们知道其逆定理不一定成立。 而对于 \(a^{p-1}\equiv1\quad(mod\;p)\) 成立但不是素数的 \(p\) ,称之为伪素数。 但是据统计(没错,就是暴力统计)后,我们发现对于每个 \(a\) ,伪素数个数大概都小于素数的 \(\frac 14\) 。即判错几率不很大。那么只要多测几组 \(a\) ,这个概率就超小了。这就是 \(Miller-Rabin\) 素数测试。 其实我看完一脸懵逼 总之测前 \(17\) 个数就很保险了, \(1e15\) 范围内都是正确的。 #include<cstdio> #include<algorithm> using namespace std; typedef int int_; #define int long long int n; int ksm(int x,int q,int p){ int ret=1; while(q>0){ if(q&1) ret=(ret*x)%p; x=(x*x)%p; q>>=1; } return ret; } bool check(int a,int x){ int m=ksm(a,x-1,x); if(m==1) return false;

素数筛

我是研究僧i 提交于 2019-12-05 09:25:29
素数筛 最基础的找素数的方式是从 \(2\) 到 \(x-1\) 全除一遍,后来变成除到 \(\sqrt{x}\) 就行辽(因为因数是成对出现的)。 既然判一个数要 \(O(n)\) 不如一边把小于 \(n\) 的数全判了。 就出现了筛法。 首先是埃筛(埃拉特斯托尼筛法)由于 素数唯一分解定理 ,我们只要记录下到目前数为止的质数,再把目前数的质数倍数标记为非素数。然而这还不是线性。一个数会筛其质因子个数次。 上面没什么用的,直接从这里开始也行。 最终出现了线性筛。 大体和埃筛相同,但是在标记非负数时,一旦目前数可以被记录的质数整除就跳到下一个质数。意思就是只会标记一个数小于最小质因子的质数倍数。 关于准确性: \[ \bf 对于一个数 \;\mit x\;\bf可表示为\;\mit s\times p_{min}\;\bf 即最小质因子的整数倍。\\ 如果我们要筛\;\mit s\times p_{min}\times p_x\quad (p_x>p_{min})\;\bf 就会和 \;\mit s\times p_{x}\times p_{min}\;\bf 筛重。 \] 其实就是 \(p\) 的乘的顺序不同但是都会被筛上,只要我们给其定一个排列规律,即为只会乘比现在最小质因子小的质数,就保证了 \(p\) 是从大到小排列的,一个序列只会出现一次。 这样所有的数就会且只会筛一次。