素数

python素数,获取100以内的孪生素数 孪生素数,查找100以内的孪生素数 3,5 5,7 1,13等都是孪生素数 解题思路 1、先获取,100以内的素数,并存储到列表中 2、将列表前后项比较,等于2的就打印出来 #获取100以内的素数,村存储到列表中 b = [] for i in range(2, 100): for a in range(2, i-1): if i % a == 0: ... 阅读详情

素数一直是个头疼的话题,不过最好还是克服一下。至少知道如何来进行处理。

求a^b

那种老掉牙的for循环就不要写了吧。

这里粘个高效的。

template<typename T>
T _exp(T a, T b)
{
	T odd = 1;
	while (b > 1)
	{
		if (b&1) odd *= a;
		a *= a;
		b >>= 1;
	}
	return a*odd;
}

求a^b%n

其实这两者有共性了。

template<typename T>
T _mod_exp(T a, T b, T n)
{
	T odd = 1;
	while (b)
	{
		if (b&1) odd = (odd * a) %n;
		a = (a*a)%n;
		b >>= 1;
	}
	return odd;
}

费马小定理

直接用维基百科上的东西:
费马小定理
是数论中的一个定理:假如a是一个整数,p是一个质数,那么

a^p \equiv a \pmod{p}

如果a不是p的倍数,这个定理也可以写成

a^{p-1} \equiv  1 \pmod{p}

这个书写方式更加常用。(符号的应用请参见同余。)

费马小定理的逆定理

这个小定理的逆定理是不成立的。但是可以用来筛选素数。

即认为满足

a^{p-1} \equiv  1 \pmod{p}
就是素数,当然a在这里可以取很多值。

但是也有一些数偏可以通过这些测试。

二次探测

若 p 为素数,且 0 < x < p,则方程 x * x = 1 ( mod p ) 的解为 x = 1, p - 1 ( mod p )。

事实上 x * x = 1 ( mod p ) 等价于 x * x - 1 = 0 ( mod p ),则 ( x - 1 )( x + 1 ) = 0 ( mod p )。故 p 须整除 x - 1 或 x + 1,由 p 为素数且 0 < x < p,推出 x = 1 ( mod p ) 或 x = p - 1 ( mod p )。

基于费马小定理的随机化测试

基实思想很简单,就取一个a值不行,那么就多取几个a值。直到行为止。ull表示typedef unsigned long long ull;

int _test_base(ull n)
{
	int ret2 = 1, ret3 = 1, ret5 = 1, ret7 = 1;
	int i = 0;
	ull a;
	if (!(n&1) || 0 == n % 3 || 0 == n % 5 || 0 == n % 7) return 0;
	for(i=1;i<8;i++)  //个人以为这里的8还可以取成20~50中的数。
	{ 
		a = 2 + rand()%(n-2);
		if (_mod_exp(a, n - 1, n) != 1) return 0;
	}
	return 1;
}

一般而言,毕竟这个随机化测试虽然概率很大,还是有漏网之鱼。

这里需要用到一个更强的版本

Miller-Rabin素数测试

定义:令 n - 1 = ( 2^s ) * d,其中 s 是非负整数,d 是正奇数。若 a^d =1 ( mod n ) 或 a^((2^r)*d) = -1 ( mod n ),0 <= r <= s - 1,则称 n 通过以 a 为基的 R-M 测试。

定理:若 n 为奇合数,则 n 通过以 a 为基的 R-M 测试的数目最多为 ( n - 1 ) / 4, 1 <= a <= n - 1

不多说了这里给出一个强化版的素数测试方法

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef unsigned long long ull;
 
ull _mod_exp(ull a, ull b, ull n)
{
	ull t = 1, y = a;
	while (b)
	{
		if (b&1) t = (t * y) % n;
		y = (y * y) % n;
		b >>= 1;
	}
	return t;
}
 
//1 for not primer.
int _is_not_primer(ull a, ull k, ull q, ull n)
{
	ull e = 1, i;
	if (1 == _mod_exp(a, q, n)) return 0;
	for (i = 0; i < k; ++i)
	{
		if (n-1 == _mod_exp(a, q*e, n)) return 0;
		e <<= 1;
	}
	return 1;
}
 
//1 for not primer
int _miller_robin_not_primer(ull n)
{
	ull k = 0, q = n - 1;
	if (2 == n || 3 == n || 5 == n || 7 == n) return 0;
	if (!(n&1) || 2 > n) return 1;
	while (!(q&1)) {q >>= 1; ++k;}
 
	if (n < 1373653)
	{
		if (_is_not_primer(2, k, q, n) 
			|| _is_not_primer(3, k, q, n))
			return 1;
	}
	else if (n < (ull)9080191)
	{
		if (_is_not_primer(31, k, q, n) 
			|| _is_not_primer(73, k, q, n))
			return 1;
	}
	else if (n < (ull)4759123141)
	{
		if (_is_not_primer(2, k, q, n) 
			|| _is_not_primer(3, k, q, n)
			|| _is_not_primer(5, k, q, n)
			|| _is_not_primer(11, k, q, n)
			)
			return 1;
	}
	else if (n < (ull)2152302898747)
	{
		if (_is_not_primer(2, k, q, n)
			||_is_not_primer(3, k, q, n)
			||_is_not_primer(5, k, q, n)
			||_is_not_primer(7, k, q, n)
			||_is_not_primer(11, k, q, n)
			)
			return 1;
	}
	else
	{
		if (_is_not_primer(2, k, q, n)
			||_is_not_primer(3, k, q, n)
			||_is_not_primer(5, k, q, n)
			||_is_not_primer(7, k, q, n)
			||_is_not_primer(11, k, q, n)
			||_is_not_primer(31, k, q, n)
			||_is_not_primer(61, k, q, n)
			||_is_not_primer(73, k, q, n)
			)
			return 1;
	}
	return 0;        
}
 
int prime(ull n)
{
	return _miller_robin_not_primer(n) == 0;
}
 
int main(void)
{
	ull n;
	while (scanf("%llu", &n) != EOF && n)
	{
		if (prime(n))
		{
			printf("YES\n");
		}
		else 
		{
			printf("NO\n");
		}
	}
	return 0;
}
值得说明的是,对不同范围的数,采用不同的a值就可以了。节省时间考虑。

通过下面的测试

http://acm.cs.ecnu.edu.cn/problem.php?problemid=1094

有用的链接

http://blog.youkuaiyun.com/hikaliv/article/details/4261948

最后版本的那个思想来自于优快云。我忘了是哪个的了~~声明一下是转的,但代码是我自己照着写的。谢过先。

高手的链接

http://wenku.baidu.com/view/7433bcd9ad51f01dc281f153.html

ENVI哨兵一号数据处理 使用ENVI+SarScape处理哨兵数据 阅读详情

相关推荐

EDF Browser使用说明和技巧

edf browser使用说明和一些小技巧

Erhu_666的博客 8326

robin-Miller判断素数算法

Robin-Miller 算法是一种用于快速判断一个正整数是否为素数的算法。 这个算法的基本思路是:对于给定的数 n,从 2 开始逐个枚举小于等于根号 n 的自然数 i,如果 n 能被 i 整除,则 n 不是素数;否则,如果所有的 i 都不能整除 n,则 n 是素数。 这个算法的时间复杂度为 O(√n),比较适合用于快速判断较小的数是否为素数。但是对于较大的数,这个算法的效率并不是很高,可能需要较...

weixin_35756637的博客 447

Power Automate实战:用SharePoint REST API批量处理列表数据(附JSON解析技巧)

本文深入探讨了如何利用Power Automate调用SharePoint REST API实现列表数据的批量自动化处理。文章详细解析了API的协同工作原理、高效的数据获取与筛选技巧,并重点分享了JSON数据解析的核心难点与实战解决方案,旨在帮助企业用户构建稳定可靠的数据处理流程,提升运营效率。

coffee的博客 769

Miller_Rabin素性测试

1. 为什么需要素性测试? 我们其实已经知道有一些判断素数的方法,比如: 遍历测试:待测试数n与2,3,...√n做除法判断余数是否为零,如果没有任何一个数可以整除n,则说明n为素数 Wilson定理:对于给定的正整数n,n是素数的充要条件为,则可以通过判断这个方程是否成立来判断n是否为素数 上面的方法都可以确定的判断出一个数是否为素数,但问题在于对于大整数,这两个算法都需要很大...

weixin_30500663的博客 284

知识图谱本体建模工具Protege使用教程

1.下载 先去官网下载:protégé 直接下最新版,点击会有注册页面,只填必填项的name和project description即可。 下载后解压即可使用。 2、安装可视化工具Graphviz 去官网:Download | Graphviz下载。下一个最新版的zip就行。 我解压在了Protege文件夹下,然后在 Preference下指定目录。 指定一下你解压完的Graphviz下的dot.exe,确定。 PS:如果这样报错就尝试在环境变量的系统变量的...

子麒的博客 2万+

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程 1.NVIDIA驱动检测及安装 2.Anaconda的安装 3.安装cuda、cudnn、pytorch 4.其他报错

aaaccc444的博客 2424

python代码 素数集合 回文素数,反素数,梅森素数,双素数

回文素数是指一个数既是素数也是回文数。例如:131既是素数也是回文数。编写程序显示钱100个回文素数。每行显示10个素数,并且能准确对齐 import math def is_palindrome(number): number_list = [] number_repeat = number while True: number_list.append(number_repeat % 10) i...

qq_44639286的博客 1万+

SOC-ATF 安全启动BL2流程分析(2)

Bl2的启动流程与bl1类似,主要区别是bl2的初始化流程比bl1更简单,但其可能需要加载更多的镜像,如bl31、bl32和bl33。由于bl2可以运行于el3或s-el1,它们的入口函数和处理流程都有所区别,为了简化分析我们选取比较常见的s-el1方式,以下为其总体执行流程:上图仅供参考,实际看一下代码结构:上面截图展示了 链接汇编文件,bl2_el3.ld.S 是指bl2 运行于el3;bl2.ld.S 是实现bl2运行于s-el1 .

z20230508的博客 1388

素数与素数筛

由于费马小定理的逆定理并不正确,对于卡迈克尔数即满足费马小定理的逆定理但是不为素数的数,虽然卡迈克尔数很少,在1~100000000范围内的整数中,只有255个卡迈克尔数,但是已经使他的效果落后于Miller-Rabin和Solovay-Strassen素性检验。欧拉筛(Euler's Sieve),也称为改进的埃拉托斯特尼筛法(埃式筛),是一种优化过的素数筛法,用于找出一定范围内的所有素数。例如i=5,2*5,3*5,4*5已经在前面i=2,3,4,5的时候筛选过了。第1个检查的是2,他说第一个素数;

a111737289291的博客 1515

secureCRT 破解方法

3、输入注册信息打开keygen.exe,点击path,选择SecureCRT的安装目录(例如D:\VanDykeSoftware\Clients)的securecrt.exe打开,继续下一步打开LicenseHelper.exe,如下。1、注册SecureCRT9.1打开keygen.exe,出现以下问题(没有关掉安全防护,一双击打开,Windows会自动识别keygen.exe为bingdu并删除)打开桌面SecureCRT,此界面不输入内容,直接点击下一步。2、存储配置文件夹(可以默认安装)

逆水行舟 1万+

6、核函数与再生核希尔伯特空间:原理、应用与实践

本文系统介绍了核函数与再生核希尔伯特空间(RKHS)的理论基础、核心性质及其在机器学习和信号处理中的广泛应用。文章从核方法的优势出发,阐述了其在非线性建模、正则化和算法核化方面的独特价值,并深入探讨了正定核、Mercer定理、表示定理等关键理论。通过构建多种标准核与工程专用核,展示了核函数的设计灵活性。结合支持向量回归(SVR)模型与多个MATLAB示例,详细说明了核方法的实际应用流程与操作技巧。最后,总结了核方法的应用领域、未来发展方向及学习实践建议,为读者提供了一套完整的理论与实践指南。

z2a3b4c5d的博客 144

判断可逆素数

可逆素数 首先要知道什么是可逆素数 素数:在大于1的自然数中,除了1和它自身以外,不能被其他自然数整除的数。 可逆素数:将一个素数的各个位置的数字倒置过来构成的反序数仍是素数,则该数为可逆素数。 以下为代码实现(C语言): #include <stdio.h> int pd(int x){//判断是否为可逆素数 int i,y=0,flag=0; if(x<2) print...

pcuu 1万+

C++ 小游戏程序 (共七款)

C++编程小游戏_闪耀的天狼星的博客-优快云博客_游戏c++C++跑酷小游戏_闪耀的天狼星的博客-优快云博客。好玩的c++编程小游戏,共六款。代码】C++跑酷小游戏。

小天狼星_布莱克 的博客 3万+

[数学] 孪生素数

如果n和n2都是素数,称它们是孪生素数。输入整数m,输出两个均不超过m的最大孪生素数。

m0_64542522的博客 2298

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

素数个数求解与素数的判定

1.素数 质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。 2.素数的基本定理 定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子 定理2:如果n不是素数,则n至少有一个(1, sqrt(n) ]范围内的素数因子 定理3:定义f(n)为不大于n的素数的个数,则 ...

weixin_43258754的博客 7239

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

素数判定和素数筛

素数(Prime number)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的数。素数的判定是数论中的一个重要问题。本文将回顾常用素数判定方法以及两种经典的素数筛法即埃拉托斯特尼(埃氏筛)和欧拉筛。

Reaearcher-Du 1247

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

1000以内的超级素数

求出1000以内的超级素数,超级素数就是一个数单拿第一位看是素数,拿一二位也是素数,。。。,把所有位都拿出来还是素数,例如233,2是素数,23是素数,233也是素数,所以就是我们要找的。 首先明白素数的定义:素数又称质数,定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。 根据“超级素数”的定义,容易看出, 1)10 以内的素数 2、3、5、7 都是超级素数; 2)11、13、17、1...

巴啦啦能量 7813

【C语言之素数全家桶】判断一个数是否为素数;求100以内的所有素数;输入一个整数n,求出小于或等于n的所有素数;求绝对素数

文章目录1. 判断一个数是否为素数2. 求100以内的所有素数3. 输入一个整数n,求出小于或等于n的所有素数4. 求绝对素数 1. 判断一个数是否为素数 素数概念:素数也称为质数,是一个大于1的自然数,且除了1和它本身外,不能被其他自然数整除。 如:2、3、5、7、11、13、17等 代码实现如下: #include<stdio.h> void main() { int n,i,flag=1;//默认flag=1是素数 scanf("%d",&n); for(i=2;i&l

将冲破艾迪i的博客 6346

素数对

描述 两个相差为2的素数称为素数对,如5和7,17和19等,本题目要求找出所有两个数均不大于n的素数对。 输入 一个正整数n。1 <= n <= 10000。 输出 所有小于等于n的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出empty。 样例输入 100 样例输出 3 5 5 7 11 13 17 19 29 31 41 43 59 61 71 73 我...

lzx's blog 3591

【C刷题记录】素数:判断、求和、双素数、筛法求素数

题目内容: 从键盘任意输入一个正整数,编程判断它是否是素数,若是素数,输出“Yes!”,否则输出“No!”。已知负数、0和1都不是素数。请找出下面程序的错误并改正之,同时按照给出的运行示例检查修改后的程序。 #include <stdio.h> #include <math.h> int main() { int n, i; printf("...

Crumble 2453

素数:素数判断、找素数、计算素数和、素数求和

素数求和 题目 问题描述   输入一个自然数n,求小于等于n的素数之和 样例输入 2 样例输出 2 数据规模和约定   测试样例保证 2 <= n <= 2,000,000 计算素数和 题目 问题描述   完成一个程序,该程序计算n以内(包含n)的所有素数之和并返回。注意,提交完整的程序代码。 输入格式   输入一个整数 n; 输出格式   输出n以前所有素...

Claire的博客 762

【小组专题四点五:素数】素数的分布,素数定理,素数猜想与兰道问题

3.2 素数的分布与猜想 π(x)\pi(x)π(x) 的近似估计函数 1798年,法国数学家勒让德通过 Jurij    VegaJurij\;\;VegaJurijVega 计算到400031的素数表 得到了 π(x)≈xlog⁡x−1.08366\pi(x)\approx \frac{x}{\log x-1.08366}π(x)≈logx−1.08366x​ 高斯猜测 π(x)\pi(x)π(x) 的增长速率和下面的函数是相同的: xlog⁡x\frac{x}{\log x}logxx​

溢流眼泪的博客 1736

反素数(反转拼写的素数)

是指一个非回文素数,将其反转后也是一个素数。例如:17是一个素数,而71也是一个素数,所以17和71是反素数。编写程序,显示前100个反素数。每行10个,并且数字间用空格隔开,如下所示: 13 17 31 37 71 73 79 97 107 113 149 157 167 179 199 311 337 347 359 389 … package 学习; import java.util.*; public class study { //返回数字倒序,如345返回543 publi

Yunshangxiaohai的博客 4258

素数系列——反素数

Emirp Time Limit: 5000 MS Memory Limit: 100000 K Total Submit: 147(60 users) Total Accepted: 61(55 users) Rating: Special Judge: No Description An

OPM的博客 4482

两个整数之间的所有素数,素数个数,素数和

输入两个整数m和n(2<=m<n),输出从m到n之间的:所有素数、素数的个数、素数之和。 示例输入 2 100 示例输出 2 100 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 25 1060 运行效果: 代码: #include<iostream> using namespace std; int main() { int m, n, num = 0,sum=0, flag; c

qq_46541463的博客 7180

计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数

我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。 现在,给定两个整数n和m,0 注意,是第n个素数到第m个素数之间的所有的素数,并不是n和m之间的所有的素数。 输入格式: 两个整数,第一个表示n,第二个表示m。 输出格式: 一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。

dakaszeng的博客 4225
上一篇: ACM 算法艺术与信息学竞赛 1.2.7 超长数字串
下一篇: POJ 1009题解
ju136
博客等级 码龄19年 95粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值